必须同时调整进程、用户、systemd服务、内核四层限制:ulimit -n 查当前shell软限,cat /proc/pid/limits 查服务真实值,systemd服务需配置LimitNOFILE,/etc/security/limits.conf需PAM支持且重新登录生效,fs.file-max须足够大。

改了 ulimit -n 还是报 “Too many open files”,不是没改对,而是改错层级了——进程限制、用户限制、systemd 服务限制、内核总上限这四层必须各自处理,缺一不可。
查清楚当前哪一层卡住了
别急着改配置,先定位问题源头:
-
ulimit -n显示的是当前 shell 的 soft nofile,它只管你手动敲命令启动的程序 -
ulimit -Sn和ulimit -Hn分别看软限和硬限;若ulimit -Sn无法提升,说明硬限拦住了 - 查某服务真实限制:
cat /proc/$(pidof nginx)/limits | grep "Max open files",这才是它实际生效的值 - 查系统总容量:
cat /proc/sys/fs/file-max,所有进程加起来不能超这个数 - 查某进程已用 fd 数:
ls /proc/$(pidof redis)/fd | wc -l,确认是不是真到了上限
/etc/security/limits.conf 配置后不生效的常见原因
写了 * soft nofile 65536 却没用,大概率栽在这几个点上:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- PAM 没加载
pam_limits.so:检查/etc/pam.d/common-session(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL/CentOS),必须有session required pam_limits.so - 只是
su - user,没真正重新登录:SSH 断开重连,或 console 重新 login,否则 PAM session 不触发 - 格式写错:
soft和hard必须分两行写,不能合并;*表示所有普通用户,但 root 常被发行版策略绕过,建议显式加root soft nofile 65536 - 用了
sudo -u appuser command启动服务:这种调用不走 PAM 登录流程,limits.conf完全不生效
systemd 服务必须单独设 LimitNOFILE
nginx、redis、java 应用等由 systemctl 管理的服务,压根不读 /etc/security/limits.conf——这是最常被忽略的一环。
- 编辑服务配置:
sudo systemctl edit nginx.service - 写入:
[Service] LimitNOFILE=65536
- 重载并重启:
sudo systemctl daemon-reload && sudo systemctl restart nginx - 验证是否生效:
systemctl show nginx --property LimitNOFILE或直接看/proc/$(pidof nginx)/limits - 注意:如果服务由 root 启动但切换到普通用户运行(如 nginx 的
user www-data),则LimitNOFILE要在 service 文件里设,且需确保该用户本身也有对应 limits
内核级 fs.file-max 不够也会卡住
即使用户和服务都调高了,cat /proc/sys/fs/file-max 太小照样会报错。这个值是全系统总和,不是单进程上限。
- 临时修改:
sudo sysctl -w fs.file-max=1048576 - 永久生效:写入
/etc/sysctl.conf:echo "fs.file-max = 1048576" | sudo tee -a /etc/sysctl.conf,再执行sudo sysctl -p - 注意:
nofile设置不能超过fs.nr_open(查法:cat /proc/sys/fs/nr_open),否则 limits.conf 里的值会被截断
最容易被忽略的是:systemd 服务完全不看 limits.conf,而很多人只改了那里就以为万事大吉;还有就是查限制时只看 root 下的 ulimit -n,却没切到实际运行服务的用户去验证。

















