最直接有效的方式是用ulimit -u限制单用户最大进程数,需软硬限制配齐、PAM模块pam_limits.so加载到位、配置写入/etc/security/limits.conf且重新登录生效。

最直接有效的方式是用 ulimit -u 设置单用户最大进程数(含线程),配合 /etc/security/limits.conf 持久化,并确保 PAM 模块加载到位——三者缺一不可。
临时限制:快速验证是否生效
适用于调试、测试或紧急干预,仅对当前终端会话及其子进程有效:
- 运行
ulimit -u 500,即限制当前用户最多运行 500 个进程/线程 - 测试是否起作用:执行
(){ :|:& };:(fork 炸弹)或seq 1 600 | xargs -P 600 sleep 0.01 & - 一旦超限,会立即报错:
bash: fork: Resource temporarily unavailable - 注意:该设置不继承到新登录会话,关闭终端即失效;root 默认不受限,如需模拟普通用户,可用
sudo -u username bash -c 'ulimit -u'
永久限制:配置 limits.conf 并启用 PAM
这是生产环境必须完成的加固步骤,否则配置无效:
- 编辑 /etc/security/limits.conf,添加两行(soft 和 hard 必须都写):
alice soft nproc 1024alice hard nproc 2048 - 若要对所有普通用户设兜底限制,可用:
* soft nproc 1024* hard nproc 2048
(慎用*,避免误限系统服务账户如syslog、dbus) - 确认 PAM 模块已启用:检查 /etc/pam.d/sshd 或 /etc/pam.d/common-session 中存在
session required pam_limits.so - 保存后,用户需重新登录(不是
source或新开终端),再执行ulimit -u验证数值
特别注意 systemd 服务和容器环境
systemd 启动的服务默认不读 limits.conf,容器中 ulimit 更是完全无效:
- 对于 systemd 服务(如
myapp.service),需在 [Service] 段显式添加:LimitNPROC=2048 - 全局生效可改 /etc/systemd/system.conf:
DefaultLimitNPROC=2048,然后运行systemctl daemon-reload - Docker/Podman 容器应使用 cgroup 机制:
Docker:--pids-limit=2048
Podman:--pids-limit=2048
别漏掉内核级上限 pid_max
即使用户限制调高了,若内核 PID 池太小,仍会报 fork: Cannot allocate memory:
- 查看当前值:
cat /proc/sys/kernel/pid_max(x86_64 默认常为 32768) - 临时调整:
sysctl -w kernel.pid_max=4194304 - 永久生效:在 /etc/sysctl.conf 中添加
kernel.pid_max = 4194304,再运行sysctl -p - 注意:pid_max 是全系统总 PID 上限,所有用户加起来不能超过它


















