Linux iostat和vmstat命令

时间:2023-01-10 04:35:54

http://blog.csdn.net/tinyhare/article/details/7999829

iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。
iostat的语法如下:

iostat [ -c | -d ] [ -k ] [ -t ] [ -V ] [ -x [ device ] ] [ interval [ count ]
-c为汇报CPU的使用情况;
-d为汇报磁盘的使用情况;
-k表示每秒按kilobytes字节显示数据;
-t为打印汇报的时间;
-v表示打印出版本信息和用法;
-x device指定要统计的设备名称,默认为所有的设备;
interval指每次统计间隔的时间;
count指按照这个时间间隔统计的次数。

[root@yufei ~]# iostat -x
Linux 2.6.32-131.0.15.el6.x86_64 (yufei.opsers.org) 	08/18/2011 	_x86_64_	(1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.56    0.00    3.66   11.74    0.00   82.04

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
scd0              0.68     0.00    1.37    0.00     8.23     0.00     5.99     0.00    2.23   2.23   0.31
sda              30.97    18.75   33.92    8.67  1819.19   219.32    47.86     0.29    6.91   3.26  13.87
sdb               1.83     0.00    1.25    0.00    10.05     0.00     8.06     0.00    0.27   0.27   0.03

结果参数说明:

% user      显示了在用户级(应用程序)执行时产生的 CPU 使用率百分比。

% sys       显示了在系统级(内核)执行时产生的 CPU 使用率百分比。

% idle       显示了在 CPU 空闲并且系统没有未完成的磁盘 I/O 请求时的时间百分比。

% iowait   显示了 CPU 空闲期间系统有未完成的磁盘 I/O 请求时的时间百分比。

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的单位为毫秒)

iostat案例

  1. # iostat 101

  2. avg-cpu: %user %nice %sys %idle  

  3. 15.240.004.3180.45

  4. Device: rrqm/s  wrqm/s  r/s  w/s   rsec/s  wsec/s  rkB/s  wkB/s  avgrq-sz  avgqu-sz await svctm  %util  

  5. sda      0.0045.001.5229.008.23555.554.08300.2119.2220.1277.234.8413.19

以上输出结果,相关参数分析如下:
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

结合上面的输入结果分析一下io状态:
1秒内设备 I/O 操作: 总IO(io)/s = r/s(读) +w/s(写) = 1.52+29.00 = 30.52 (次/秒) 。
平均每次设备 I/O 操作只需要 4.84ms 就可以完成,但每个 I/O 请求却需要等上 77.23ms,这是由于发出的 I/O 请求太多,每秒钟31个。这个值可以通过如下公式计算得出,假设他们都是同时发出io:
平均等待时间 = 单个 I/O 服务时间 * ( 1 + 2 + … + 请求总数-1) / 请求总数=4.84ms * (1+2+....+30)/31 = 72.6ms 这个值和上面输出的等待值77.23差不多说明是同时发出的io请求。
每秒发出的 I/O 请求30.52,平均队列却不长 只有 2.01( 因为 iostat 中有 bug,avgqu-sz 值应为 2.01,而不是 20.12.),这表明这 30.52 个请求的到来并不均匀,大部分时间 I/O 是空闲的.
一秒中有 13.19% 的时间 I/O 队列中是有请求的,而86.81% 的时间里 I/O 系统无事可做,所有 29 个 I/O 请求都在很短时间之内处理掉了.

另一个指标如果 %util 使用率很大接近100%,说明产生的I/O请求太多,I/O系统负荷很大,可能过载,则说明磁盘可能存在瓶颈.网上还提供了一种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/内存的负荷也会对其有影响,请求过多也会间接导致 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 洪水.



vmstat监视内存使用情况


vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监视。它是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

vmstat的语法如下:

vmstat [-V] [-n] [delay [count]]

-V表示打印出版本信息;

-n表示在周期性循环输出时,输出的头部信息仅显示一次;

delay是两次输出之间的延迟时间;

count是指按照这个时间间隔统计的次数。

[root@yufei ~]# vmstat 
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0   4116  38560  24456  90224    5   11   595    71   96  134  2  2 88  8  0

结果参数说明:

Procs

r:等待执行的任务数

b:处在非中断睡眠状态的进程数

展示了正在执行和等待CPU资源的任务个数。当这个值超过了CPU数目,就会出现CPU瓶颈了

Memory

swpd:正在使用的swap大小单位K

free:空闲的内存空间

buff:已使用的buff大小,对块设备的读写进行缓冲

cache:已使用的cache大小,文件系统的cache

inact:

active:

Swap

si:交换内存使用,由磁盘调入内存

so:交换内存使用,由内存调入磁盘

IO

bi:从块设备读入的数据总量(读磁盘) (KB/s)

bo:写入到块设备的数据总理(写磁盘) (KB/s)

System

in:每秒产生的中断次数

cs:每秒产生的上下文切换次数

上面这2个值越大,会看到由内核消耗的CPU时间会越多

CPU

us:用户进程消耗的CPU时间百分比

us 的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超过50% 的使用,那么我们就该考虑优化程序算法或者进行加速了

sy:内核进程消耗的CPU时间百分比

sy 的值高时,说明系统内核消耗的CPU资源多,这并不是良性的表现,我们应该检查原因。

id:空闲

wa:IO等待消耗的CPU时间百分比

wa 的值高时,说明IO等待比较严重,这可能是由于磁盘大量作随机访问造成,也有可能是磁盘的带宽出现瓶颈(块操作)。

再一次提醒:如果说,你的系统没有上述命令,你需要通过yum provides "*bin/iostat" 和yum provides "*bin/vmstat" 来查询并安装相应的软件包,类似的相关问题,在以前的博客中也提及到,这里再来提醒一次!因为这是解决问题的方法。