在 Debian 上排查 ulimit 相关问题,通常要从**“当前会话限制、进程实际限制、系统级配置、PAM/系统服务配置”**几个层面逐步定位。下面给你一套实用排查思路。
ulimit -a
重点关注:
open files (-n)max user processes (-u)stack sizememoryulimit -n
ulimit -u
ulimit -Sn # soft
ulimit -Hn # hard
ulimit 是进程级的, shell 里看到的不一定等于程序实际用的。
cat /proc/<PID>/limits
例如:
cat /proc/1234/limits
可以看到:
如果是服务(nginx / java / docker),一定要看这个,而不是 shell 的 ulimit
/etc/security/limits.confcat /etc/security/limits.conf
示例:
* soft nofile 65535
* hard nofile 65535
www-data soft nproc 4096
⚠ 注意:
systemd 直接启动的服务 不一定生效/etc/security/limits.d/*.confls /etc/security/limits.d/
cat /etc/security/limits.d/*.conf
Debian 经常在这里覆盖默认配置。
systemctl show <service> | grep Limit
例如:
systemctl show nginx | grep LimitNOFILE
编辑服务:
systemctl edit nginx
加入:
[Service]
LimitNOFILE=65535
LimitNPROC=4096
然后:
systemctl daemon-reload
systemctl restart nginx
cat /proc/sys/fs/file-max
临时修改:
sysctl -w fs.file-max=1000000
永久:
/etc/sysctl.conf
fs.file-max = 1000000
cat /proc/sys/kernel/pid_max
确认:
grep pam_limits /etc/pam.d/common-session
grep pam_limits /etc/pam.d/common-session-noninteractive
应有:
session required pam_limits.so
否则 limits.conf 不生效。
| 现象 | 可能原因 |
|---|---|
| SSH 登录生效,服务不生效 | systemd 未配置 |
| root 正常,普通用户不行 | limits.conf 用户不匹配 |
| 重启后又恢复 | 改错文件 / systemd 覆盖 |
| docker 内限制异常 | 宿主机 + docker daemon 限制 |
程序报 too many open files |
nofile 太小 |
ulimit -acat /proc/<PID>/limitscat /etc/security/limits.confsystemctl show <service> | grep Limitsysctl fs.file-max如果你愿意,可以告诉我:
too many open files)我可以直接帮你给一套针对性配置。