Nginx进程本身不直接产生磁盘IOPS,真正需监控的是宿主机磁盘I/O压力是否由其日志、静态文件服务或缓存等行为引发;应通过iostat、iotop、pidstat等工具分层定位,并以open_file_cache、sendfile、日志缓冲等配置优化降低I/O压力。

Nginx 进程本身不直接产生磁盘 IOPS,它作为用户态反向代理或 Web 服务器,读写磁盘的行为非常有限(仅限于日志写入、静态文件服务、SSL 证书加载等少数场景)。因此,“监控 Nginx 进程的 IOPS”这个说法在技术上容易误解——真正需要关注的是:Nginx 所在宿主机的磁盘 I/O 压力是否由其行为引发,或是否影响其性能。
下面分三类讲清楚怎么做:
一、确认 Nginx 是否在触发显著磁盘 I/O
不是所有 Nginx 部署都会明显消耗磁盘 IOPS。先判断是否真有必要监控:
-
✅ 高 IOPS 风险场景:
- 大量小文件静态服务(如图片站、前端资源 CDN)且未启用
sendfile on或aio on - 日志级别设为
debug,且access_log/error_log写入频繁(尤其未做异步或缓冲) - 使用
proxy_cache但缓存路径在普通 SATA 盘,且缓存命中率低、频繁回源+落盘
- 大量小文件静态服务(如图片站、前端资源 CDN)且未启用
-
❌ 低 IOPS 场景(通常可忽略):
- 纯反向代理(无静态文件服务)+ 异步日志(
access_log ... buffer=64k flush=5s) - 启用
open_file_cache+sendfile on+tcp_nopush on - 缓存全部在内存(如
proxy_cache_path ... use_temp_path=off+ tmpfs 挂载)
- 纯反向代理(无静态文件服务)+ 异步日志(
? 提示:用
iotop -p $(pgrep nginx)可实时查看 nginx worker 进程的实时 IO 速率。若长期显示< 10 KB/s读/写,基本无需专项 IOPS 监控。
二、监控宿主机磁盘 I/O(关联 Nginx 行为)
当确认 Nginx 是 I/O 主要参与者时,应监控底层设备级指标,而非进程级:
-
关键命令与指标:
-
iostat -xdm 1(每秒刷新)关注:-
%util:磁盘忙时百分比 > 80% 表示饱和 -
await:平均 I/O 请求等待时间 > 10ms 需警惕(SSD 应 < 2ms) -
r/s+w/s:实际 IOPS 数值(即每秒读/写次数)
-
-
pidstat -d -p $(pgrep nginx) 1:按进程维度看累计读写字节数(注意:不反映 IOPS 次数,只反映吞吐量) -
lsof -p $(pgrep nginx) | grep -E "(log|cache|html|jpg)":快速定位 Nginx 正在操作哪些磁盘路径
-
-
推荐长期采集项(用于告警或趋势分析):
-
node_disk_io_time_seconds_total{device="sda"}(Prometheus + Node Exporter) -
rate(node_disk_reads_completed_total[5m])和rate(node_disk_writes_completed_total[5m])→ 即真实 IOPS - 关联标签:加上
instance和mountpoint,便于区分/var/log/nginxvs/data/cache
-
三、优化配置,降低 Nginx 相关 I/O 压力
监控是手段,减少不必要 I/O 才是目标:
-
日志层面:
- 启用缓冲写入:
access_log /var/log/nginx/access.log main buffer=128k flush=5s; - 错误日志调为
warn或error,禁用debug(除非排障) - 将日志挂载到独立 SSD 分区,或使用
rsyslog转发至远程日志服务器
- 启用缓冲写入:
-
静态服务层面:
- 必开:
sendfile on; tcp_nopush on; aio threads;(Linux 5.1+ 支持线程池异步读) - 大文件加
directio 4m;避免内核页缓存干扰 - 缓存控制:
expires 1h; add_header Cache-Control "public, immutable";
- 必开:
-
缓存层面(如用 proxy_cache):
- 缓存路径建议挂载
tmpfs(内存盘)或 NVMe SSD - 设置
proxy_cache_use_stale updating;减少并发回源写
- 缓存路径建议挂载
不复杂但容易忽略


















