CentOS 7如何修改具体的系统文件系统节点数上限的重点在于把前置条件、操作顺序和容易误判的地方分清楚。
fs.nr_open是单进程文件描述符硬上限,决定ulimit -n最高可设值;而fs.file-max是全系统总句柄数上限,二者作用域不同,故不能仅调高后者——若fs.nr_open未同步扩大,ulimit将因超出进程级上限而失败。
fs.nr_open 是内核允许单个进程打开的文件描述符(file descriptor)上限,它决定了 ulimit -n 能设多高。而 fs.file-max 是整个系统所有进程加起来能打开的总文件数。如果你只调高 fs.file-max 却没碰 fs.nr_open,用户执行 ulimit -n 1000000 会失败,报错:bash: ulimit: open files: cannot modify limit: Operation not permitted。
运行以下命令查看现状:
cat /proc/sys/fs/nr_open
默认通常是 1048576(即 1024×1024)。但注意:fs.nr_open 本身有编译时硬上限,不能无限制设高。若你尝试设为 2000000 却失败,说明超出了内核编译时定义的 NR_OPEN_MAX —— 此时再怎么改配置都没用,只能换内核或接受上限。
fs.file-max ≤ fs.nr_open,否则 sysctl -p 会报错并拒绝加载cat /proc/sys/fs/file-max,避免后续冲突sysctl -w fs.nr_open=2000000,但重启后丢失编辑 /etc/sysctl.conf,追加两行(顺序不能颠倒):
fs.nr_open = 2000000<br>fs.file-max = 1500000
然后执行 sysctl -p 加载。验证是否生效:
sysctl fs.nr_open → 应输出你设的值ulimit -Hn → 应 ≤ fs.nr_open,且大于之前软限制ulimit -n 1500000 不报错才算真正打通如果 ulimit -n 仍卡在旧值,检查是否漏了 /etc/security/limits.conf 中对应用户的 nofile 设置,或者 systemd 服务是否覆盖了限制(见下一点)。
CentOS 7 使用 systemd 启动的服务(比如 nginx、java 进程),默认不读 /etc/security/limits.conf。即使你全局设了 * hard nofile 1500000,这些服务启动时仍可能只有 4096 或 65536。
解决方法是统一改 systemd 全局限制:
echo 'DefaultLimitNOFILE=1500000' >> /etc/systemd/system.conf<br>echo 'DefaultLimitNOFILE=1500000' >> /etc/systemd/user.conf<br>systemctl daemon-reload
之后重启目标服务(如 systemctl restart nginx),再用 cat /proc/$(pgrep nginx)/limits | grep "Max open files" 确认新限制已生效。
容易被忽略的是:systemd 的 DefaultLimitNOFILE 值不能超过 fs.nr_open,否则启动失败且日志里只报 Failed at step LIMITS spawning,不提具体原因。