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的总和)
- 显示详细信息 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。
- 以上參數綜合應用 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 的速度和响应时间.
- 總結
如果 %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才是关键点。对于顺序读写频繁的业务,
需要传输大块数据的,如视频点播、文件同步,关注的是磁盘的吞吐量。