CentOS 服务器句柄数修改如何配

作者:袖梨 2026-08-13

CentOS 7+需同步配置三层句柄限制:limits.conf(仅PAM登录用户)、systemd.system.conf(全局服务默认值)、单个service文件(精准覆盖),且均不能超过内核nr_open和file-max上限。

CentOS 服务器句柄数修改不能只改一个地方,尤其在 CentOS 7 及之后版本(使用 systemd),必须同时配置三层,否则常见服务(如 nginx、MySQL、Java 应用)完全不受影响。

/etc/security/limits.conf:只对 PAM 登录用户生效

该文件仅控制通过 ssh、console 等方式登录的用户及其启动的进程(比如你手动执行 java -jar app.jar),对 systemctl 启动的服务无效。

  1. 添加如下内容(以 root 和所有用户为例):
* soft nofile 655350

* hard nofile 655350

root soft nofile 655350

root hard nofile 655350

注意:

– soft 和 hard 必须都设,且 soft ≤ hard;

– 修改后需重新登录终端才生效;

– 若设置值超过内核限制 /proc/sys/fs/nr_open(默认 1048576),会导致 root 或特定用户无法登录(如设置 200 万但 nr_open=1048576)。

/etc/systemd/system.conf:全局 systemd 服务默认限制

这是影响所有 systemctl start xxx.service 启动服务的关键配置。systemd 完全忽略 limits.conf。

  1. 编辑 /etc/systemd/system.conf,取消注释并设置:
DefaultLimitNOFILE=655350

DefaultLimitNPROC=65535

保存后必须运行:

sudo systemctl daemon-reload

已有服务需重启才生效(如 sudo systemctl restart nginx)。

单个 service 文件:精准覆盖某服务

若只想调高某个服务(如 Elasticsearch),不改动全局配置,推荐此方式:

  1. 执行:sudo systemctl edit elasticsearch.service
  2. 写入:
[Service]

LimitNOFILE=655350

保存后同样需执行:sudo systemctl daemon-reload && sudo systemctl restart elasticsearch

验证是否生效:systemctl show elasticsearch.service | grep LimitNOFILE

内核级上限检查与调整

上面所有配置都不能突破内核硬限:

  1. 查看当前上限:cat /proc/sys/fs/nr_open(单进程最大句柄数)
  2. 查看系统总句柄池:cat /proc/sys/fs/file-max(全系统可分配总数)
  3. 如需提高,编辑 /etc/sysctl.conf
fs.nr_open = 2097152

fs.file-max = 2097152

然后执行:sudo sysctl -p

注意:nr_open 设置过高(如超 200 万)可能引发登录失败,务必留余量并测试。

相关文章

精彩推荐