iostat 是 Linux 系统自带的 I/O 统计工具(sysstat 包的一部分),用于实时监控 CPU 使用率和磁盘读写负载。当系统响应变慢、应用卡顿时,iostat 可以快速帮你判断瓶颈是否出在磁盘 I/O 上。
基本用法
iostat [选项] [间隔秒数] [次数]
若不加参数,iostat 会输出自系统启动以来的平均 CPU 和磁盘统计,通常参考意义不大。生产中多用 -x(扩展统计)配合时间间隔。
常用选项:
-x:显示详细的磁盘扩展统计(推荐)。-k/-m:以 KB/s / MB/s 为单位显示读写速率。-p sda:仅显示指定磁盘(如 sda)的统计。-t:在每行输出中加入时间戳,便于事后分析。
关键指标解读(iostat -x 1)
执行 iostat -x 1 会每秒输出一次所有磁盘(包括多块盘和分区)的详细数据,关注以下列:
r/s/w/s:每秒读/写请求次数(IOPS)。rMB/s/wMB/s:每秒读/写数据量(吞吐量)。await:每个 I/O 请求的平均等待时间(单位毫秒),等于在队列中等待加上实际服务时间。对于机械硬盘,这个值若持续高于 20~30ms,说明磁盘已接近繁忙。%util:设备带宽利用率,表示磁盘忙于处理 I/O 的时间百分比。注意:对于 SSD 或 RAID 卡,这个值可能接近 100% 但实际性能并未饱和,因为并发处理能力强;对于单块机械盘,接近 100% 几乎等同于 I/O 饱和。svctm(旧版):平均服务时间,新版 sysstat 已弃用此字段,建议忽略。aqu-sz:平均 I/O 队列长度,过大说明请求堆积。
实战示例
场景:数据库服务器周期性卡顿,怀疑磁盘 I/O 瓶颈。
iostat -x 1 5
连续 5 次,每秒输出一次当前磁盘统计。如果看到某块磁盘 await 波动到几百毫秒,同时 %util 持续接近 100%,则确认存在磁盘 I/O 瓶颈。进一步可结合 iostat -p 定位到具体分区,再使用 iotop 找出是哪个进程大量读写。
快速判断口诀:
- 机械硬盘:
%util> 80% 且await> 30ms → 磁盘繁忙。 - SSD/NVMe:不能只看
%util,应结合await和应用程序的实际响应延迟判断,很多 SSD 在%util100% 时依旧能提供低延迟服务。
注意事项
iostat数据来自/proc/diskstats,第一次输出是系统启动以来的累加均值,因此实际监控时务必提供间隔参数,丢弃第一行,从第二次输出开始看瞬时值。- 对于使用了 LVM、mdadm 或云盘虚拟设备的场景,
iostat依然能反映设备层的状况,但需关注映射关系,必要时同时对虚拟设备和底层物理设备进行观察。
掌握 iostat,你就拥有了快速判断磁盘瓶颈的第一手数据,结合其他工具(如 vmstat、iotop)可以快速完成 I/O 层面的性能分析。