centos 中需调高 ulimit -n 以解决 too many open files 错误,但 systemd 服务不读取 /etc/security/limits.conf,须在 service 文件中配置 limitnofile 和 limitnproc,并同步调整系统级 fs.file-max 与 fs.nr_open。

CentOS 不是“开启”句柄数限制,而是默认就有限制(ulimit -n 通常为 1024),你要做的是**解除或调高它**——否则服务跑一会儿就报 Too many open files。
为什么 ulimit -n 设置后不生效?
在 CentOS 7/8 中,ulimit 命令只对当前 shell 及其子进程临时有效;退出终端就回退。更关键的是:systemd 管理的服务(比如 nginx、mysql、自定义 .service 文件)**完全无视 /etc/security/limits.conf**,这是最常踩的坑。
-
/etc/security/limits.conf只影响 PAM 登录用户(如 ssh 登录后的 bash) - systemd service 的资源限制由
/etc/systemd/system.conf或服务单元文件自身控制 - 即使你改了
limits.conf,systemctl start myapp启动的进程仍用默认 4096(或更低)
怎么让 systemd 服务生效?
直接改服务单元文件最可靠,避免全局污染:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
- 编辑服务文件:
sudo systemctl edit myapp.service(推荐,不会被包管理器覆盖) - 或复制模板:
sudo cp /usr/lib/systemd/system/myapp.service /etc/systemd/system/,再编辑 - 在
[Service]段下加两行:LimitNOFILE=65536<br>LimitNPROC=65536
- 重载并重启:
sudo systemctl daemon-reload && sudo systemctl restart myapp
验证是否生效:cat /proc/$(pgrep -f myapp)/limits | grep "Max open files",看 Soft Limit 和 Hard Limit 是否已更新。
系统级 file-max 怎么调?
/proc/sys/fs/file-max 是整个内核能分配的文件句柄总数,必须 ≥ 单个进程设置 × 进程数,否则即使进程 limit 调高也会卡住:
- 查当前值:
cat /proc/sys/fs/file-max - 临时调高:
sudo sysctl -w fs.file-max=2097152 - 永久生效:在
/etc/sysctl.conf里加一行fs.file-max = 2097152,再sudo sysctl -p - 注意:该值受
/proc/sys/fs/nr_open上限约束(默认 1048576),如需更大,先设fs.nr_open = 4194304
真正容易被忽略的是:LimitNOFILE 必须显式写在 service 文件里,且 file-max 和 nr_open 要配套调大——三者缺一,高并发时照样崩。










