从零理解Linux磁盘I/O延迟:用Prometheus Node Exporter监控Await指标

磁盘I/O延迟是Linux服务器性能的关键指标,await直接反映应用程序等待磁盘完成读写的时间。本文用通俗语言解释await的含义,并手把手教你搭建Prometheus+Node Exporter+Grafana监控栈,从安装到解读数据,小白也能快速上手。

从零理解Linux磁盘I/O延迟:用Prometheus Node Exporter监控Await指标
封面图:ZuCDN · ZuCDN 原创

磁盘慢了,应用就慢了——为什么要关注 await

实际操作要点

关于Prometheus Node,最值得先弄清楚的是配置边界和排错顺序。当你发现网站加载变慢、数据库查询超时、或者文件传输卡顿,第一个怀疑对象往往不是 CPU 或内存,而是磁盘。磁盘 I/O 是 Linux 服务器中最容易成为瓶颈的环节,而 await 正是衡量磁盘响应速度最直观的指标。

简单说,await 是磁盘完成一次 I/O 请求所需的平均时间(毫秒)。它包含了请求在队列中等待的时间以及真正读写数据的时间。如果 await 很高,说明磁盘很“忙”或者本身性能无法满足当前负载,应用层的读写操作就会被阻塞,进而拖慢整个系统的响应。

但 await 不能被孤立地看。一个 30ms 的 await 在 SATA 机械盘上可能还算正常,在 NVMe SSD 上就说明出问题了。因此,我们需要持续监控 await 的变化趋势,而不是只看一次绝对值。

用什么工具监控 await?Prometheus + Node Exporter

我的处理经验

Prometheus 是目前最流行的开源监控系统,它通过拉取目标端点上的指标数据来工作。Node Exporter 是 Prometheus 的官方组件之一,专门用于采集 Linux 主机的系统层指标,包括 CPU、内存、网络、磁盘等。

磁盘 I/O 相关的指标中,Node Exporter 提供了 node_disk_io_time_seconds_total(磁盘忙碌时间)、node_disk_reads_completed_total(读完成次数)、node_disk_writes_completed_total(写完成次数)等。但 await 不是直接暴露的,需要我们自己通过公式计算。

好在 PromQL 可以轻松完成这件事:

rate(node_disk_io_time_seconds_total[1m]) * 1000 / rate(node_disk_reads_completed_total + node_disk_writes_completed_total[1m])

这个公式的含义是:取最近 1 分钟内磁盘忙碌时间的增量(转为毫秒),除以 I/O 完成次数的增量,得到平均每次 I/O 的耗时,也就是 await。

分步搭建监控环境(面向小白的操作指南)——Prometheus Node

1. 安装 Node Exporter

所有操作在 Linux 服务器上执行(以 Ubuntu 20.04 为例)。

  • 下载最新版本:wget https://github.com/prometheus/node_exporter/releases/latest/download/node_exporter-1.7.0.linux-amd64.tar.gz
  • 解压:tar xvf node_exporter-*.tar.gz
  • 移动到 /usr/local/bin:sudo mv node_exporter-*/node_exporter /usr/local/bin/
  • 创建 systemd 服务文件 /etc/systemd/system/node_exporter.service,内容如下:
[Unit]
Description=Node Exporter
After=network.target

[Service]
ExecStart=/usr/local/bin/node_exporter
Restart=always

[Install]
WantedBy=multi-user.target
  • 启动并设置开机自启:sudo systemctl enable --now node_exporter
  • 验证:访问 http://你的服务器IP:9100/metrics,能看到大量以 node_ 开头的指标。

2. 安装 Prometheus

可以用官方提供的二进制包,也可以用 Docker。这里用二进制方式演示快速部署。

  • 从官网下载:wget https://github.com/prometheus/prometheus/releases/download/v2.52.0/prometheus-2.52.0.linux-amd64.tar.gz
  • 解压:tar xvf prometheus-*.tar.gz
  • 编辑配置文件 prometheus.yml,在 scrape_configs 下添加 job:
scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

如果有多个服务器,可以把 localhost 替换成对应 IP,或者使用文件发现、consul 发现等方式。

  • 运行 Prometheus:./prometheus --config.file=prometheus.yml
  • 访问 http://服务器IP:9090,在输入框中输入 up,如果看到 node 对应的值为 1,表示抓取成功。

3. 安装 Grafana 并配置面板

Grafana 是可视化工具,推荐用 Docker 快速安装(前提是你已经安装了 Docker)。

docker run -d --name=grafana -p 3000:3000 grafana/grafana

访问 http://服务器IP:3000,默认账号密码均为 admin,第一次登录会要求修改。

添加数据源:

  • 点击左侧齿轮 → Data Sources → Add data source → 选择 Prometheus。
  • URL 填写 Prometheus 的地址(例如 http://localhost:9090),点击 Save & Test 显示成功。

创建磁盘 await 面板:

  • 点击 + → Create → Dashboard → Add visualization。
  • 在 Query 中输入上面提到的 PromQL:
rate(node_disk_io_time_seconds_total{device=~"sd[a-z]|nvme[0-9]n[0-9]"}[1m]) * 1000 / (rate(node_disk_reads_completed_total{device=~"sd[a-z]|nvme[0-9]n[0-9]"}[1m]) + rate(node_disk_writes_completed_total{device=~"sd[a-z]|nvme[0-9]n[0-9]"}[1m]))

注意:device 过滤要匹配实际的磁盘名,常见的有 sda、sdb、nvme0n1 等。可以在 node_disk_io_time_seconds_total 的 metrics 中查看可用的 device 值。

  • 面板类型选择 Time series,设置单位(毫秒),标题为“磁盘 await 延迟”。
  • 保存后,你就能看到每条磁盘的 await 随时间变化的曲线了。

如何解读 await 数据?——Prometheus Node

正常范围 vs 异常

  • SATA SSD:await 一般在 1-3ms 以内。
  • NVMe SSD:通常在 0.1-0.5ms,超过 1ms 就需要关注。
  • 机械硬盘:在无随机读写时约 10-20ms,随机读写时可能飙升到 100ms 以上。

但这些数值只是经验参考。更重要的观察方式是:监控趋势。如果某块磁盘的 await 从平时的 2ms 突然跳到 10ms 并持续不下,说明磁盘负载增加了或者出现了异常。

await 高可能的原因

  • 磁盘 I/O 饱和:读写请求太多,超过了磁盘的处理能力。可以结合 node_disk_io_now(当前正在处理的 I/O 数)和 avgqu-sz(平均队列长度)来确认。
  • 硬件故障:磁盘坏道、控制器故障等,此时通常伴随 node_disk_io_time_seconds_total 增长异常缓慢。
  • 文件系统层面问题:例如 ext4 的 journal 压力过大、XFS 的元数据操作卡顿。
  • 内核参数或调度器:I/O 调度器选择不当(例如 deadline 更适合机械盘,noop 适合 SSD)。

结合其他指标综合分析

await 不是孤立的,需要与 iowait(CPU 等待 I/O 的时间百分比)、svctm(实际服务时间,现代系统已不准确)、util(磁盘利用率)一起看。如果 await 高但 util 低,可能是有很多小文件碎片导致寻道慢;如果 util 接近 100%,说明磁盘确实被压满了。

从监控到调优:下一步怎么做

配置前的检查

发现 await 偏高后,常见的应对策略包括:

  • 升级硬件:HDD → SSD,SATA SSD → NVMe SSD。
  • 优化应用:减少不必要的磁盘写操作,使用缓存(如 Redis)降低 I/O 压力。
  • 调整内核参数:修改 I/O 调度器,调整 vm.dirty_ratiovm.dirty_background_ratio 等。
  • 分散负载:将高 I/O 的服务分配到不同的物理磁盘或使用 RAID0/10。

但任何调优都应该基于监控数据,而不是盲目操作。Prometheus 的长期记录可以帮助你对比优化前后的效果。

常见问题与避坑

先看关键判断

  • Q:为什么计算出来的 await 有时是负数?
    可能是因为磁盘计数器重置(比如重启或磁盘移除),导致 rate 计算出现短暂异常,通常忽略即可。
  • Q:需要监控所有磁盘吗?
    建议只监控实际存数据的盘(如 sdanvme0n1),忽略 RAM disk 或 loop 设备,否则指标太多且无意义。
  • Q:可以用 iostat 替换吗?
    iostat 是命令行工具,适合临时排查;Prometheus 适合长期趋势和告警。二者互补,推荐都用。

最后提醒:不要只盯着 await 一个指标,它只是硬盘性能的一个“仪表盘”,要真正判断问题,还需要结合上下文。希望本文能帮你建立起对磁盘 I/O 延迟的感性认知和实操能力。把这些步骤跑通后,Prometheus Node基本就能稳定落地。

延伸阅读