直接读取/proc/diskstats按时间采样是Linux下绘制磁盘读写趋势图最底层、最可控的方式,核心是计算两次采样间字节数差值除以真实时间间隔得到B/s速率,并用索引9和10字段获取累计读写字节数。

直接读取 /proc/diskstats 并按时间采样,是 Linux 下绘制磁盘读写趋势图最底层、最可控的方式。它不依赖 iostat 或图形工具,适合嵌入监控脚本或自定义可视化系统。
明确你要画什么数据
读写趋势图本质是「时间」vs「字节数变化率」的二维曲线。关键不是原始累计值,而是: – 每次采样得到当前累计读/写字节数(单位:字节) – 两次采样做差,除以时间间隔 → 得到 B/s(或 KB/s、MB/s) – 把这一速率值连成线,就是趋势图
- 读吞吐 = (read_bytes_now − read_bytes_before) ÷ Δt
- 写吞吐 = (write_bytes_now − write_bytes_before) ÷ Δt
- 推荐 Δt ≥ 100ms;太短易得 0,太长则丢失瞬态峰值
解析 /proc/diskstats 的正确字段
该文件每行代表一个块设备,字段按空格/制表符分隔,**索引从 0 开始**。你需要的是:
- 第 2 列(索引 2):设备名(如
sda、nvme0n1),用于过滤目标磁盘 - 第 9 列(索引 9):累计读取字节数(
read_bytes),Linux 2.6+ 内核已直接提供字节数,无需再 ×512 - 第 10 列(索引 10):累计写入字节数(
write_bytes),同上 - 注意跳过空行、注释行(以 # 开头)、以及分区行(如
sda1、nvme0n1p1),只保留主设备名
手动采集并组织时序数据
用循环 + 计时器持续读取,保存为时间戳 + 读写速率的结构化记录。例如(伪代码逻辑):
- 初始化:读一次
/proc/diskstats,提取sda的 read_bytes 和 write_bytes,记下当前steady_clock::now() - 进入循环:等待 1 秒 → 再读一次 → 算差值 → 除以真实耗时(非固定 1s)→ 得到本次 B/s
- 把结果存入数组或写入 CSV:
timestamp,read_Bps,write_Bps - 建议缓存最近 300–600 个点(即 5–10 分钟),避免内存无限增长
导出数据后绘图(命令行或轻量脚本)
有了 CSV 文件,绘图非常简单:
- 用 gnuplot(终端快速出图):
gnuplot -e "set terminal png; set output 'io_trend.png'; plot 'data.csv' using 1:2 with lines title 'Read', '' using 1:3 with lines title 'Write'" - 用 Python + matplotlib(更灵活):读 CSV 后调用
plt.plot(df['ts'], df['read'])即可生成带坐标轴、图例的 PNG/SVG - 若对接 Grafana:将数据喂给 Prometheus(用 node_exporter 自带 diskstats collector)或自建 exporter,Grafana 原生支持时间序列图表

















