iostat 看 Linux 硬盘 IO 性能
iostat 是排查磁盘压力时最常用的工具之一。它输出的不是'磁盘忙不忙'这么简单,而是把读写请求、队列长度、等待时间、服务时间这些关键指标摊开给你看。只要把几个核心字段理解透,很多 I/O 慢的问题其实一眼就能看出方向。
下面把常见字段按实际分析时更顺手的方式梳理一下。
常见字段含义
rrqm/s:每秒合并的读请求数,等价于delta(rmerge)/swrqm/s:每秒合并的写请求数,等价于delta(wmerge)/sr/s:每秒完成的读 I/O 次数,等价于delta(rio)/sw/s:每秒完成的写 I/O 次数,等价于delta(wio)/srsec/s:每秒读扇区数,等价于delta(rsect)/swsec/s:每秒写扇区数,等价于delta(wsect)/srkB/s:每秒读 KB 数,通常是rsec/s的一半,因为每个扇区 512 字节wkB/s:每秒写 KB 数,通常是wsec/s的一半avgrq-sz:平均每次 I/O 请求的数据量,单位是扇区avgqu-sz:平均 I/O 队列长度await:平均每次 I/O 的等待时间,单位毫秒svctm:平均每次 I/O 的服务时间,单位毫秒%util:设备在采样周期内有多少时间处于忙碌状态
怎么看这些指标
%util 接近 100% 时,通常说明 I/O 请求已经把磁盘打满了,磁盘很可能成了瓶颈。实际排查里,如果 idle 低于 70%,I/O 压力一般就不算轻了,尤其是读写混合场景,wa 往往也会明显升高。这个时候常常会结合 vmstat 一起看,重点关注 b 和 wa。
svctm 和 await 也很关键。
svctm主要反映设备本身处理一个 I/O 请求要花多久,通常和磁盘性能关系更直接await则包含了排队等待时间,所以它往往比svctm更大
如果 svctm 和 await 很接近,说明请求基本不怎么排队,I/O 比较顺畅。反过来,如果 await 明显大于 svctm,大概率是队列堆起来了,应用层感知到的响应时间也会变慢。这个时候,常见的处理思路包括:换更快的磁盘、调整内核 I/O 调度算法、优化应用访问模式,或者连带检查 CPU 是否成为新的瓶颈。
avgqu-sz 也值得看,但它是一个时间平均值,适合判断总体负载,不太适合直接拿来解释瞬时峰值。
一个更容易理解的类比
把 I/O 系统想成超市收银台会更直观一些。
r/s + w/s:来结账的人数avgqu-sz:排队的人数svctm:收银员的处理速度await:顾客平均等多久avgrq-sz:每个人买了多少东西- :收银台前有人排队的时间占比

