CentOS 7 资源限制需分三层配置:用户级(/etc/security/limits.conf,仅对PAM登录用户生效)、服务级(systemd service中设LimitNOFILE/LimitNPROC或全局/etc/systemd/system.conf)、系统级(/etc/sysctl.conf调fs.file-max和fs.nr_open),且需注意20-nproc.conf覆盖问题及验证实际进程限制。

CentOS 7 修改资源使用上限不是改一个地方就能生效的,必须分三层:系统级、用户级、服务级。漏掉任意一层,ulimit -n 或 ulimit -u 看起来设了,实际进程一跑就还是老值。
为什么 ulimit -n 临时设置后重启就失效?
因为 ulimit 只作用于当前 shell 及其子进程,退出会话即丢。真正要持久生效,得写进 PAM 认证链里——而 CentOS 7 默认用 /etc/security/limits.conf,但这个文件只对通过 login、su、ssh 登录的用户生效,对 systemd 启动的服务完全无效。
-
/etc/security/limits.conf中的nofile和nproc设置,仅影响交互式登录用户(比如 root ssh 进来后执行的命令) - 如果用
systemctl start xxx启的服务,它不走 PAM,所以limits.conf对它没用 -
ulimit -n命令本身不能突破limits.conf里设的硬限制(-H),软限制(-S)也不能超硬限
systemd 服务怎么设 nofile / nproc?
CentOS 7 的 systemd 服务绕过 limits.conf,必须单独配置。以 nginx 为例,直接改 service 文件:
sudo systemctl edit nginx.service
然后填入:
[Service] LimitNOFILE=65536 LimitNPROC=65536
保存后重载并重启:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
sudo systemctl daemon-reload sudo systemctl restart nginx
- 不能写在
/usr/lib/systemd/system/nginx.service原文件里,会被升级覆盖;要用systemctl edit创建覆盖片段 -
LimitNOFILE是每个进程能打开的文件数,不是全局fs.file-max - 若服务用
User=xxx指定了非 root 用户,还要确保该用户在limits.conf里有对应条目,否则启动时可能因权限被拒
系统级 file-max 和 nr_open 怎么调?
fs.file-max 是内核允许整个系统打开的文件描述符总数,fs.nr_open 是单个进程能申请的上限。两者都得调,且 nr_open 必须 ≥ 你设的 nofile 硬限,否则即使 limits.conf 写了 65536,也会被内核截断成默认值(通常是 1048576)。
- 编辑
/etc/sysctl.conf,加两行: fs.file-max = 6553600fs.nr_open = 2000000- 执行
sudo sysctl -p生效 - 验证:
cat /proc/sys/fs/file-max和cat /proc/sys/fs/nr_open
容易被忽略的坑:20-nproc.conf 覆盖 limits.conf
CentOS 7 自带 /etc/security/limits.d/20-nproc.conf,里面写了:
* soft nproc 1024 root soft nproc unlimited
这个文件会**覆盖** limits.conf 里同名项(nproc),哪怕你在 limits.conf 里写了 * hard nproc 65535,也无效。
- 要么删掉或注释掉
20-nproc.conf里的* soft nproc行 - 要么直接改它,把
1024改成你要的值 - 别只改
limits.conf就以为完事了——这是最常踩的坑
改完所有层之后,必须重新登录(对用户)或重启服务(对 systemd),而且得用 ps -o pid,rlimit -p $(pgrep -f your_process) 实际查进程的限制值,别只信 ulimit -a 的输出。

















