首页/系统/Linux 内核与性能调优速查/fs.nr_open 单进程句柄硬上限
sysctl 内核参数72 条

fs.nr_open 单进程句柄硬上限

单个进程能打开的文件描述符硬上限(默认 1048576);limits 中的 nofile 不能超过它。

单进程句柄硬上限是什么

fs.nr_open 规定单个进程能够打开的文件描述符数量的绝对上限,默认 1048576。它是三层限制中的中间一层:整个系统的总量由 fs.file-max 控制,进程运行时实际生效的上限则来自 RLIMIT_NOFILE(由 ulimit、systemd 单元或 limits.conf 设定),而这个进程级限制不能超过 fs.nr_open。理解顺序很重要:想把进程限制调得很高,必须先确认硬上限已经足够大。

基本信息

参数fs.nr_open(默认 1048576)
层级位置介于系统总量与进程运行时限制之间
约束关系进程的 nofile 限制不得超过该值
修改顺序先调 fs.nr_open,再调进程限制,最后重启进程
相关配置systemd 单元的 LimitNOFILE、/etc/security/limits.conf
超限报错设置更大的限制时直接报不允许

典型使用场景

  • 网关与消息队列:单进程需要维持大量连接,句柄需求很高
  • 提升限制失败:设置更大的进程限制时报错,需要先放开硬上限
  • 交付基线设定:在镜像或初始化脚本里固化这套参数,避免逐台手工调整
  • 排查句柄不足:确认是硬上限、进程限制还是系统总量先到顶
  • 容量评估:按单个进程的峰值连接数核对上限是否有余量

按顺序提升

按顺序提升
sysctl fs.nr_open                          # 读单进程硬上限
ulimit -n                                  # 当前 shell 的进程限制
cat /proc/<pid>/limits | grep -i 'open files'   # 目标进程的实际限制
sysctl -w fs.nr_open=2097152               # 第一步:放开硬上限
systemctl show -p LimitNOFILE myapp         # 第二步:核对服务配置
systemctl restart myapp                    # 第三步:重启进程使其生效

落盘与回读

落盘与回读
# /etc/sysctl.d/99-fs-tuning.conf
fs.nr_open = 2097152         # 单进程文件句柄硬上限
fs.file-max = 2097152        # 系统级总量同步放宽
# 回读命令:sysctl fs.nr_open fs.file-max

三层限制顺序

层级设置位置相互关系
系统总量fs.file-max所有进程合计的上限
单进程硬上限fs.nr_open进程限制不能超过它
进程运行时限制ulimit、systemd、limits.conf实际约束单进程的数值
修改生效重启进程或重新登录限制在进程启动时读取
顺序是这类调整最容易出错的地方:目标值高于硬上限时,设置进程限制会直接失败。正确做法是先放开硬上限,再调整进程限制,最后重启进程。
systemd 管理的服务不会继承交互式 shell 的 ulimit 设置:需要在单元文件或相关的覆盖配置里设置 LimitNOFILE,改完执行重新加载并重启服务。

易错点

  • 顺序颠倒:先设进程限制再看硬上限,会直接报错而误以为系统不支持该取值
  • 改了 shell 的 ulimit 就以为服务生效:systemd 服务有独立配置,需从单元文件入手
  • 改完不重启进程:限制在启动时读取,配置改动不会自动应用
  • 只调单进程上限不调系统总量:高并发场景下系统级上限先到顶
  • 不做基线记录:后续无法判断这些值是否被其他变更覆盖

数据来源与参考

  • Linux 内核 Documentation/admin-guide/sysctl/fs.rst
  • man 5 limits.conf
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌