一. 引文:
平时查看或者监控磁盘io时,基本上都是用的现成的工具/脚本, 对其了解的还是很浅,特参考一些资料整理了下,留个随笔。
二.磁盘I/O性能指标:
磁盘 I/O 是 Unix/Linux 系统管理中一个非常重要的组成部分。磁盘 I/O 性能监控的指标主要包括:
1:每秒 I/O 数(IOPS 或 tps)
对于磁盘来说,一次磁盘的连续读或者连续写称为一次磁盘 I/O, 磁盘的 IOPS 就是每秒磁盘连续读次数和连续写次数之和。当传输小块不连续数据时,该指标有重要参考意义。
2:吞吐量(Throughput)
指硬盘传输数据流的速度,传输数据为读出数据和写入数据的和。其单位一般为 Kbps, MB/s 等。当传输大块不连续数据的数据,该指标有重要参考作用。
3:平均 I/O 数据尺寸
平均 I/O 数据尺寸为吞吐量除以 I/O 数目,该指标对揭示磁盘使用模式有重要意义。一般来说,如果平均 I/O 数据尺寸小于 32K,可认为磁盘使用模式以随机存取为主;如果平均每次 I/O 数据尺寸大于 32K,可认为磁盘使用模式以顺序存取为主。
4:磁盘活动时间百分比(Utilization)
磁盘处于活动时间的百分比,即磁盘利用率,磁盘在数据传输和处理命令(如寻道)处于活动状态。磁盘利用率与资源争用程度成正比,与性能成反比。也就 是说磁盘利用率越高,资源争用就越严重,性能也就越差,响应时间就越长。一般来说,如果磁盘利用率超过 70%,应用进程将花费较长的时间等待 I/O 完成,因为绝大多数进程在等待过程中将被阻塞或休眠。
5:服务时间(Service Time)
指磁盘读或写操作执行的时间,包括寻道,旋转时延,和数据传输等时间。其大小一般和磁盘性能有关,CPU/ 内存的负荷也会对其有影响,请求过多也会间接导致服务时间的增加。如果该值持续超过 20ms,一般可考虑会对上层应用产生影响。
6:I/O 等待队列长度(Queue Length)
指待处理的 I/O 请求的数目,如果 I/O 请求压力持续超出磁盘处理能力,该值将增加。如果单块磁盘的队列长度持续超过 2,一般认为该磁盘存在 I/O 性能问题。需要注意的是,如果该磁盘为磁盘阵列虚拟的逻辑驱动器,需要再将该值除以组成这个逻辑驱动器的实际物理磁盘数目,以获得平均单块硬盘的 I/O 等待队列长度。
7:等待时间(Wait Time)
指磁盘读或写操作等待执行的时间,即在队列中排队的时间。如果 I/O 请求持续超出磁盘处理能力,意味着来不及处理的 I/O 请求不得不在队列中等待较长时间。
在工作当中通过监控以上指标,将这些指标数值与历史数据,经验数据以及磁盘标称值对比,必要时结合 CPU、内存、交换分区的使用状况,不难发现磁盘 I/O 潜在或已经出现的问题。
三. I/O性能分析常用工具:
Linux 下比较常用的磁盘 I/O 性能监控的命令有两个:iostat 和 sar个人一般使用iostat命令,这里就简单解说下iostat。
执行情况如下:
# iostat -d -x 1 2
Linux 2.6.18-308.24.1.el5 (YZSJHL22-160.opi.com) 04/08/2016Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
vda 0.00 29.00 1.00 42.00 16.00 568.00 13.58 0.64 14.79 0.95 4.10
vda1 0.00 2.00 1.00 5.00 16.00 56.00 12.00 0.09 14.83 4.17 2.50
vda3 0.00 27.00 0.00 37.00 0.00 512.00 13.84 0.55 14.78 0.86 3.20Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
vda 0.00 25.00 1.00 5.00 8.00 240.00 41.33 0.06 9.17 4.50 2.70
vda1 0.00 25.00 0.00 5.00 0.00 240.00 48.00 0.04 8.60 3.00 1.50
vda3 0.00 0.00 1.00 0.00 8.00 0.00 8.00 0.01 12.00 12.00 1.20
参数解析:
rrqm/s 将读入请求合并(当系统调用需要读取数据的时候,VFS(虚拟文件系统)将请求发到各个FS(文件系统),如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并[merge])后,每秒发送到设备的读入请求数.
wrqm/s 将写入请求合并后,每秒发送到设备的写入请求数.
r/s 每秒读操作数(不包含rrqm)
w/s 每秒写操作数(不包含wrqm)
rsec/s 每秒从设备读取的扇区数量。
wsec/s 每秒向设备写入的扇区数量.
avgrq-sz I/O 请求的平均扇区数。
avgqu-sz I/O 请求的平均队列长度。
await I/O 请求的平均等待时间,单位为毫秒
svctm I/O 请求的平均服务时间,单位为毫秒。
%util 处理 I/O 请求所占用的时间的百分比,即设备利用率。s
CPU统计信息参数解读
%user:用户进程使用的CPU使用率百分比
%nice:nice操作所使用的CPU的百分比
%system:系统进程使用的CPU使用率百分比
%iowait :系统输出数据至磁盘时空闲的CPU时间百分比(即IO等待)
%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比
%idle:系统没有任何数据输出至磁盘的CPU时间百分比(即空闲时间)
事实上iostat工具是用过获取/proc/diskstats内容通过计算后显示的磁盘io各种性能指标,/proc/diskstats内容如下:
# cat /proc/diskstats 1 0 ram0 0 0 0 0 0 0 0 0 0 0 01 1 ram1 0 0 0 0 0 0 0 0 0 0 01 2 ram2 0 0 0 0 0 0 0 0 0 0 01 3 ram3 0 0 0 0 0 0 0 0 0 0 01 4 ram4 0 0 0 0 0 0 0 0 0 0 01 5 ram5 0 0 0 0 0 0 0 0 0 0 01 6 ram6 0 0 0 0 0 0 0 0 0 0 01 7 ram7 0 0 0 0 0 0 0 0 0 0 01 8 ram8 0 0 0 0 0 0 0 0 0 0 01 9 ram9 0 0 0 0 0 0 0 0 0 0 01 10 ram10 0 0 0 0 0 0 0 0 0 0 01 11 ram11 0 0 0 0 0 0 0 0 0 0 01 12 ram12 0 0 0 0 0 0 0 0 0 0 01 13 ram13 0 0 0 0 0 0 0 0 0 0 01 14 ram14 0 0 0 0 0 0 0 0 0 0 01 15 ram15 0 0 0 0 0 0 0 0 0 0 07 0 loop0 0 0 0 0 0 0 0 0 0 0 07 1 loop1 0 0 0 0 0 0 0 0 0 0 07 2 loop2 0 0 0 0 0 0 0 0 0 0 07 3 loop3 0 0 0 0 0 0 0 0 0 0 07 4 loop4 0 0 0 0 0 0 0 0 0 0 07 5 loop5 0 0 0 0 0 0 0 0 0 0 07 6 loop6 0 0 0 0 0 0 0 0 0 0 07 7 loop7 0 0 0 0 0 0 0 0 0 0 08 0 sda 31895 7090 918412 24115 3211106 4864266 64625416 5931100 0 3079303 59556228 1 sda1 30169 6665 899298 23208 3054517 4693860 62008352 5731069 0 2995256 57546708 2 sda2 328 30 2864 172 0 0 0 0 0 171 1728 3 sda3 1229 394 14890 661 156589 170406 2617064 200031 0 97750 200706
见上面命令中红下划线标注部分,前三列分别代理注设备号,次设备号和设备名称(下面还有相关分区的信息),后面11列说明如下:
1. 读磁盘的次数,成功完成读的总次数。
2. 合并后读完成次数(为了效率可能会合并相邻的读和写。从而两次4K的读在它最终被处理到磁盘上之前可能会变成一次8K的读,因此只有一次I/O操作。这个域使你知道这样的操作有多频繁)。
3. 读扇区的次数,成功读过的扇区总次数(一个扇区512bytes,可以统计读的数据大小)。
4. 读花费的毫秒数,这是所有读操作所花费的毫秒数(用__make_request()到end_that_request_last()测量)。
5. 写完成次数,成功写完成的总次数。
6. 合并写完成次数
7. 写扇区次数,成功写扇区总次数。
8. 写操作花费的毫秒数,这是所有写操作所花费的毫秒数(用__make_request()到end_that_request_last()测量)。
9. 正在处理的输入/输出请求数-I/O的当前进度,只有这个域应该是0。当请求被交给适当的request_queue_t时增加和请求完成时减小。
10. 输入/输出操作花费的毫秒数,这个域会增长只要field 9不为0。
11. 输入/输出操作花费的加权毫秒数, 花在I/O操作上的毫秒数,在每次I/O开始,I/O结束,I/O合并时这个域都会增加。这可以给I/O完成时间和存储那些可以累积的提供一个便利的测量标准。
如不使用iostat查看io性能, 可自行通过/proc/diskstats查看(思路:当前值-上一秒值=每秒的值)