监控磁盘IO
一、磁盘IO核心指标
在磁盘测试中最关心的几个指标分别为:iops(每秒执行的IO次数)、bw(带宽,每秒的吞吐量)、lat(每次IO操作的延迟)。
磁盘的 IOPS,也就是在一秒内,磁盘进行多少次 I/O 读写。
磁盘的吞吐量,也就是每秒磁盘 I/O 的流量,即磁盘写入加上读出的数据的大小。
当每次IO操作的block较小时,如512bytes/4k/8k等,此时更能体现的是磁盘读写的频率特性,即磁盘的IOPS,所以这时测试的是性能指标IOPS。
当每次IO操作的block较大时,如256k/512k/1M等,此时更能体现的是磁盘最大允许的带宽流量特性,即磁盘的吞吐量bw,所以这时测试的是性能指标BW。
因此,我们会认为 IOPS 和吞吐量的数值越高越好。实际上,对于一个磁盘来讲,这两个参数均有其最大值,而且这两个参数也存在着一定的关系。
二、IOPS测试的影响因素
另外,对于同一个磁盘(或者 LUN),随着每次 I/O 读写数据的大小不同,IOPS 的数值也不是固定不变的。
例如,每次 I/O 写入或者读出的都是连续的大数据块,此时 IOPS 相对会低一些;在不频繁换道的情况下,每次写入或者读出的数据块小,相对来讲 IOPS 就会高一些。
也就是说,IOPS 也取决于I/O块的大小,采用不同I/O块的大小测出的IOPS值是不同的。 对一个具体的IOPS, 可以了解它当时测试的I/O块的尺寸。
三、监控linux磁盘IO工具:iostat
Linux系统中的 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具具备对系统磁盘操作活动监视的功能呢。它可以采集并统计磁盘活动情况,同时会汇报出CPU的使用情况。iostat是sysstat工具集的一个工具,安装方式如下:
#Centos的安装方式是:
yum install sysstat
#Ubuntu的安装方式是:
apt install sysstat
安装成功后使用下列命令查看磁盘使用情况:
iostat -dx
结果如下:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
loop0 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
vda 0.00 1.00 0.00 4.00 0.00 20.00 10.00 0.02 5.00 0.00 5.00 5.00 2.00
结果分析:
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)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的。即 delta(use)/s/1000 (因为use的单位为毫秒)
如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈。
%util高于30,IO压力就较大了,一般读取速度有较多的wait.
如果想连续测试多次磁盘IO的情况,可用如下命令:
iostat -dkx 1 5
#参数1:每隔1s统计一次
#参数5:统计5次
接下来,我们用实际的例子来测试一下磁盘实时使用情况和性能,并实际使用iostat进行分析。
四、测试磁盘读写性能并利用iostat实时获取磁盘使用情况
1、写入性能
首先开一个控制台利用dd命令进行文件写入:
root@27-58:~# dd if=/dev/zero of=./a.dat bs=8k count=1M oflag=direct
此时,再开一个控制台利用iostat命令查看磁盘的使用情况
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
loop0 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
vda 0.00 0.00 0.00 1057.00 0.00 8456.00 16.00 0.90 0.86 0.00 0.86 0.85 92.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
loop0 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
vda 0.00 0.00 0.00 1057.00 0.00 8456.00 16.00 0.90 0.86 0.00 0.86 0.85 92.00
可以看到磁盘的利用率已经达到92%(%util=92%),每秒写入8456K字节数据。
性能测试结果:
root@27-58:~# dd if=/dev/zero of=./a.dat bs=8k count=1M oflag=direct
^C469480 0 records in
469480 0 records out
3845980160 bytes (3.8 GB, 3.6 GiB) copied, 272.613 s, 14.1 MB/s
2、读性能
同样在一个控制台利用dd命令进行一直读文件测试,此时在另一个控制台用: iostat -dkx 1 5 命令进行测试:
结果如下:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
loop0 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
vda 0.00 16.00 352.00 8.00 2816.00 88.00 16.13 1.07 3.01 2.85 10.00 2.74 98.80
看到持续的读文件时,磁盘IO利用率达到98%,磁盘处于满负荷状态。
读性能的最终测试结果:
root@27-58:~# dd if=./a.dat of=/dev/null bs=8k count=1M iflag=direct
469480 0 records in
469480 0 records out
3845980160 bytes (3.8 GB, 3.6 GiB) copied, 164.976 s, 23.3 MB/s
总结:以上只是测IOPS,因为设置的block比较小,调大之后就可以测试磁盘IO的bw了。
喜欢本文的朋友,欢迎关注、转发、评论,让我们一起成为有智慧的架构师!