Linux系统最大进程数由用户级ulimit -u、系统级pid_max、内核级threads-max三层限制共同决定,三者最小值即为实际瓶颈;需依次排查定位并分别调整配置。

Linux 系统最大进程数不是单点配置,而是由三层限制共同决定:用户级(ulimit -u)、系统级 PID 池上限(/proc/sys/kernel/pid_max)、内核总线程容量(/proc/sys/kernel/threads-max)。三者中最小值即为实际瓶颈,漏调任一,高并发服务仍会报 fork: Cannot allocate memory 或 Java 的 unable to create new native thread。
查清当前卡在哪一层
先定位真实瓶颈,再针对性调整:
- 用户级限制:
ulimit -u(当前 shell 下该用户最多能拥有的进程+线程总数) - 系统 PID 上限:
cat /proc/sys/kernel/pid_max(全局可分配 PID 的最大数量) - 内核线程容量:
cat /proc/sys/kernel/threads-max(受内存和 pid_max 共同约束) - 当前已用线程数:
ps -eLf | wc -l
永久修改用户级进程/线程总数(ulimit -u)
这是最常见生效点,因 Linux 中线程也占 PID:
- 编辑
/etc/security/limits.d/90-nproc.conf(推荐独立文件,避免污染主配置),写入:
* hard nproc 65535
root soft nproc 65535
root hard nproc 65535
- 确保 PAM 加载:检查
/etc/pam.d/common-session和/etc/pam.d/common-session-noninteractive中含session required pam_limits.so - 普通用户需重新登录(SSH 重连);
su -可触发重载,但source或重启 sshd 无效
调整 systemd 服务的进程数限制
systemd 启动的服务(如 nginx、Java 应用)完全不读 limits.conf,必须显式配置:
- 单服务生效(更安全):
sudo systemctl edit your-service.service,添加:
LimitNPROC=65535
- 全局生效(慎用):
sudo systemctl edit --full systemd-system.conf,加入:
- 改完必须执行:
sudo systemctl daemon-reload && sudo systemctl restart your-service - 验证:
prlimit -n $(pgrep -f "your-service" | head -1)查实际值
同步调大内核级上限(pid_max 和 threads-max)
若 ulimit -u 已放开,但仍 fork 失败或线程数上不去,说明内核池子不够:
-
pid_max:临时设为 2097152:
sudo sysctl -w kernel.pid_max=2097152;永久生效,在/etc/sysctl.d/99-pidmax.conf写入kernel.pid_max = 2097152,再运行sudo sysctl --system -
threads-max:不能超过 pid_max,建议设为 pid_max 的 60%~80%,例如:
kernel.threads-max = 131072,同样写入/etc/sysctl.d/99-thread-limit.conf并执行sudo sysctl --system - RHEL/CentOS 7+ 还需
sudo systemctl restart systemd-sysctl


















