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
例五:以M为单位,显示所有信息
命令:iostat -m
例六:查看TPS和吞吐量信息
命令:iostat -d -k 1 1
说明:
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
说明:
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