/proc/sys/fs/file-max 是系统级全局文件句柄总数上限,仅调高它不足以解决 yum 多线程下载的“句柄饥饿”,还需同步放宽 ulimit -n 进程限制并优化 yum/dnf 并行与超时参数。

直接向 /proc/sys/fs/file-max 写入新值可以临时提升系统级最大文件句柄数,但仅靠这一步无法彻底解决 Yum 多线程下载引发的“句柄饥饿”——因为问题往往卡在进程级限制、Yum 自身行为或内核资源分配机制上。
理解 file-max 的作用边界
file-max 是内核能同时管理的**全局文件句柄总数上限**,不是单个进程的限制。它影响的是整个系统的打开文件能力,比如当大量 Yum 进程(或其依赖的 dnf/librepo 线程)并发打开 repo 元数据、RPM 包、SSL 连接时,可能触及该阈值。
但更常见的瓶颈其实是:
- 用户级限制(
ulimit -n),默认常为 1024,远低于file-max - Yum/DNF 默认启用多镜像并行下载(如
fastestmirror+reposync),每个连接、每个临时文件都消耗句柄 -
fs.file-nr显示已分配但未释放的句柄(尤其 TLS 握手失败或连接中断后残留)
安全修改 file-max 的操作步骤
执行以下命令前请确认你有 root 权限:
- 查看当前值:
cat /proc/sys/fs/file-max - 临时生效(重启失效):
echo 2097152 > /proc/sys/fs/file-max(设为 2M) - 永久生效:在
/etc/sysctl.conf中添加一行fs.file-max = 2097152,再运行sysctl -p
⚠️ 注意:数值不宜盲目调高。过大的 file-max 会增加内核内存开销(每个句柄约 1KB slab 开销),建议按峰值并发连接数 × 1.5 预估,例如 500 个并发下载任务,预估需 8000–12000 句柄,设为 131072 即可。
同步调整进程级限制(关键!)
即使 file-max 足够大,普通用户启动的 Yum 进程仍受 ulimit -n 限制。必须同步放宽:
- 临时对当前 shell 生效:
ulimit -n 65536 - 永久生效(推荐):编辑
/etc/security/limits.conf,添加两行:* soft nofile 65536* hard nofile 65536
并确保pam_limits.so在/etc/pam.d/{login,sshd,system-auth}中已启用。
验证方式:新开终端,运行 ulimit -n 和 cat /proc/$$/limits | grep "Max open files"。
优化 Yum/DNF 行为减少句柄占用
治标更要治本。Yum(尤其是 DNF 后端)在高并发场景下容易因连接复用不足或超时设置不合理导致句柄堆积:
- 禁用不必要的插件:注释掉
/etc/yum/pluginconf.d/fastestmirror.conf中的enabled=1,避免每次请求都探测所有镜像 - 降低并行度:在
/etc/dnf/dnf.conf中添加max_parallel_downloads=5(默认可能是 10 或 20) - 缩短连接超时:添加
timeout=30和retries=2,避免僵死连接长期占着句柄 - 使用
--setopt=skip_if_unavailable=False避免反复重试不可达源,减少无效句柄申请
执行完配置后,建议清理缓存:dnf clean all,再测试下载行为。











