必须同步调整用户级限制(ulimit -u)和内核级pid上限(pid_max),否则高并发下仍报resource temporarily unavailable;1. 用户级:通过limits.conf或systemd的limitnproc配置;2. 内核级:修改/proc/sys/kernel/pid_max并持久化。

Linux 修改系统最大用户进程数,不能只改一个地方——必须同步调整用户级限制(ulimit -u)和内核级 PID 上限(pid_max),否则高并发场景下仍会报 Resource temporarily unavailable 或 unable to create new native thread。
1. 用户级限制:ulimit -u(控制单个用户能起多少进程/线程)
Linux 中线程也占用 PID,ulimit -u 限制的是“该用户所有进程 + 线程总数”,不是纯进程数。默认值常为 4096,Java、Node.js、CI 构建等多线程应用很容易打满。
- 临时生效(仅当前 shell 及子进程):
ulimit -S -u 65535 && ulimit -H -u 65535(需 root) - 永久生效:编辑
/etc/security/limits.conf,添加两行(注意用空格或 tab 分隔,不能混用):* soft nproc 65535* hard nproc 65535
若服务以root启动,还需加:root soft nproc 65535root hard nproc 65535 - 确认 PAM 加载:检查
/etc/pam.d/common-session和/etc/pam.d/common-session-noninteractive是否含session required pam_limits.so
2. systemd 服务要单独配 LimitNPROC
/etc/security/limits.conf 对 systemd 启动的服务完全无效——它不读这个文件。
- 单服务配置:编辑
/etc/systemd/system/your-service.service,在[Service]段加:LimitNPROC=65535 - 全局配置(慎用):在
/etc/systemd/system.conf中设:DefaultLimitNPROC=65535 - 改完必须执行:
sudo systemctl daemon-reload && sudo systemctl restart your-service
3. 内核级兜底:pid_max(系统总 PID 数上限)
即使 ulimit -u 设到 65535,若 /proc/sys/kernel/pid_max 还卡在默认 32768,内核就分不出 PID,照样 fork 失败。
- 查看当前值:
cat /proc/sys/kernel/pid_max - 临时生效:
sudo sysctl -w kernel.pid_max=4194304 - 永久生效:在
/etc/sysctl.conf追加一行:kernel.pid_max = 4194304,再运行sudo sysctl -p
4. 验证是否真正生效
别只信配置文件,要查实际运行时的值:
- 登录目标用户后运行:
ulimit -u - 查某进程真实限制:
prlimit -n $PID | grep "MAX PROCESSES" - 查系统 PID 总量上限:
cat /proc/sys/kernel/pid_max - 观察线程总数:
ps -eLf | wc -l(接近 ulimit -u 值即说明快打满)











