当前用户进程数上限由 ulimit -u 查看,受软硬限制约束;内核全局 PID 上限由 /proc/sys/kernel/pid_max 决定;PAM limits 和 systemd 的 LimitNPROC 也会叠加生效,需逐层排查。

怎么查当前用户能起多少进程
直接运行 ulimit -a,重点看 max user processes (-u) 这一项——它表示当前 shell 会话下,该用户最多能启动多少个进程(含线程)。这个值不是系统总上限,只管“你这个账号”。
- 普通用户只能调低它,不能超过硬限制(
ulimit -H -u查) - 软限制生效快,但重启终端就丢;硬限制必须 root 才能改
- 如果看到是
4096或3894,说明没动过默认值,常见于 CentOS 7 / Ubuntu 默认配置
怎么查内核允许的最大 PID 数
用户限制再高,也跨不过内核这道坎。/proc/sys/kernel/pid_max 决定了整个系统理论上最多能分配多少个进程 ID,也就是全局进程数量天花板。
- 查看命令:
cat /proc/sys/kernel/pid_max - 32 位系统默认常为
32768,64 位系统默认多是131072或32768(取决于发行版) - 临时调高:
sudo sysctl -w kernel.pid_max=196608 - 永久生效要写进
/etc/sysctl.conf并执行sudo sysctl -p
为什么改了 limits.conf 还不生效
这是最常踩的坑:改完 /etc/security/limits.d/20-nproc.conf 或 /etc/security/limits.conf,ulimit -u 依然没变。
- 必须重新登录(不是新开终端!),SSH 要断开重连,或用
su - $USER切换用户 - 确认
/etc/pam.d/common-session里有这行:session required pam_limits.so(主流发行版默认有,但精简镜像可能被删) - 别漏掉
root用户的特殊性:很多系统对root单独设了hard nproc unlimited,普通用户则受限
要不要把进程数设成 unlimited
可以设,但不建议无条件设 unlimited,尤其在线上服务机上。
-
unlimited容易掩盖 fork bomb 类问题,一个失控脚本就能拖垮整机 - 真正需要高并发的应用(如 Java 大堆 + 多线程、Node.js cluster、高连接数代理),设到
65535或131072已足够 - 配合
systemd服务时,还要额外检查LimitNPROC=设置(在.service文件里),它会覆盖 PAM limits
真正卡住你的,往往不是单个配置项,而是用户限制、内核限制、systemd 服务限制三层叠加后的最小值。查的时候一层层剥,别只盯着 ulimit -u 看。










