在 Debian 系统中,ulimit 用于控制 shell 及其启动进程的资源限制(如打开文件数、进程数、内存等)。当系统出现“Too many open files”“Cannot fork”“Out of memory”等问题时,通常需要排查 ulimit 配置。
下面按排查思路 + 常用命令 + 典型场景来说明。
ulimit -a
常见关注项:
-n:打开文件描述符数(open files)-u:最大用户进程数(max user processes)-v:虚拟内存-s:栈大小cat /proc/<PID>/limits
例如:
cat /proc/$(pidof nginx)/limits
Debian 中 ulimit 可能来自以下几个地方:
/etc/security/limits.confcat /etc/security/limits.conf
示例:
* soft nofile 1024
* hard nofile 65535
www-data soft nproc 4096
⚠️ 注意:
systemd 服务不一定生效/etc/security/limits.d/*.confls /etc/security/limits.d/
cat /etc/security/limits.d/*.conf
如果是服务(如 nginx、mysql、docker):
systemctl show <service> | grep Limit
例如:
systemctl show nginx | grep LimitNOFILE
修改方式:
[Service]
LimitNOFILE=65535
LimitNPROC=4096
然后:
systemctl daemon-reload
systemctl restart nginx
现象
java.net.SocketException: Too many open files
排查
ulimit -n
cat /proc/<PID>/limits | grep "open files"
解决
ulimit -n 65535
* soft nofile 65535
* hard nofile 65535
LimitNOFILE=65535
现象
bash: fork: retry: Resource temporarily unavailable
排查
ulimit -u
cat /proc/<PID>/limits | grep "processes"
解决
* soft nproc 4096
* hard nproc 4096
原因
su 而非 login验证是否走 PAM
grep pam_limits /etc/pam.d/*
docker exec <container> ulimit -n
docker run --ulimit nofile=65535:65535 nginx
或 docker-compose:
ulimits:
nofile:
soft: 65535
hard: 65535
✅ 当前 shell:ulimit -a
✅ 进程限制:/proc/PID/limits
✅ 用户配置:limits.conf + limits.d
✅ 服务配置:systemctl show
✅ 容器环境:docker ulimit
如果你愿意,可以告诉我:
我可以帮你精确到某一种故障给出配置示例。