iostat、iotop、dd和fio是linux磁盘性能监控与测试的核心命令:iostat查设备吞吐与忙闲状态,iotop定位高i/o进程,dd测裸设备顺序吞吐(需direct绕缓存),fio模拟真实业务随机负载并提供iops、延迟等关键指标。

终端命令是监控磁盘读写性能最直接、低开销的方式,尤其适合长期观察、脚本集成或排除图形界面干扰的场景。关键不在于装多少工具,而在于选对命令、看懂指标、避开缓存干扰。
iostat:查吞吐与设备忙闲状态
iostat 是 sysstat 套件中的核心工具,从内核 /proc/diskstats 实时采集数据,输出每秒读写量(MB/s)、I/O 请求次数(tps)、平均队列长度等。它不显示进程,但能快速定位哪块盘在拖慢系统。
- 基础用法:
iostat -d -k 2—— 每2秒刷新一次,单位为 KB/s,只显示设备行(排除 CPU) - 重点关注 %util 列:持续高于 80% 表示该磁盘已接近满负荷;若同时 avgqu-sz(平均队列长度)大于 1(SSD)或大于 2(HDD),说明请求开始排队,响应延迟上升
- 只盯某块盘(如外接 SSD):
iostat -xk 1 /dev/disk3,-x 启用扩展统计,-k 用 KB 单位,1 表示每秒刷新
iotop:找谁在疯狂读写
iostat 告诉你“硬盘忙”,iotop 告诉你“谁让它忙”。它按进程或线程维度实时列出每秒读写量,直接关联到具体程序。
- 安装后以 root 运行:
sudo iotop -o,-o 参数只显示当前有 I/O 活动的进程,避免噪音干扰 - 观察 DISK READ 和 DISK WRITE 两列,单位默认 KB/s;数值跳变剧烈的进程就是实时 I/O 消耗大户
- 按 P 键可按 I/O 百分比排序,按 Shift+O 可按带宽降序排列,快速锁定前几名
dd:测裸设备原始吞吐能力
dd 绕过页缓存(使用 oflag=direct 或 iflag=direct),直接对磁盘执行顺序读写,结果反映物理层极限,而非缓存加速后的“假高分”。
- 测写入:
dd if=/dev/zero of=/tmp/testwrite bs=1M count=1024 oflag=direct—— 写 1GB 零数据,强制直写磁盘 - 测读取:先运行
sync && echo 3 | sudo tee /proc/sys/vm/drop_caches清缓存,再执行dd if=/tmp/testwrite of=/dev/null bs=1M iflag=direct - 结果看最后一行的 bytes/sec 值:HDD 通常低于 100 MB/s,SATA SSD 约 300–550 MB/s,NVMe SSD 应达 1500 MB/s 以上
fio:模拟真实业务负载
dd 只测顺序大块读写,fio 能覆盖随机读写、混合读写、不同队列深度(iodepth)、多种块大小(如 4K),更贴近数据库、虚拟机等实际负载。
- 简单测试随机写(4K 块,队列深度 32):
fio --name=randwrite --ioengine=libaio --iodepth=32 --rw=randwrite --bs=4k --direct=1 --size=2G --runtime=60 --time_based - 关注输出中的 iops(每秒操作数)和 lat(平均延迟):SSD 随机写 IOPS 应远高于 HDD;若延迟长期 >10ms,需排查驱动、控制器或硬件问题
- 搭配
--output-format=json可导出结构化结果,方便脚本解析或绘图











