潇湘夜雨移动版

主页 > 系统 >

iostat命令监控磁盘io

对于I/O-bond类型的进程,我们经常用iostat工具查看进程IO请求下发的数量、系统处理IO请求的耗时,进而分析进程与操作系统的交互过程中IO方面是否存在瓶颈。
 
 
 
下面通过iostat命令使用实例,说明使用iostat查看IO请求下发情况、系统IO处理能力的方法,以及命令执行结果中各字段的含义。
 
 
 
1.不加选项执行iostat
 
我们先来看直接执行iostat的输出结果:
 
 
[yanfa@test ~]$ iostat 
Linux 2.6.32-642.13.1.el6.x86_64 (test) 08/04/2017 _x86_64_ (2 CPU)
 
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
   7.73    0.00    1.22    0.26    0.00   90.79
 
Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
vda               1.31        24.20        19.31  241912402  193052440
vdb              10.77        13.53       178.52  135242764 1784372448
 
单独执行iostat,显示的结果为从系统开机到当前执行时刻的统计信息。以上输出中,除最上面指示系统版本、主机名和日期的一行外,另有两部分:
 
avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值
 
Device: 各磁盘设备的IO统计信息
 
 
 
对于cpu统计信息一行,我们主要看iowait的值,它指示cpu用于等待io请求完成的时间。Device中各列含义如下:
 
Device: 以sdX形式显示的设备名称
tps: 每秒进程下发的IO读、写请求数量
Blk_read/s: 每秒读扇区数量(一扇区为512bytes)
Blk_wrtn/s: 每秒写扇区数量
Blk_read: 取样时间间隔内读扇区总数量
Blk_wrtn: 取样时间间隔内写扇区总数量
我们可以使用-c选项单独显示avg-cpu部分的结果,使用-d选项单独显示Device部分的信息。
 
 
 
2.指定采样时间间隔与采样次数
 
与sar命令一样,我们可以以"iostat interval [count] ”形式指定iostat命令的采样间隔和采样次数:
 
 
linux # iostat -d 1 2
Linux 2.6.16.60-0.21-smp (linux)     06/13/12
 
Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.55         8.93        36.27    6737086   27367728
sdb               0.00         0.00         0.00        928          0
 
Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               2.00         0.00        72.00          0         72
sdb               0.00         0.00         0.00          0          0
 
以上命令输出Device的信息,采样时间为1秒,采样2次,若不指定采样次数,则iostat会一直输出采样信息,直到按”ctrl+c”退出命令。注意,第1次采样信息与单独执行iostat的效果一样,为从系统开机到当前执行时刻的统计信息。
 
 
 
3.以kB为单位显示读写信息(-k选项)
 
我们可以使用-k选项,指定iostat的部分输出结果以kB为单位,而不是以扇区数为单位:
 
 
[root@mysqlserver1 ~]#  iostat -d -k 2 
Linux 2.6.32-642.13.1.el6.x86_64 (mysqlserver1) 08/04/2017 _x86_64_ (2 CPU)
 
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda               0.13         0.72         1.80    8820649   22021384
vdb               0.85         0.14        11.74    1771811  143910722
 
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda              14.50       348.00         0.00        696          0
vdb             731.00         0.00     20806.00          0      41612
 
以上输出中,kB_read/s、kB_wrtn/s、kB_read和kB_wrtn的值均以kB为单位,相比以扇区数为单位,这里的值为原值的一半(1kB=512bytes*2)
 
 
 
4.更详细的io统计信息(-x选项)
 
为显示更详细的io设备统计信息,我们可以使用-x选项,在分析io瓶颈时,一般都会开启-x选项:
 
 
[root@mysqlserver1 ~]#  iostat -d -k 2 -x /dev/vdb
Linux 2.6.32-642.13.1.el6.x86_64 (mysqlserver1) 08/04/2017 _x86_64_ (2 CPU)
 
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vdb               0.00     2.67    0.00    0.85     0.14    11.74    27.81     0.00    2.30    2.61    2.30   0.64   0.05
 
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vdb               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
 
linux # iostat -x -k -d 1
Linux 2.6.16.60-0.21-smp (linux)     06/13/12
 
……
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00  9915.00    1.00   90.00     4.00 34360.00   755.25    11.79  120.57   6.33  57.60
以上各列的含义如下:
 
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s: 每秒对该设备的写请求被合并次数
r/s: 每秒完成的读次数
w/s: 每秒完成的写次数
rkB/s: 每秒读数据量(kB为单位)
wkB/s: 每秒写数据量(kB为单位)
avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
avgqu-sz: 平均等待处理的IO请求队列长度
await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
svctm: 平均每次IO请求的处理时间(毫秒为单位)
%util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
 
 
对于以上示例输出,我们可以获取到以下信息:
 
每秒向磁盘上写30M左右数据(wkB/s值)
每秒有91次IO操作(r/s+w/s),其中以写操作为主体
平均每次IO请求等待处理的时间为120.57毫秒,处理耗时为6.33毫秒
等待处理的IO请求队列中,平均有11.79个请求驻留
 
 
以上各值之间也存在联系,我们可以由一些值计算出其他数值,例如:
 
util = (r/s+w/s) * (svctm/1000)
 
对于上面的例子有:util = (1+90)*(6.33/1000) = 0.57603
 
(责任编辑:liangzh)