什么是 diskstats
/proc/diskstats 是内核按块设备导出的累计 IO 计数器,iostat、sar -d 这类工具都从这里取数。每行除设备名外是若干组字段:读完成次数与合并次数、读扇区数、写完成次数与合并次数、写扇区数、正在进行中的请求数、IO 累计耗时、加权耗时。因为都是累计值,判读必须做两次采样求差,单次快照没有意义。
基本信息
| 路径 | /proc/diskstats,全系统一张表 |
|---|---|
| 设备粒度 | 物理盘 sd*/nvme*/vd*,以及分区与 dm-* 映射 |
| 扇区单位 | 通常为 512 字节,NVMe 亦按 512 计数 |
| 采集 | cat /proc/diskstats 或直接看派生工具 |
| 派生工具 | iostat -x、sar -d、node_exporter 的 node_disk_* |
典型使用场景
- 自研采集器或脚本需要设备级 IO 指标时直接从文件取值
- 核对监控面板:iostat 的 %util、await 与磁盘计数是否口径一致
- 排查 IO 突增:按设备比对读写扇区增速,定位是哪块盘在忙
- 分区与 LVM/多路径环境下分辨真实设备与逻辑设备的映射关系
- 容器与虚拟化节点上确认吞吐归属到哪块设备
采样对比
采样对比
cat /proc/diskstats | head # 先看整体格式
awk '{print $3, $4, $6, $8, $10}' /proc/diskstats | head # 设备名与关键列
awk '$3=="sda"' /proc/diskstats # 只看某块盘
# 两次采样求差才是速率:
cat /proc/diskstats > /tmp/ds1; sleep 5; cat /proc/diskstats > /tmp/ds2
paste /tmp/ds1 /tmp/ds2 | head -3 # 人工对比或用工具算增量
# 更省事:iostat -x 1 5 会直接算好速率与利用率关键列逐列读法
| 字段位 | 含义 | 异常信号 |
|---|---|---|
| 第 4 列 | 读完成次数 | 与业务 QPS 严重不匹配要查缓存命中 |
| 第 6 列 | 读扇区数 | 乘 512 得字节数,用于算吞吐 |
| 第 10 列 | 写扇区数 | 突增常见于日志放大与刷盘策略变化 |
| 第 12 列 | 进行中请求数 | 长期非 0 偏高说明设备接近饱和 |
| 第 13 列 | IO 累计毫秒 | 与第 12 列结合判断并发度 |
字段数量随内核版本扩展(后续增加丢弃、刷盘等计数),按固定列位写死的解析脚本换内核后容易错位,建议按 tools/github 维护的字段表对齐。
多路径或 RAID 场景下,分区行与 dm-* 行会重复统计同一份 IO,做汇总时只取最底层设备,避免吞吐被算成两倍。