不能。iostat -dx 1 只能持续输出滚动的文本快照,本身没有时间轴、不保留历史记录,也不具备绘图能力;如果想查看磁盘读写的实时变化趋势,必须结合 awk、date 等工具先采集数据,再自行做可视化分析。

iostat -dx 1 能不能直接画出实时走势?
不能。iostat -dx 1 输出的只是连续刷新的文本结果,不带时间轴、不保存历史数据,也不会直接生成图表——它本质上是“快照流”,而不是可直接展示磁盘读写趋势的“时序图”。如果你想看 Linux 磁盘 IO 的实时走势,就需要先手动采样,再把数据导入图表工具进行可视化。
怎么用 pidstat -d 1 抓进程级 IO 时间序列?
如果你更关注进程级磁盘读写监控,并且希望结果足够准确、上手成本又低,那么 pidstat -d 1 通常是最实用的方案。它默认按秒采样,便于持续观察进程 IO 变化;同时支持直接重定向输出,核心字段如 rkB/s 和 wkB/s 也能直观反映真实的磁盘读写速率,适合用于实时监控与后续数据分析。
- 必须指定采样间隔,
pidstat -d如果不带参数会立即退出;而pidstat -d 0会进行高频采样,可能导致终端卡顿,严重时甚至引发 OOM - 推荐使用
pgrep -f查找目标 PID,例如:pidstat -d 2 -p "$(pgrep -f 'nginx')",相比ps aux | grep更稳定,也更不容易误匹配 - 输出默认不一定包含明确的时间列,可以加
-l(long format)或结合date自行补时间戳:while true; do echo "$(date '+%H:%M:%S'),$(pidstat -d 1 1 | awk '/^[0-9]/ {print $4","$5}')"; sleep 1; done
为什么不用 iotop -a 或 vmstat 看走势?
这里要先明确一个关键区别:iotop -a 显示的是从进程或工具启动时开始累计的 IO 总量,并不是实时读写速率;而 vmstat 1 里的 bi/bo 则是以 512 字节块为单位的系统级汇总数据,不仅可能混入 Swap 影响、没有具体磁盘设备维度,还缺少适合直接作图的时间戳。因此,这两种工具都不适合直接用来绘制秒级的磁盘 IO 趋势图。
iotop -a的 DISK READ/WRITE 列虽然会自动按 B/K/M/G 缩放单位,但本质上展示的是累计值,若要算实时速率只能手动做差,而且结果还受 iotop 运行时长影响vmstat 1输出中的bi和bo反映的是整个系统层面的读写情况,无法细分到具体设备(如nvme0n1)或某个进程- 这两者都不原生支持 CSV 输出,后续解析和自动化处理成本较高,不适合长期采集实时 IO 数据
最简可行的实时走势采集脚本长什么样?
最简单可行的方法,是用 iostat -dxk 1 采集设备级磁盘 IO 数据,或者用 pidstat -d 1 采集进程级 IO 数据,再配合 awk 提取关键字段、用 date 补上时间戳。这样得到的结果既可以直接喂给 gnuplot,也可以导入 Excel、CSV 或其他可视化工具,快速画出实时读写曲线。
- 设备级示例(抓
sda的每秒写入 KB):iostat -dxk 1 | awk '/^sda[[:space:]]/ {print strftime("%H:%M:%S"), $3}' - 进程级示例(抓 PID 1234 的真实磁盘写入量):
while true; do echo "$(date +%s),$(awk '/write_bytes/ {print $2}' /proc/1234/io 2>/dev/null)"; sleep 1; done - 注意:
/proc/[pid]/io里的write_bytes表示内核提交到块层的字节数,并不是 page cache 层面的写入量,因此它更接近底层物理磁盘的实际负载
read_bytes 和 write_bytes 都只是单调递增计数器,只有对相邻两次采样结果做差,才有实际分析意义;同时,两次采样之间的时间间隔还必须尽量稳定,否则计算出来的磁盘读写速率就会失真。