对于I/O-bond类型的进程,咱们常常用iostat工具查看进程IO请求下发的数量、系统处理IO请求的耗时,进而分析进程与操做系统的交互过程当中IO方面是否存在瓶颈。linux
下面经过iostat命令使用实例,说明使用iostat查看IO请求下发状况、系统IO处理能力的方法,以及命令执行结果中各字段的含义。ios
1.不加选项执行iostat工具
咱们先来看直接执行iostat的输出结果:操作系统
linux # iostat Linux 2.6.16.60-0.21-smp (linux) 06/12/12 avg-cpu: %user %nice %system %iowait %steal %idle 0.07 0.00 0.05 0.06 0.00 99.81 Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn sda 0.58 9.95 37.47 6737006 25377400 sdb 0.00 0.00 0.00 824 0
单独执行iostat,显示的结果为从系统开机到当前执行时刻的统计信息。以上输出中,除最上面指示系统版本、主机名和日期的一行外,另有两部分:队列
avg-cpu: 整体cpu使用状况统计信息,对于多核cpu,这里为全部cpu的平均值进程
Device: 各磁盘设备的IO统计信息it
对于cpu统计信息一行,咱们主要看iowait的值,它指示cpu用于等待io请求完成的时间。Device中各列含义以下:io
咱们能够使用-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为单位,而不是以扇区数为单位:
linux # iostat -d -k Linux 2.6.16.60-0.21-smp (linux) 06/13/12 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.55 4.46 18.12 3368543 13686096 sdb 0.00 0.00 0.00 464 0
以上输出中,kB_read/s、kB_wrtn/s、kB_read和kB_wrtn的值均以kB为单位,相比以扇区数为单位,这里的值为原值的一半(1kB=512bytes*2)
4.更详细的io统计信息(-x选项)
为显示更详细的io设备统计信息,咱们能够使用-x选项,在分析io瓶颈时,通常都会开启-x选项:
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
以上各列的含义以下:
对于以上示例输出,咱们能够获取到如下信息:
以上各值之间也存在联系,咱们能够由一些值计算出其余数值,例如:
util = (r/s+w/s) * (svctm/1000)
对于上面的例子有:util = (1+90)*(6.33/1000) = 0.57603