在 Debian 系统中,ulimit 用于限制用户进程可用的系统资源(如文件描述符、栈大小、内存等)。诊断 ulimit 问题,通常从查看当前限制、确认配置来源、定位生效范围三个方面入手。
下面是一套实用的诊断方法。
ulimit -a
常见输出示例:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 1024
max user processes (-u) 31235
virtual memory (kbytes, -v) unlimited
ulimit -n # 打开文件数
ulimit -u # 最大进程数
ulimit -s # 栈大小
注意:
ulimit显示的是当前 shell 及其子进程的限制。
ulimit -Sn # soft
ulimit -Hn # hard
诊断时若发现值异常,先确认是 soft 还是 hard 被限制。
/etc/security/limits.confcat /etc/security/limits.conf
示例:
* soft nofile 65535
* hard nofile 65535
/etc/security/limits.d/*.confDebian 会加载该目录下的配置,优先级高于 limits.conf:
ls /etc/security/limits.d/
cat /etc/security/limits.d/*.conf
Debian 9+ 默认使用 systemd,很多服务不读 limits.conf。
查看某服务的限制:
systemctl show nginx | grep -i limit
常见字段:
LimitNOFILE=
LimitNPROC=
修改方式(示例):
# /etc/systemd/system/nginx.service.d/limits.conf
[Service]
LimitNOFILE=65535
然后:
systemctl daemon-reload
systemctl restart nginx
cat /proc/<PID>/limits
示例:
cat /proc/1234/limits
这是最准确的诊断方式,能确认配置是否真正生效。
bash -c 'ulimit -n'
sudo -u www-data bash -c 'ulimit -n'
ulimit -n
cat /proc/<PID>/limits | grep "Max open files"
→ 检查 limits.conf / systemd 配置
su 可能不加载 PAMsudo 默认会重置环境解决:
sudo -i
或检查:
cat /etc/pam.d/su
cat /etc/pam.d/sudo
确认包含:
session required pam_limits.so
容器内的 ulimit 受宿主机和 docker 启动参数影响:
docker run --ulimit nofile=65535:65535 ...
ulimit -a
cat /etc/security/limits.conf
ls /etc/security/limits.d/
systemctl show <service> | grep Limit
cat /proc/$(pgrep -o nginx)/limits
如果你愿意,可以告诉我:
cat /etc/debian_version)我可以帮你定位具体是哪一层配置没生效。