nproc是linux中对每个real user id创建的轻量级进程(lwp/线程)总数的限制;统计时必须用ps -lf而非ps -u,因线程也计入限额,且需通过ulimit -u比对是否接近上限。

统计某个用户创建的进程数,关键在于区分“进程”和“线程”——Linux 中 nproc 限制的是 real user ID 下所有轻量级进程(LWP,即线程)的总数,而不仅仅是传统意义上的“进程”。所以只用 ps -u username 会严重低估,必须包含线程维度。
用 ps -Lf 统计用户级线程总数(推荐)
这是最直接、通用的方法,适用于绝大多数场景:
-
ps -u <username> -Lf | wc -l</username>:列出该用户所有进程及其线程(-L启用线程视图,-f输出完整格式),再计行数 - 注意:结果包含表头行,若需精确值,可加
grep -v "UID"或改用ps -h -u <username> -Lf | wc -l</username>(-h去掉标题) - 例如统计用户
produser的总线程数:ps -h -u produser -Lf | wc -l
按用户分组统计并排序(适合批量查看)
快速对比多个用户的资源占用强度:
-
ps -eLo user= | sort | uniq -c | sort -n:统计所有用户当前的 LWP 总数,升序排列 - 输出形如:
1 chrony<br>1 dbus<br>5 nginx<br>1071 root
- 该方法不依赖具体用户名,适合巡检或脚本化监控
验证是否接近 nproc 限制值
当应用报错 java.lang.OutOfMemoryError: unable to create new native thread 或 Cannot create GC thread 时,需确认是否触达上限:
- 查当前用户的
nproc限制:ulimit -u(当前 shell 会话)或cat /etc/security/limits.d/*.conf | grep nproc - 查系统级默认限制:
cat /proc/sys/kernel/nr_threads(系统最大线程数)和/proc/sys/kernel/threads-max - 若
ps -h -u xxx -Lf | wc -l接近或等于ulimit -u值,就极可能是 nproc 瓶颈
补充:单个进程的线程数怎么查?
定位高线程消耗进程时很有用:
- 查 PID=12345 的线程数:
cat /proc/12345/status 2>/dev/null | grep Threads→ 显示Threads: 42 - 或:
ls /proc/12345/task/ 2>/dev/null | wc -l - 配合查找:
ps -eo pid,user,comm,%cpu,%mem --sort=-%cpu | head -10先看 CPU 高的进程,再查其线程数











