在 Debian(以及大多数 Linux 发行版)里,**ulimit 的“优先级/生效顺序”**本质上是由 PAM + shell + 进程继承 + 系统限制 共同决定的。下面按“从早到晚、从底层到上层”的顺序说明。
fs.nr_open、kernel.pid_max 等)sysctl -a | grep fs
✅ 优先级最低,但不可突破
/etc/security/limits.conf(PAM 限制)路径:
/etc/security/limits.conf
/etc/security/limits.d/*.conf
示例:
* soft nofile 1024
* hard nofile 65535
www-data hard nproc 512
生效条件:
session required pam_limits.so
查看是否生效:
cat /proc/<pid>/limits
✅ 对“登录用户”优先级高于 shell 默认值
/etc/security/limits.d/*.conf✅ 比 limits.conf 更灵活,常用于包管理
例如:
~/.bashrc
~/.profile
/etc/profile
/etc/bash.bashrc
示例:
ulimit -n 2048
特点:
✅ 优先级低于 PAM hard limit
Debian 默认用 systemd:
[Service]
LimitNOFILE=65535
LimitNPROC=4096
或:
systemctl edit nginx
✅ systemd 服务完全不读 limits.conf ✅ 优先级高于 shell ulimit
✅ 运行时最终生效值
硬限制(hard) > 软限制(soft)
总体顺序(从高到低控制能力):
内核限制
↑
systemd / setrlimit
↑
PAM (hard limit)
↑
PAM (soft limit)
↑
shell ulimit
# 查看某进程最终限制
cat /proc/$(pidof nginx)/limits
# 查看当前 shell
ulimit -a
# 查看 PAM 是否启用
grep pam_limits /etc/pam.d/common-session
❌ ssh 登录不生效
→ 检查 /etc/pam.d/sshd 是否有 pam_limits.so
❌ systemd 服务不读 limits.conf
→ 必须用 LimitXXX=
❌ docker 容器限制不生效
→ 宿主机 + 容器双层限制
如果你愿意,可以告诉我:
我可以给你精确配置示例。