在 CentOS 中,ulimit 经常让人感觉“失效”,通常不是命令本身的问题,而是作用范围、配置位置或进程启动方式导致的。下面按最常见原因逐一说明。
ulimit 是 shell 内置命令,不是系统全局配置。
ulimit -n 65535
只影响:
不会影响:
✅ 验证:
ulimit -n
# 新开一个终端,再 ulimit -n,可能还是 1024
很多人写:
# /etc/profile
ulimit -n 65535
然后发现:
原因:
systemd 直接拉起✅ 正确方式(CentOS 7+):
# /etc/systemd/system/nginx.service.d/limits.conf
[Service]
LimitNOFILE=65535
然后:
systemctl daemon-reload
systemctl restart nginx
* soft nofile 65535
* hard nofile 65535
但发现没用,常见原因:
limits.conf 依赖 PAM
systemd 服务 不生效检查:
grep pam_limits /etc/pam.d/system-auth
应包含:
session required pam_limits.so
CentOS 7/8 中:
systemd 默认限制会覆盖 ulimit例如:
systemctl show nginx | grep LimitNOFILE
如果看到:
LimitNOFILE=1024
那你改 ulimit 是没用的。
✅ 必须改 systemd 配置
以下情况需要:
只改文件不重启 = 不生效
cat /proc/sys/fs/file-max
如果太小:
sysctl -w fs.file-max=1000000
# 当前进程限制
cat /proc/<pid>/limits
# systemd 限制
systemctl show <service> | grep Limit
# 当前 shell
ulimit -a
CentOS 上 ulimit“失效”,99% 是因为:你改的地方,进程根本没读到。
如果你愿意,可以告诉我:
我可以直接给你最正确的配置方式。