最直接有效的方法是用 ulimit -u 设置单个用户的最大进程数(含线程),但必须软硬限制配齐、PAM 模块启用、配置位置正确——三者缺一不可,否则限制不生效。

最直接有效的方法是用 ulimit -u 设置单个用户的最大进程数(含线程),但必须软硬限制配齐、PAM 模块启用、配置位置正确——三者缺一不可,否则限制不生效。
临时限制:快速验证是否起作用
适合测试或紧急干预,仅对当前终端会话有效:
- 运行
ulimit -u 200,立即把当前用户进程上限设为 200 - 再执行简单 fork 炸弹:
(){ :|:& };:,几秒内就会因无法创建新进程而停止 - 若看到
bash: fork: Resource temporarily unavailable,说明限制已触发 - 注意:该设置不会继承到新登录会话,登出或新开 SSH 就失效;root 用户默认不受限,需用
sudo -u username ulimit -u 100模拟目标用户环境
永久限制:写入 limits.conf 并确保软硬双设
生产环境必须配置,否则重启后即失效:
- 编辑
/etc/security/limits.conf,添加两行(不能只写一行):alice soft nproc 300alice hard nproc 300 - 如需对组生效,可用
@developers hard nproc 500;慎用*通配符,避免误限 syslog、dbus 等系统账户 - 改完必须重新登录才生效,可用
su - alice切换后执行ulimit -u确认数值
PAM 是前提:没有它 limits.conf 形同虚设
检查并确保 PAM 加载了 pam_limits.so:
- 运行
grep pam_limits.so /etc/pam.d/{sshd,login,su,system-auth},确认至少在sshd或system-auth中存在 - 若缺失,在
/etc/pam.d/sshd(SSH 登录)或/etc/pam.d/system-auth(通用)末尾添加:session required pam_limits.so - 路径注意区分:CentOS/RHEL 用
/lib64/security/pam_limits.so,Debian/Ubuntu 用/lib/x86_64-linux-gnu/security/pam_limits.so - 修改后无需重启 sshd,新连接即按新规则加载
别漏掉系统级和 systemd 层面的限制
仅改 limits.conf 不够,高并发场景下仍可能失败:
-
/proc/sys/kernel/pid_max是内核可分配 PID 的总数,若设太小(如默认 32768),即使ulimit -u设到 65535,也会因 PID 耗尽报错;临时调大:sysctl -w kernel.pid_max=4194304,永久写入/etc/sysctl.conf - systemd 托管的服务不读
limits.conf,必须在 service 文件中显式加:[Service]<br> LimitNPROC=300
改完运行systemctl daemon-reload && systemctl restart your-service - 容器环境(Docker/Podman)中
ulimit无效,应使用--pids-limit参数











