合理设置 manager_files 能显著降低 nginx 缓存管理器扫描过期缓存时的 cpu 占用;它控制单次扫描文件数,默认 200,调至 50~100 可使负载更平滑。

合理设置 manager_files 能显著降低 Nginx 缓存管理器(cache manager)在后台扫描过期缓存时的 CPU 占用,尤其在缓存目录文件数量庞大时效果明显。
manager_files 控制单次扫描的文件数量
缓存管理器会周期性扫描缓存目录,清理过期或超限条目。默认情况下它每次最多扫描 200 个文件(manager_files 200)。若缓存中存在数万甚至数十万个文件,单次扫描耗时长、CPU 突增,容易引发毛刺。
调低该值可将扫描任务“切片”,让 CPU 负载更平滑:
- 设为 50~100:适合中小规模缓存(
- 设为 20~50:适合高并发、大缓存场景(如 CDN 边缘节点),避免单次扫描阻塞 worker 进程
- 不建议低于 10,否则扫描频率过高,反而增加调度开销
需配合 manager_sleep 和 manager_threshold 使用
manager_files 单独调整效果有限,必须与另外两个参数协同才能实现“低频轻量扫描”:
FastAPI + Flask 混合部署最佳实践,解决路由定义、API 代理等常见问题,适用于同时运行 FastAPI API 与 Flask 前端的场景。
-
manager_sleep 200ms:每次扫描完一批文件后休眠 200 毫秒,给其他进程让出 CPU 时间片 -
manager_threshold 500ms:若单次扫描耗时超过 500ms,立即暂停并进入休眠,防止长时间独占 CPU
例如完整配置:
proxy_cache_path /var/lib/nginx/cache/publiclevels=1:2 keys_zone=public-cache:30m
max_size=192m
manager_files=40 manager_sleep=300ms manager_threshold=400ms;
注意缓存目录结构对扫描效率的影响
levels=1:2 这类多级目录结构本身能提升扫描效率——管理器按层级遍历,避免海量文件挤在单目录下。但若误配为 levels=(空)或 levels=1,会导致单目录文件过多,即使调小 manager_files,仍可能频繁触发阈值中断,实际收益下降。
建议保持标准两级结构(如 levels=1:2),并确保缓存路径所在文件系统支持高效目录遍历(如 ext4/xfs,避免 NFS 或低性能云盘)。
验证调优是否生效
启用 error_log /var/log/nginx/error.log info; 后,观察日志中 cache manager 相关条目:
- 正常状态应看到类似
cache manager process XXX exited with code 0,且间隔稳定 - 若频繁出现
cache manager process XXX was terminated due to timeout,说明manager_threshold仍偏小或磁盘 I/O 成瓶颈 - 用
top -p $(pgrep nginx | head -1)观察 cache manager 进程(PID 通常略高于 master)的 CPU 占比,优化后应从峰值 30%+ 降至持续 2%~5%










