单进程句柄硬上限是什么
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,改完执行重新加载并重启服务。