iostat是I/O statistics(输入/输出统计)的缩写,用于监视linux的磁盘操作。它的特点是汇报磁盘活动统计,同时也汇报CPU的使用情况。与vmstat一样,iostat也不能对某个进程进行深入分析,仅对系统的整体情况进行分析。iostat隶属于sysstat软件包,可以用yum install -y sysstat安装。

1. 命令格式

iostat [参数] [时间] [次数]

2. 命令功能

查看CPU、网卡、tty设备、磁盘、CD-ROM等设备的活动情况, 负载信息。

3. 命令参数

-C,显示CPU使用情况

-d,显示磁盘使用情况

-k,以KB为单位显示

-m,以M为单位显示

-N,显示磁盘阵列(LVM) 信息

-n,显示NFS的使用情况

-p [磁盘],显示磁盘和分区的情况

-t,显示终端和CPU的信息

-x,显示详细信息

-V,显示版本信息

4. 使用实例

例一:显示所有设备的负载

命令:iostat

# iostat

Linux 2.6.18-128.el5 (CT1186)   2012年12月28日

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.30    0.02    5.07    0.17    0.00   86.44

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              22.73        43.70       487.42  674035705 7517941952
sda1              0.00         0.00         0.00       2658        536
sda2              0.11         3.74         3.51   57721595   54202216
sda3              0.98         0.61        17.51    9454172  270023368
sda4              0.00         0.00         0.00          6          0
sda5              6.95         0.12       108.73    1924834 1677123536
sda6              2.20         0.18        31.22    2837260  481488056
sda7             12.48        39.04       326.45  602094508 5035104240

说明:

  • cpu属性值说明
%user,CPU处在用户模式下的时间百分比

%nice,CPU处在带NICE值的用户模式下的时间百分比

%system,CPU处在系统模式下的时间百分比

%iowait,CPU等待输入输出完成时间的百分比

%steal,管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比

%idle:CPU空闲时间百分比

备注:如果%iowait的值过高,表示硬盘存在I/O瓶颈;如果%idle的值高,表示CPU比较空闲;如果%idle的值高,但系统响应慢时,有可能是CPU等待分配内存,此时应加大物理内存容量;如果%idle的值持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源限制是CPU。

  • disk属性值说明
rrqm/s,每秒进行merge读操作的数目,即rmerge/s

wrqm/s,每秒进行merge写操作的数目,即wmerge/s

r/s,每秒完成读I/O设备的次数,即rio/s

w/s,每秒完成写I/O设备的次数,即wio/s

rsec/s,每秒读扇区数,即rsect/s

wsec/s,每秒写扇区数,即wsect/s

rkB/s,每秒读K字节数,是rsect/s的一半,因为每扇区大小为512字节

wkB/s,每秒写K字节数,是wsect/s 的一半

avgrq-sz,平均每次设备I/O操作的数据大小 (扇区)。

avgqu-sz,平均I/O队列的长度。

await,平均每次设备I/O操作的等待时间 (毫秒)。

svctm,平均每次设备I/O操作的服务时间 (毫秒)。

%util,一秒中有百分之多少的时间用于I/O操作,即被IO消耗的CPU百分比

备注:如果%util接近100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈;如果svctm比较接近await,说明I/O几乎没有等待时间;如果await远大于svctm,说明I/O队列太长,io响应太慢,需要进行必要优化;如果avgqu-sz比较大,表示有大量IO在等待。

例二:定时刷新,显示所有信息

命令:iostat 2 3

# iostat 2 3

Linux 2.6.18-128.el5 (CT1186)   2012年12月28日

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.30    0.02    5.07    0.17    0.00   86.44

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda              22.73        43.70       487.42  674035705 7517947296
sda1              0.00         0.00         0.00       2658        536
sda2              0.11         3.74         3.51   57721595   54202216
sda3              0.98         0.61        17.51    9454172  270023608
sda4              0.00         0.00         0.00          6          0
sda5              6.95         0.12       108.73    1924834 1677125640
sda6              2.20         0.18        31.22    2837260  481488152
sda7             12.48        39.04       326.44  602094508 5035107144

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.88    0.00    7.94    0.19    0.00   83.00

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               6.00         0.00       124.00          0        248
sda1              0.00         0.00         0.00          0          0
sda2              0.00         0.00         0.00          0          0
sda3              0.00         0.00         0.00          0          0
sda4              0.00         0.00         0.00          0          0
sda5              0.00         0.00         0.00          0          0
sda6              0.00         0.00         0.00          0          0
sda7              6.00         0.00       124.00          0        248

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           9.12    0.00    7.81    0.00    0.00   83.07

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               4.00         0.00        84.00          0        168
sda1              0.00         0.00         0.00          0          0
sda2              0.00         0.00         0.00          0          0
sda3              0.00         0.00         0.00          0          0
sda4              0.00         0.00         0.00          0          0
sda5              0.00         0.00         0.00          0          0
sda6              4.00         0.00        84.00          0        168
sda7              0.00         0.00         0.00          0          0

说明:每隔2秒刷新显示,且显示3次。

例三:显示指定磁盘的信息

命令:iostat -d sda1

# iostat -d sda1

Linux 2.6.18-128.el5 (CT1186)   2012年12月28日

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda1              0.00         0.00         0.00       2658        536


例四:显示tty和CPU信息

命令:iostat -t

iostat命令 d_await iostat命令用法_linux


例五:以M为单位,显示所有信息

命令:iostat -m

iostat命令 d_await iostat命令用法_iostat命令 d_await_02


例六:查看TPS和吞吐量信息

命令:iostat -d -k 1 1

iostat命令 d_await iostat命令用法_等待时间_03

说明:

tps,该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.),“一次传输”的意思是“一次I/O请求”,多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。

kB_read/s,每秒从设备(drive expressed)读取的数据量

kB_wrtn/s,每秒向设备(drive expressed)写入的数据量

kB_read,读取的总数据量

kB_wrtn,写入的总数量数据量

上面的例子中,我们可以看到磁盘sda以及它的各个分区的统计数据。当时统计的磁盘总TPS是22.73,下面是各个分区的TPS。因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和。

例七:查看设备使用率(%util),响应时间(await)

命令:iostat -d -x -k 1 1

iostat命令 d_await iostat命令用法_等待时间_04

说明:

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系统已经满负荷,该磁盘可能存在瓶颈。

idle小于70%,IO压力就较大,一般读取速度有较多的wait。

同时可以结合vmstat查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)。

另外await也要多和svctm参考,差的过高就一定是IO的问题。avgqu-sz也是个做IO 调优时需要注意的地方,这是直接每次操作数据的大小。如果次数多,但数据拿的小,其实IO也会很小;如果数据拿的大,则IO的数据会高。也可以通过avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s,查看读定速度。

svctm一般要小于await(因为同时等待的请求的等待时间被重复计算了),svctm的大小一般和磁盘性能有关,CPU/MEM的负荷也会对其有影响,请求过多也会间接导致svctm 的增加。

await的大小一般取决于服务时间(svctm),I/O队列的长度,I/O请求的发出模式。如果svctm比较接近await,说明I/O几乎没有等待时间;如果await远大于svctm,说明 I/O队列太长,应用得到的响应时间变慢;如果响应时间超过了用户可以容许的范围,这时可以考虑更换更快的磁盘,调整内核elevator算法,优化应用,或者升级CPU。

队列长度(avgqu-sz)也可作为衡量系统I/O负荷的指标,但由于avgqu-sz是按照单位时间的平均值计算,所以不能反映瞬间的I/O洪水。

形象的比喻

r/s+w/s,类似于交款人的总数

平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数

平均服务时间(svctm)类似于收银员的收款速度

平均等待时间(await)类似于平均每人的等待时间

平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少

I/O操作率(%util)类似于收款台前有人排队的时间比例

设备IO操作,总IO(io)/s = r/s(读) +w/s(写) =1.46 + 25.28=26.74

平均每次设备I/O操作只需要0.36毫秒完成,现在却需要10.57毫秒完成,因为发出的 请求太多(每秒26.74个),假如请求时同时发出的,可以这样计算平均等待时间:平均等待时间=单个I/O服务器时间*(1+2+...+请求总数-1)/请求总数 

每秒发出的I/0请求很多,但是平均队列就4,表示这些请求比较均匀,大部分处理还是比较及时。


例八:查看CPU状态

命令:iostat -c 1 3

iostat命令 d_await iostat命令用法_磁盘IO_05