Nginx 不支持 manager_files 配置项,该参数不存在于官方语法中,配置会报错或被忽略;cache manager 每秒扫描最多100个目录,逻辑硬编码不可调;真实调优应聚焦 levels 分级、keys_zone 容量与 inactive 合理分层。

nginx 并不支持 manager_files 这个配置项,它在官方语法中不存在,任何尝试在 proxy_cache_path 中写入 manager_files=200 的做法都会导致配置加载失败或被静默忽略。所谓“通过 manager_files 控制扫描文件数来降低 CPU 损耗”,是一个广泛传播但根本站不住脚的误解。
cache manager 的实际行为不可配置
Nginx 缓存管理器(cache manager)是后台固定逻辑协程,其运行节奏由源码硬编码决定:
- 每秒唤醒一次,无法调整周期
- 每次最多扫描 100 个缓存目录(不是文件),该值由宏
NGX_HTTP_CACHE_MANAGER_FILES定义,编译时固化 - 对每个目录,仅遍历部分文件进行 inactive 判断,不全量扫描
- 清理动作只作用于已过期、未被占用的条目,不阻塞 worker 进程
高 CPU 扫描损耗的真实根源
当缓存规模达数十万以上小文件时,CPU 占用升高通常不是因为“单次扫太多”,而是因以下结构性问题:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
-
单目录文件密度过高:例如
levels=1导致所有缓存挤在同一个目录,readdir()系统调用开销剧增 - keys_zone 内存不足:元数据频繁换入换出,导致 inactive 计时失效,cache manager 被迫反复扫描无效路径
-
inactive 设置过短:如设为
1m,大量缓存刚写入即进入待清理队列,引发高频无效判断 -
磁盘 I/O 延迟高:机械盘或慢 SSD 上
stat()调用响应慢,拖累整个扫描循环
真正有效的调优方向
放弃虚构参数,聚焦可落地的三方面优化:
-
重构目录层级:改用
levels=1:2:2,将百万级文件分散到约 104 万个子目录,显著降低单次readdir成本 -
扩容 keys_zone:按每千条缓存约需 128KB 共享内存估算,50 万缓存建议至少
keys_zone=mycache:64m -
分级设置 inactive:热接口用
30m,静态资源用2h,归档类用7d,避免冷热混扫
辅助性系统级缓解
若仍观察到 cache manager 线程 CPU 高峰明显,可配合操作系统层做轻量干预:
- 使用
ionice -c 3启动 nginx,降低其 I/O 优先级 - 确保
/var/cache/nginx所在文件系统启用noatime挂载选项 - 在 SSD 环境下开启
aio threads,把stat()和unlink()卸载到线程池

















