直接启用 open_file_cache 是缓解 too many open files 问题最有效的手段之一,它通过缓存文件元数据并复用文件描述符,大幅减少 open()/stat() 系统调用;必须同时配置 max、inactive、valid、min_uses 和 errors 五项参数,缺一不可。

直接启用 open_file_cache 是缓解 Too many open files 问题最有效的手段之一,但它不是靠“多开文件”,而是通过复用和缓存,大幅减少重复的 open()、stat() 系统调用,从而压低实际打开的文件描述符(fd)数量。
必须配齐的四个核心参数
只写 open_file_cache on; 完全无效。以下四项需同时出现在 http 块中:
-
容量与淘汰策略:
open_file_cache max=10000 inactive=60s;—— 最多缓存 1 万个条目;60 秒内未被访问即标记为待淘汰 -
元数据校验周期:
open_file_cache_valid 60s;—— 每 60 秒检查一次缓存项是否仍有效(如文件是否被删、权限是否变更) -
准入门槛:
open_file_cache_min_uses 2;—— 同一文件在inactive时间窗口内至少被请求 2 次才进缓存,避免偶然访问污染 -
错误也缓存:
open_file_cache_errors on;—— 把 “404 文件不存在”“403 权限拒绝” 等失败结果也记下来,防止反复探测无效路径
配合系统与 Nginx 限制协同生效
缓存再好,也会撞上硬限制。必须同步调整两层上限:
- 系统级:增大
/proc/sys/fs/file-max和单进程限制ulimit -n(建议 ≥ 65535) - Nginx 进程级:
worker_rlimit_nofile 65535;放在http或全局块中,确保 worker 能用足系统允许的 fd 数 - 若使用
open_file_cache_events on;(依赖 inotify),还需检查并调大/proc/sys/fs/inotify/max_user_watches,否则会看到could not build optimal open_file_cache警告
让缓存真正降低句柄占用的关键细节
它不强制“一直开着文件”,但能智能复用:
- 默认行为是按需打开 + 缓存元数据;开启
open_file_cache_events on;后,Nginx 才能在文件变更时收到通知,决定是否复用已有 fd - 高频小静态文件(如
/favicon.ico、/static/app.js)受益最大——这些请求反复触发open()/stat(),正是句柄暴涨的主因 - 搭配
sendfile on;使用效果更明显:内核零拷贝传输内容 + 用户态跳过文件检查 = 双重减负
验证是否起效的实操方法
不能只看配置加载成功,要观察真实变化:
- 运行
lsof -p $(pgrep nginx) | grep REG | wc -l,对比开启前后 worker 进程打开的普通文件数——应明显下降并趋于稳定 - 压测时关注
iostat -x 1中的%util(磁盘利用率)和pidstat -u 1中的%sys(系统调用占比)是否同步下降 - 若编译时含
--with-debug,可临时启用open_file_cache_log on;并查error_log中的 hit/miss 统计











