在 Debian 里,ulimit 的“生效”通常分 当前 shell / 进程 和 系统级 / 服务级 两种场景。很多人改了但“没生效”,是因为改错地方或被 systemd 覆盖。下面按常见情况说明。
ulimit -a
ulimit -n 65535 # 打开文件数
ulimit -u 4096 # 最大进程数
⚠️ 注意:
查看硬限制:
ulimit -Hn
ulimit -Sn
这是 最常用、推荐 的方式。
/etc/security/limits.confsudo vim /etc/security/limits.conf
示例:
* soft nofile 65535
* hard nofile 65535
www-data soft nproc 4096
www-data hard nproc 4096
确认以下文件包含(一般默认有):
/etc/pam.d/common-session
/etc/pam.d/common-session-noninteractive
包含:
session required pam_limits.so
logout
ssh 重新登录
✅ 对:
Debian 用 systemd 后,limits.conf 对服务基本无效
sudo systemctl edit nginx
加入:
[Service]
LimitNOFILE=65535
LimitNPROC=4096
然后:
sudo systemctl daemon-reload
sudo systemctl restart nginx
查看:
cat /proc/$(pgrep nginx | head -1)/limits
sudo vim /etc/systemd/system.conf
DefaultLimitNOFILE=65535
DefaultLimitNPROC=4096
sudo systemctl daemon-reexec
⚠️ 需重启或 daemon-reexec
有些限制还受内核影响:
fs.file-max
查看:
cat /proc/sys/fs/file-max
修改:
sudo sysctl -w fs.file-max=1000000
永久:
/etc/sysctl.conf
fs.file-max=1000000
❌ 改了 limits.conf 但:
✅ 排查顺序:
ulimit -acat /proc/PID/limitssystemctl show xxx | grep Limit如果你能说 具体场景(比如:Nginx?MySQL?Docker?SSH 用户?),我可以直接给你一套精确配置。