iostat命令详解(转)


iostat

iostat用于输出CPU和磁盘I/O相关的统计信息. 
命令格式:
 iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [ ... ] | ALL ] [ -p [ device | ALL ]  ]       [ interval [ count ] ] 


1)iostat的 简单使用

iostat可以显示CPU和I/O系统的负载情况及分区状态信息. 
直接执行iostat可以显示下面内容:
 # iostat
 Linux 2.6.9-8.11.EVAL (ts3-150.ts.cn.tlan)      08/08/2007
 avg-cpu:  %user   %nice    %sys %iowait   %idle
           12.01    0.00        2.15    2.30       83.54
 Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtnhda  
                    7.13       200.12        34.73     640119     111076 
各个输出项目的含义如下:
 avg-cpu段:
 %user: 在用户级别运行所使用的CPU的百分比.
 %nice: nice操作所使用的CPU的百分比.
 %sys: 在系统级别(kernel)运行所使用CPU的百分比.
 %iowait: CPU等待硬件I/O时,所占用CPU百分比.
 %idle: CPU空闲时间的百分比.
 Device段:
 tps: 每秒钟发送到的I/O请求数.
 Blk_read /s: 每秒读取的block数.
 Blk_wrtn/s: 每秒写入的block数.
 Blk_read:   读入的block总数.
 Blk_wrtn:  写入的block总数. 
2)iostat参 数说明

iostat各个参数说明:
 -c 仅显示CPU统计信息.与-d选项互斥. 
 -d 仅显示磁盘统计信息.与-c选项互斥. 
 -k 以K为单位显示每秒的磁盘请求数,默认单位块. 
 -p device | ALL  
 与-x选项互斥,用于显示块设备及系统分区的统计信息.也可以在-p后指定一个设备名,如:  
 # iostat -p hda  
 或显示所有设备  
 # iostat -p ALL 
 -t    在输出数据时,打印搜集数据的时间. 
 -V    打印版本号和帮助信息. 
 -x    输出扩展信息. 
3)iostat输 出项目说明

Blk_read  读入块的当总数.              
Blk_wrtn  写入块的总数.              
kB_read/s  每秒从驱动器读入的数据量,单位为K.              
kB_wrtn/s  每秒向驱动器写入的数据量,单位为K.              
kB_read  读入的数据总量,单位为K.              
kB_wrtn  写入的数据总量,单位为K.              
rrqm/s  将读入请求合并后,每秒发送到设备的读入请求数.              
wrqm/s  将写入请求合并后,每秒发送到设备的写入请求数.              
r/s  每秒发送到设备的读入请求数.              
w/s  每秒发送到设备的写入请求数.              
rsec/s  每秒从设备读入的扇区数.              
wsec/s  每秒向设备写入的扇区数.              
rkB/s  每秒从设备读入的数据量,单位为K.              
wkB/s  每秒向设备写入的数据量,单位为K.              
avgrq-sz  发送到设备的请求的平均大小,单位是扇区.              
avgqu-sz  发送到设备的请求的平均队列长度.              
await  I/O请求平均执行时间.包括发送请求和执行的时间.单位是毫秒.              
svctm  发送到设备的I/O请求的平均执行时间.单位是毫秒.              
%util  在I/O请求发送到设备期间,占用CPU时间的百分比.用于显示设备的带宽利用率.  当这个值接近100%时,表示设备带宽已经占满. 
4)iostat示 例

#  iostat 显示一条统计记录,包括所有的CPU和设备.      
# iostat -d 2 每隔2秒,显示一次设备统计信息.      
# iostat -d 2 6 每隔2秒,显示一次设备统计信息.总共输出6次.      
# iostat -x hda hdb 2 6 每隔2秒显示一次hda,hdb两个设备的扩展统计信息,共输出6次.      
# iostat -p sda 2 6 每隔2秒显示一次sda及上面所有分区的统计信息,共输出6次.

 

   # iostat -x 1
   avg-cpu:   %user    %nice    %sys    %idle
       16.24    0.00      4.31    79.44
   Device: rrqm/s wrqm/s  r/s   w/s   rsec/s   wsec/s    rkB/s   wkB/s   avgrq-sz   avgqu-sz    await    svctm   %util
   /dev/cciss/c0d0
   0.00   44.90   1.02   27.55   8.16    579.59     4.08    289.80    20.57      22.35    78.21    5.00    14.29
   /dev/cciss/c0d0p1
          0.00   44.90   1.02   27.55   8.16    579.59     4.08    289.80    20.57      22.35    78.21    5.00    14.29
   /dev/cciss/c0d0p2
          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
   上面的 iostat 输出表明秒有 28.57 次设备 I/O 操作: 总IO(io)/s = r/s(读) +w/s(写) = 1.02+27.55 = 28.57 (次/秒) 其中写操作占了主体 (w:r = 27:1)。
   平均每次设备 I/O 操作只需要 5ms 就可以完成,但每个 I/O 请求却需要等上 78ms,为什么? 因为发出的 I/O 请求太多 (每秒钟约 29 个),假设这些请求是同时发出的,
   那么平均等待时间可以这样计算:
   平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + ... + 请求总数-1) / 请求总数
   应用到上面的例子: 平均等待时间 = 5ms * (1+2+...+28)/29 = 70ms,和 iostat 给出的78ms 的平均等待时间很接近。这反过来表明 I/O 是同时发起的。
   每秒发出的 I/O 请求很多 (约 29 个),平均队列却不长 (只有 2 个 左右),这表明这 29 个请求的到来并不均匀,大部分时间 I/O 是空闲的。
   一秒中有 14.29% 的时间 I/O 队列中是有请求的,也就是说,85.71% 的时间里 I/O 系统无事可做,所有 29 个 I/O 请求都在142毫秒之内处理掉了。
   delta(ruse+wuse)/delta(io) = await = 78.21 => delta(ruse+wuse)/s=78.21 * delta(io)/s = 78.21*28.57 =2232.8,表明每秒内的I/O请求总共需要等待2232.8ms。
   所以平均队列长度应为 2232.8ms/1000ms = 2.23,而iostat 给出的平均队列长度 (avgqu-sz) 却为 22.35,为什么?! 因为 iostat 中有 bug,avgqu-sz值应为 2.23,而不是 22.35。