Linux限制单个用户最大进程数需同时配置ulimit -u(用户级软/硬限制)、kernel.pid_max(系统PID上限)和kernel.threads-max(全局线程上限)三层,缺一不可;临时设置用ulimit命令,永久生效需在limits.d下配nproc、PAM加载pam_limits.so,并为systemd服务单独设LimitNPROC。

Linux 中限制单个用户能创建的最大进程数,核心是控制该用户的 nproc(number of processes)限制,它同时约束进程和线程数量(因 Linux 线程也占用 PID)。这个限制分两层:用户级软/硬限制(ulimit -u),以及系统级上限(kernel.pid_max)。要真正生效,必须确保用户级限制不被系统级兜底卡住,且配置被正确加载。
用 ulimit 临时设置(仅当前会话)
适合调试或快速验证,退出终端即失效:
- 查看当前值:
ulimit -u - 设软限制(普通用户可调低,但不能超硬限):
ulimit -S -u 4096 - 设硬限制(仅 root 可调高):
ulimit -H -u 8192
通过 limits.conf 永久配置(推荐用于登录用户)
适用于 SSH、图形界面、su - 等 PAM 登录方式,需重启会话才生效:
- 编辑
/etc/security/limits.d/20-nproc.conf(比直接改 limits.conf 更安全) - 添加两行(必须分开写,
*不匹配 root):appuser soft nproc 4096appuser hard nproc 8192 - 若要对所有普通用户生效,再加:
* soft nproc 4096* hard nproc 8192 - 确保
/etc/pam.d/common-session包含:session required pam_limits.so
针对 systemd 启动的服务单独限制
systemd 服务完全不读 limits.conf,必须在 service 文件里显式声明:
- 编辑服务单元文件,例如
/etc/systemd/system/myapp.service - 在
[Service]段下添加:LimitNPROC=4096 - 如果服务以非 root 用户运行(如
User=appuser),该限制就作用于该用户 - 生效命令:
sudo systemctl daemon-reload && sudo systemctl restart myapp
检查并确认三层限制都到位
漏掉任意一层都可能让限制失效:
- 用户级:
ulimit -u(登录后执行) - 系统级 PID 上限:
cat /proc/sys/kernel/pid_max,建议 ≥ 所有用户硬限制之和 - 全局线程上限:
cat /proc/sys/kernel/threads-max,应 ≥ pid_max,否则线程创建会失败


















