最准最轻量的实时磁盘吞吐量监控方式是用 iostat -xmt 1 获取绕过缓存的 rMB/s 和 wMB/s 物理层数据,配合 watch 或 gnuplot 实时绘图,避免使用 dstat 等含缓存统计的工具。

直接用 iostat -xmt 1 持续输出,配合脚本或终端工具转成曲线,是获取实时磁盘吞吐量变化最准、最轻量的方式。关键不是“画图”,而是先拿到真实、绕过缓存的物理层数据——只有 rMB/s 和 wMB/s 字段才代表实际落到磁盘的读写带宽。
用 iostat 抓真实吞吐数据流
运行 iostat -xmt 1(-x 扩展模式、-m 单位为 MB/s、-t 打时间戳、1 秒刷新)后,你会看到每行都包含 rMB/s(真实读吞吐)、wMB/s(真实写吞吐)和 %util 等字段。这些值已跳过 page cache、RAID 卡 write-back 缓存等干扰,可直接对标 SSD 厂商标称带宽。
- 若只关注某块盘(如
/dev/nvme0n1),加设备路径:iostat -xmt 1 /dev/nvme0n1 - 想看所有分区,用
iostat -xmt 1 -p ALL - 避免被 CPU 行干扰,加
-d参数:iostat -xmdt 1
把文本流转成可视曲线
不需要图形界面也能快速出趋势:终端里用 watch 或管道配合 gnuplot 就能生成动态曲线。
- 简单盯屏:运行
watch -n 1 'iostat -xm 1 1 | grep nvme0n1 | awk '\''{print \$4,\$5}'\'' ',实时滚动显示读/写 MB/s 数值 - 本地绘图:用
gnuplot实时画线(需提前安装),例如:iostat -xmt 1 | awk '/nvme0n1/{print \$2,\$4,\$5}' | gnuplot -e "set terminal dumb; plot '-' using 2:3 with lines title 'Read', '' using 2:4 with lines title 'Write'" - 导出 CSV 分析:用
awk提取时间戳和吞吐字段,重定向到文件,后续用 Excel 或 Python 绘图
别用 dstat 或 iftop 类工具替代
dstat -D sda 显示的 disk read/disk write 是 VFS 层统计,含大量 page cache 命中,缓存热时可能显示 300 MB/s,而 iostat -x 同一时刻显示为 0;它也没有 r_ios、avgqu-sz 等排队指标,无法判断是真带宽瓶颈还是队列堵死。真正要定位“为什么吞吐上不去”,必须切回 iostat -x + iotop -o 组合。
需要长期记录时用 sar
sar -d 1 可按秒采集历史数据,但默认不开启磁盘收集。需确认 /etc/default/sysstat 中 ENABLED="true",且 /etc/cron.d/sysstat 正常运行。采集后执行 sar -d -f /var/log/sysstat/saXX 查看某天的 rd_sec/s 和 wr_sec/s(注意单位是扇区/秒,除以 2048 得 MB/s)。适合事后回溯,不适合盯实时曲线。


















