优化nginx缓存i/o效率需减少磁盘访问、避免冗余拷贝、提升内存驻留;核心是调优open_file_cache(max=10000 inactive=60s)、open_file_cache_valid 60s、open_file_cache_min_uses 2及open_file_cache_errors on,并禁用directio以利用内核页缓存。

优化 Nginx 缓存读取的 I/O 效率,核心是减少磁盘访问频次、避免内核与用户态间冗余拷贝,并让热点数据尽可能驻留在内存中。关键不在于堆参数,而在于对缓存路径各环节的精准控制。
启用并调优 open_file_cache
这是提升小文件(CSS/JS/图片等)元数据访问效率最直接有效的手段。它缓存 open() 和 stat() 的结果,避免每次请求都触发系统调用。
- 开启缓存:设置 open_file_cache max=10000 inactive=60s; —— 缓存最多 10000 个文件项,60 秒内未被访问则标记为待淘汰
- 验证有效性:配置 open_file_cache_valid 60s; —— 每 60 秒主动检查一次缓存项是否仍有效(如文件是否被删除或权限变更)
- 提升命中率:加上 open_file_cache_min_uses 2; —— 同一文件至少被访问 2 次才进入缓存,过滤偶然请求
- 别漏掉错误缓存:open_file_cache_errors on; —— 对“文件不存在”这类结果也缓存,防止恶意扫描反复穿透磁盘
强制走内核页缓存,禁用 directio
对小文件(通常 不要启用 directio。directio 绕过 page cache,反而让每次读取都直触磁盘,失去操作系统级缓存收益。
- 保持默认行为:不配置 directio 指令,或显式写 directio off;
- 只在大文件场景(如视频分片)考虑 directio,且需搭配线程池(aio threads;)避免阻塞事件循环
- 确认 sendfile on; 已启用 —— 它依赖 page cache,能实现零拷贝发送,省去 read()+write() 两次系统调用
减少日志与 stat 开销
access_log 和频繁路径匹配本身不读文件内容,但会触发大量 stat() 判断日志文件是否存在、是否可写,间接拖慢整体 I/O 路径。
- 静态资源服务中直接关闭:access_log off;(CDN 边缘节点或纯前端托管推荐)
- 若必须记录,启用日志文件缓存:open_log_file_cache max=1000 inactive=1h valid=1h min_uses=2;
- 静态路径用前缀匹配,不用正则:location /assets/ { ... } 而非 location ~* \.(js|css|png)$ —— 减少每次请求的字符串解析和模式匹配开销
协同内核与 worker 进程调度
I/O 效率最终受限于 CPU 缓存局部性和上下文切换。worker 进程若频繁跨核迁移,会失效 L1/L2 缓存,导致 page cache 查找变慢。
- 设置 worker_processes auto; 并搭配 worker_cpu_affinity auto;(Nginx ≥ 1.19.10)—— 让每个 worker 独占一个物理核
- 增大单 worker 并发能力:worker_connections 10240;,配合 epoll 高效就绪通知,减少连接管理本身的开销
- 确认 tcp_nodelay on; 已启用 —— 防止小响应包被 Nagle 算法延迟合并,避免毫秒级抖动影响感知延迟











