首页/系统/Linux 内核与性能调优速查//proc/diskstats 字段速览

/proc/diskstats 字段速览

每设备一行:读完成数、读合并、读扇区、写完成数、写扇区、在途请求、IO 时间与加权时间等,是 iostat/sar 的数据源。

什么是 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,做汇总时只取最底层设备,避免吞吐被算成两倍。

易错点

  • 字段数量随内核版本扩展,脚本解析固定列位容易失效,升级内核后要回归验证
  • 直接手算误差大:累计值必须两次采样求差,排查用 iostat 派生结果更快也更少踩坑
  • 把分区行与底层设备行一起相加会重复计数,多路径与 LVM 环境下尤其明显
  • 扇区单位按 512 字节换算,部分工具另按 1024 字节显示 KiB,口径不一致会得出错误的吞吐结论

数据来源与参考

  • Linux 内核 Documentation/admin-guide/iostats.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌