系统级文件描述符总数需修改/etc/sysctl.conf中fs.file-max并执行sysctl -p生效;用户级限制通过/etc/security/limits.conf配置soft/hard nofile;systemd服务须在/etc/systemd/system.conf中设DefaultLimitNOFILE,三者缺一不可。

修改系统级文件描述符总数:/etc/sysctl.conf
系统能同时打开的文件描述符总数由 fs.file-max 控制,它影响所有进程总和。这个值必须大于单个进程的 nofile 限制,否则后者无法生效。
直接编辑 /etc/sysctl.conf,追加一行:
fs.file-max = 655350
执行 sysctl -p 立即加载,无需重启。注意:该值不宜盲目设得过大——每 256 个 fd 约占 4MB 内存,8GB 内存建议上限不超过 524288。
设置登录用户的软硬限制:/etc/security/limits.conf
这个文件只对通过 PAM 认证登录的用户(如 SSH、console)生效,不作用于 systemd 启动的服务。
-
*表示所有用户;root可单独配置 -
soft是当前会话实际生效值,hard是允许上调的天花板 -
nofile控制文件描述符数,nproc控制最大线程/进程数
典型写法(追加到文件末尾):
* soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535
修改后需重新登录或新开终端才生效。若发现不生效,检查是否被 /etc/security/limits.d/20-nproc.conf 覆盖(该文件默认限制普通用户 nproc 为 1024)。
覆盖 systemd 服务的资源限制:/etc/systemd/system.conf
CentOS 7 中,nginx、mysql 等以 systemd service 方式运行的程序,完全无视 limits.conf。必须改 systemd 全局配置。
编辑 /etc/systemd/system.conf,取消注释并修改这两行:
DefaultLimitNOFILE=65535 DefaultLimitNPROC=65535
保存后执行 systemctl daemon-reexec(不是 reload),让新配置对后续启动的服务生效。已运行的服务需重启才能应用,例如 systemctl restart nginx。
验证某进程实际生效的限制值
不要只查全局配置,最终看进程自己拿到的是什么:
- 查系统总上限:
cat /proc/sys/fs/file-max - 查当前 shell 限制:
ulimit -Sn和ulimit -Hn - 查某服务进程(如 PID 1234):
cat /proc/1234/limits | grep "Max open files"
常见坑:改了 limits.conf 却忘了 systemd 配置,结果服务进程还是卡在 1024;或者 file-max 设得太小,导致即使用户配了 65535,实际也达不到。


















