Linux的IO性能监控iostat详解

1.iostat常用命令格式如下:

iostat [参数] [时间] [次数]

命令参数说明如下:
-c 显示CPU使用情况
-d 显示磁盘使用情况
-k 以K为单位显示
-m 以M为单位显示
-N 显示磁盘阵列(LVM) 信息
-n 显示NFS使用情况
-p 可以报告出每块磁盘的每个分区的使用情况
-t 显示终端和CPU的信息
-x 显示详细信息

2.基本使用 iostat -d -k 2 3 或 iostat -dk 2 3
参数
-d 表示,显示设备(磁盘)使用状态;
-k某些使用block为单位的列强制使用Kilobytes为单位;
2 3表示,数据显示每隔2秒刷新一次,共显示3次 【第一次數據忽略】

Linux 3.10.0-862.el7.x86_64 (ORACLE122.COM)     07/30/2021  _x86_64_    (16 CPU)
#以下第一段 忽略
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             545.83       694.65      2111.48 5519125437 16776045012
dm-0            292.09       694.60      2111.24 5518687672 16774151148
dm-1              0.07         0.05         0.23     408840    1840520
dm-2              0.00         0.00         0.00      15312      35828

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             309.00         4.00      1228.00          8       2456
dm-0            155.00         4.00      1228.00          8       2456
dm-1              0.00         0.00         0.00          0          0
dm-2              0.00         0.00         0.00          0          0

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             353.00         0.00      1068.00          0       2136
dm-0            177.00         0.00      1068.00          0       2136
dm-1              0.00         0.00         0.00          0          0
dm-2              0.00         0.00         0.00          0          0

tps:每秒I/O数(即IOPS。磁盘连续读和连续写之和)
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数据量;这些单位都为Kilobytes。

上面的例子中,我们可以看到磁盘sda以及它的各个分区的统计数据,当时统计的磁盘sda总TPS是309-353,下面是各个分区的TPS。
(因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和)

  1. 显示详细信息 iostat -xdk 2 3
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.18     0.18   34.68  511.18   694.73  2111.67    10.28     0.25    0.46    4.67    0.18   0.25  13.46
dm-0              0.00     0.00   34.85  257.26   694.67  2111.44    19.21     0.09    0.30    4.68    1.81   0.46  13.41
dm-1              0.00     0.00    0.01    0.06     0.05     0.23     8.01     0.00   42.81   12.10   49.60   4.70   0.03
dm-2              0.00     0.00    0.00    0.00     0.00     0.00    20.02     0.00    9.50    8.50    9.89   7.01   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00  602.00     0.00  1728.00     5.74     0.17    0.28    0.00    0.28   0.16   9.50
dm-0              0.00     0.00    0.00  302.00     0.00  1728.00    11.44     0.10    0.32    0.00    0.32   0.32   9.55
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    4.50  350.00    48.00   970.00     5.74     0.09    0.24    5.00    0.18   0.10   3.65
dm-0              0.00     0.00    4.50  175.00    48.00   970.00    11.34     0.06    0.32    5.00    0.20   0.21   3.80
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

%util:代表磁盘繁忙程度。100% 表示磁盘繁忙, 0%表示磁盘空闲。

%util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒【本次案例是2秒】,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)

await:IO请求的处理的平均时间(单位:毫秒)。这里可以理解为IO的响应时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了

r_await:每个读操作平均所需的时间;不仅包括硬盘设备读操作的时间,还包括了在kernel队列中等待的时间

w_await:每个写操作平均所需的时间;不仅包括硬盘设备写操作的时间,还包括了在kernel队列中等待的时间

rrqm/s:每秒这个设备相关的读取请求有多少被Merge了(当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge);wrqm/s:每秒这个设备相关的写入请求有多少被Merge了。
rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目.即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数.即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数.即 delta(wio)/s
rsec/s: 每秒读扇区数.即 delta(rsect)/s
wsec/s: 每秒写扇区数.即 delta(wsect)/s
rkB/s: 每秒读K字节数.是 rsect/s 的一半,因为每扇区大小为512字节.(需要计算)
wkB/s: 每秒写K字节数.是 wsect/s 的一半.(需要计算)
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区).delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度.即 delta(aveq)/s/1000 (因为aveq的单位为毫秒).
await: 平均每次设备I/O操作的等待时间 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio)

4.获取cpu部分状态值 iostat -c 2 3

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          16.62    0.00    1.52    1.10    0.00   80.77

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          22.62    0.00    9.71    0.38    0.00   67.29

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          19.15    0.00    5.57    0.50    0.00   74.77

cpu属性值说明:
%user:CPU处在用户模式下的时间百分比。
%nice:CPU处在带NICE值的用户模式下的时间百分比。
%system:CPU处在系统模式下的时间百分比。
%iowait:CPU等待输入输出完成时间的百分比。
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idle:CPU空闲时间百分比。

如果%iowait的值过高,表示硬盘存在I/O瓶颈
如果%idle值高,表示CPU较空闲
如果%idle值高但系统响应慢时,可能是CPU等待分配内存,应加大内存容量。
如果%idle值持续低于10,表明CPU处理能力相对较低,系统中最需要解决的资源是CPU。

  1. 以上參數綜合應用 iostat -cxdk 2 3 【去掉最後的 3 則每隔2秒刷一次 = 實時監控】
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          16.62    0.00    1.52    1.10    0.00   80.77

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.18     0.18   34.68  511.17   694.60  2111.55    10.28     0.25    0.47    4.68    0.18   0.25  13.46
dm-0              0.00     0.00   34.84  257.25   694.55  2111.32    19.21     0.09    0.30    4.68    1.81   0.46  13.41
dm-1              0.00     0.00    0.01    0.06     0.05     0.23     8.01     0.00   42.81   12.10   49.60   4.70   0.03
dm-2              0.00     0.00    0.00    0.00     0.00     0.00    20.02     0.00    9.50    8.50    9.89   7.01   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          12.16    0.00    2.24    0.35    0.00   85.24

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.00    0.00  394.00     0.00   916.00     4.65     0.14    0.35    0.00    0.35   0.16   6.20
dm-0              0.00     0.00    0.00  197.00     0.00   916.00     9.30     0.07    0.34    0.00    0.34   0.33   6.45
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           9.11    0.00    1.51    0.38    0.00   89.00

Device:    r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda        1.00  322.50    48.00   796.00     5.22     0.14    0.42    6.00    0.40   0.21   6.70
dm-0       1.00  161.50    48.00   796.00    10.39     0.07    0.45    6.00    0.41   0.40   6.55
dm-1       0.00    0.00    0.00     0.00      0.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-2       0.00    0.00    0.00     0.00      0.00     0.00    0.00    0.00    0.00   0.00   0.00

I/O 系统也和超市排队有很多类似之处:
r/s+w/s 类似于交款人的总数
平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
平均服务时间(svctm:毫秒)类似于收银员的收款速度(收銀員平均收銀耗時) 應該 < await
平均等待时间(await:毫秒)类似于平均每人的等待时间
平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
I/O 操作率 (%util)类似于收款台前有人排队的时间比例.
我们可以根据这些数据分析出 I/O 请求的模式,以及 I/O 的速度和响应时间.

  1. 總結
    如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈.

idle小于70% IO压力就较大了,一般读取速度有较多的wait. 同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)

另外 await 的参数也要多和 svctm 来参考.差的过高就一定有 IO 的问题.svctm(收銀耗時小) 但 await(顧客等待時間長) 不合理

avgqu-sz (平均每人所买的东西多少) 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小.如果数据拿的大,才IO 的数据会高.也可以通过 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s.也就是讲,读定速度是这个来决定的.

另外还可以参考
svctm 一般要小于 await (因为同时等待的请求的等待时间被重复计算了),svctm 的大小一般和磁盘性能有关,CPU/内存的负荷也会对其有影响,请求过多也会间接导致 svctm 的增加.await 的大小一般取决于服务时间(svctm) 以及 I/O 队列的长度和 I/O 请求的发出模式.

如果 svctm 比较接近 await,说明 I/O 几乎没有等待时间;如果 await 远大于 svctm,说明 I/O 队列太长,应用得到的响应时间变慢,如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核 elevator 算法,优化应用,或者升级 CPU.
队列长度(avgqu-sz)也可作为衡量系统 I/O 负荷的指标,但由于 avgqu-sz 是按照单位时间的平均值,所以不能反映瞬间的 I/O 洪水.

别人一个不错的例子.(I/O 系统 vs. 超市排队)
我们在超市排队时,怎么决定该去哪个交款台呢? 首当是看排的队人数,5个人总比20人要快吧? 除了数人头,我们也常常看看前面人购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队排了.还有就是收银员的速度了,如果碰上了连 钱都点不清楚的新手,那就有的等了.另外,时机也很重要,可能 5 分钟前还人满为患的收款台,现在已是人去楼空,这时候交款可是很爽啊,当然,前提是那过去的 5 分钟里所做的事情比排队要有意义 (不过我还没发现什么事情比排队还无聊的).

最后,除了关注指标外,我们更需要结合部署的业务进行分析。对于磁盘随机读写频繁的业务,
比如图片存取、数据库、邮件服务器等,此类业务吗,tps才是关键点。对于顺序读写频繁的业务,
需要传输大块数据的,如视频点播、文件同步,关注的是磁盘的吞吐量。

你可能感兴趣的:(Linux的IO性能监控iostat详解)