在 Debian(以及大多数 Linux 发行版)上,重启后 ulimit 失效是非常常见的现象,原因通常不是“设置错了”,而是设置的位置或方式不对。下面按「原因 → 解决方案」说明。
ulimit 是「进程级」设置,不是系统级ulimit 只在当前 shell 及其子进程中生效ulimitulimit -n 65535
只是“临时生效”~/.bashrc / ~/.profile 可能不生效.bashrc在 Debian 8+(使用 systemd) 后:
ulimit 被 systemd 的 resource limit 接管/etc/security/limits.conf 只对登录会话有效/etc/security/limits.confsudo vim /etc/security/limits.conf
示例(对所有用户):
* soft nofile 65535
* hard nofile 65535
⚠ 注意:
grep pam_limits /etc/pam.d/common-session
有:session required pam_limits.so
✅ 重启或重新登录后生效
sudo systemctl edit nginx
添加:
[Service]
LimitNOFILE=65535
LimitNPROC=65535
然后:
sudo systemctl daemon-reload
sudo systemctl restart nginx
✅ 重启服务器也生效
sudo vim /etc/systemd/system.conf
修改:
DefaultLimitNOFILE=65535
DefaultLimitNPROC=65535
然后:
sudo systemctl daemon-reexec
Docker 不会继承宿主机的 ulimit 需要在运行容器时指定:
docker run --ulimit nofile=65535:65535 ...
或 docker-compose:
ulimits:
nofile:
soft: 65535
hard: 65535
# 当前 shell
ulimit -n
# 某个进程
cat /proc/<PID>/limits
重启后 ulimit 失效,是因为你设在了“临时 shell”,而不是“进程/服务真正读取的地方”。
如果你能告诉我:
nofile / nproc / 其他我可以给你完全对应的配置示例。