iostat、vmstat


iostat

iostat 命令用来监视系统输入/输出设备负载,这通过观察与它们的平均传送速率相关的物理磁盘的活动时间来实现。iostat 命令生成的报告可以用来更改系统配置来更好地平衡物理磁盘和适配器之间的输入/输出负载。

安装iostat

iostat包含在sysstat包内。如果没有,需要安装它。在ubuntu可以执行以下命令:

sudo apt-get install sysstat

使用iostat

不带参数的iostat命令将会输出CPU和每个分区的输出/输出的统计信息,如下所示:
[heql@ubuntu ~]$ iostat
Linux 4.2.0-27-generic (ubuntu)     03/14/2018     _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
            3.23    0.68    1.97    3.04    0.00   91.07

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              10.22       189.72        63.84     960303     323128
  • 第一部分包含了CPU报告:
选项 说明
%user CPU在用户态执行进程的时间百分比。
%nice 显示了在以nice优先级运行用户态的CPU利用率
%system CPU处在内核态执行进程的时间百分比
%iowait CPU用于等待I/O操作占用CPU总时间的百分比
%steal 管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟CPU的百分比
%idle CPU空闲时间百分比
  • 第二部分包含了设备利用率报告:
选项 说明
tps 每秒向磁盘设备请求数据的次数,包括读、写请求,为rtps与wtps的和。出于效率考虑,每一次IO下发后并不是立即处理请求,而是将请求合并(merge),这里tps指请求合并后的请求计数。更高的tps意味着处理器更忙。
kB_read/s 每秒从设备读取的数据量
kB_wrtn/s 每秒向设备写入的数据量
kB_read 读取的总数据量
kB_wrtn 写入的总数量数据量
-c 参数仅输出CPU的统计信息,如下所示:
[heql@ubuntu ~]$ iostat -c
Linux 4.2.0-27-generic (ubuntu)     03/14/2018     _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
            2.80    0.55    1.68    2.47    0.00   92.49
-d 参数仅输出磁盘的所有分区的输入/输出的统计信息,如下所示:
[heql@ubuntu ~]$ iostat -d
Linux 4.2.0-27-generic (ubuntu)     03/14/2018     _x86_64_    (1 CPU)

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda               8.09       150.00        50.56     960563     323788
-m 选项,指定输出结果以MB为单位:
[heql@ubuntu ~]$ iostat -m -d
Linux 4.2.0-27-generic (ubuntu)     03/14/2018     _x86_64_    (1 CPU)

Device:            tps    MB_read/s    MB_wrtn/s    MB_read    MB_wrtn
sda               7.77         0.14         0.05        938        316
-x 选项,显示更详细的io设备统计信息:
[heql@ubuntu ~]$ iostat -x -d
Linux 4.2.0-27-generic (ubuntu)     03/14/2018     _x86_64_    (1 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.15     1.82    6.64    0.94   140.30    47.32    49.53     0.17   22.69   18.32   53.53   4.83   3.66
选项 说明
rrqm/s 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s 每秒对该设备的写请求被合并次数
r/s 每秒完成的读次数
w/s 每秒完成的写次数
rkB/s 每秒读数据量(kB为单位)
wkB/s 每秒写数据量(kB为单位)
avgrq-sz 平均每次IO操作的数据量(扇区数为单位)
avgqu-sz 平均等待处理的IO请求队列长度
await 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
r_await 平均每次IO请求读等待时间
w_await 平均每次IO请求写等待时间
svctm 平均每次IO请求的处理时间(毫秒为单位)
%util 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
作为一个统计工具,最好带延迟参数来使用它,形式指定iostat命令的采样间隔和采样次数:
[heql@ubuntu ~]$ iostat -xd 1 2 
Linux 4.2.0-27-generic (ubuntu)     03/14/2018     _x86_64_    (1 CPU)

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.14     1.66    6.01    0.87   127.14    43.01    49.45     0.16   22.64   18.32   52.60   4.82   3.32

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               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

上面的命令为采样时间为1秒,采样2次,若不指定采样次数,则iostat会一直输出采样信息,直到按ctrl+c退出命令。

vmstat

vmstatVirtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。

选项参数:

选项 说明
-a 显示活跃和非活跃内存
-f 显示从系统启动至今的fork数量
-m 显示slabinfo
-d 显示磁盘相关统计信息
-p 显示指定磁盘分区统计信息
显示虚拟内存使用情况
[heql@ubuntu ~]$ 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      0 939172  74020 393880    0    0   645    21   87  464  5  3 91  0  0

procs(进程):

选项 说明
r 运行队列中进程数量
b 等待IO的进程数量

memory(内存):

选项 说明
swpd 使用虚拟内存大小,如果swpd的值不为0,但是si,so的值长期为0,这种情况不会影响系统性能
free 空闲物理内存大小
buff 用作缓冲的内存大小
cache 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小

swap:

选项 说明
si 每秒从交换区写到内存的大小,由磁盘调入内存
so 每秒写入交换区的内存大小,由内存调入磁盘

内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。当看到空闲内存(free)很少的或接近于0时,不能就认为内存不够用了,还要结合si和so。如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

io:

选项 说明
bi 每秒读取的块数
bo 每秒写入的块数

system:

选项 说明
in 每秒中断数,包括时钟中断
cs 每秒上下文切换数

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

CPU(以百分比表示):

选项 说明
us 用户进程执行时间百分比
sy 内核系统进程执行时间百分比
wa IO等待时间百分比 wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈
id 空闲时间百分比
iostat命令一样,vmstat命令也可以指定采样间隔和采样次数:
[heql@ubuntu ~]$ vmstat 1 2
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      0 447436 142740 737004    0    0   332    88   79  285  3  2 94  0  0
0  0      0 447420 142748 736996    0    0     0    44   74  330  2  1 97  0  0

上面的命令为采样时间为1秒,采样2次。

显示活跃和非活跃内存
[heql@ubuntu ~]$ vmstat -a 1 2
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
0  0      0 451780 350368 950324    0    0   317    84   79  281  3  2 94  0  0
0  0      0 451780 350368 950368    0    0     0     0   63  308  2  1 97  0  0
查看系统已经fork了多少次
[heql@ubuntu ~]$ vmstat -f
 3940 forks

这个数据是从/proc/stat中的processes字段里取得的。

查看内存使用的详细信息
[heql@ubuntu ~]$ vmstat -s
2031216 K total memory
1579204 K used memory
955796 K active memory
345028 K inactive memory
452012 K free memory
142812 K buffer memory
737004 K swap cache
2094076 K total swap
      0 K used swap
2094076 K free swap
   4778 non-nice user cpu ticks
   2819 nice user cpu ticks
   4777 system cpu ticks
 228449 idle cpu ticks
    974 IO-wait cpu ticks
      0 IRQ cpu ticks
     68 softirq cpu ticks
      0 stolen cpu ticks
 718947 pages paged in
 191472 pages paged out
      0 pages swapped in
      0 pages swapped out
 190045 interrupts
 678710 CPU context switches
1521078128 boot time
   3950 forks

这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat

查看磁盘的读/写
[heql@ubuntu ~]$ vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors      ms  total merged sectors      ms    cur    sec
ram0       0      0       0       0      0      0       0       0      0      0
ram1       0      0       0       0      0      0       0       0      0      0
ram2       0      0       0       0      0      0       0       0      0      0
ram3       0      0       0       0      0      0       0       0      0      0
ram4       0      0       0       0      0      0       0       0      0      0
ram5       0      0       0       0      0      0       0       0      0      0
ram6       0      0       0       0      0      0       0       0      0      0
ram7       0      0       0       0      0      0       0       0      0      0
ram8       0      0       0       0      0      0       0       0      0      0
ram9       0      0       0       0      0      0       0       0      0      0
ram10      0      0       0       0      0      0       0       0      0      0
ram11      0      0       0       0      0      0       0       0      0      0
ram12      0      0       0       0      0      0       0       0      0      0
ram13      0      0       0       0      0      0       0       0      0      0
ram14      0      0       0       0      0      0       0       0      0      0
ram15      0      0       0       0      0      0       0       0      0      0
loop0      0      0       0       0      0      0       0       0      0      0
loop1      0      0       0       0      0      0       0       0      0      0
loop2      0      0       0       0      0      0       0       0      0      0
loop3      0      0       0       0      0      0       0       0      0      0
loop4      0      0       0       0      0      0       0       0      0      0
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors      ms  total merged sectors      ms    cur    sec
loop5      0      0       0       0      0      0       0       0      0      0
loop6      0      0       0       0      0      0       0       0      0      0
loop7      0      0       0       0      0      0       0       0      0      0
sda    32062   1280 1437510   53952   2060   3483  383448   10992      0     18
sr0        0      0       0       0      0      0       0       0      0      0
查看/dev/sda1磁盘的读/写
[heql@ubuntu ~]$ vmstat -p /dev/sda1
sda1          reads   read sectors  writes    requested writes
                31636    1433866       2082     383696

这些信息主要来自于/proc/diskstats。

选项 说明
reads 来自于这个分区的读的次数
read sectors 来自于这个分区的读扇区的次数
writes 来自于这个分区的写的次数
requested writes 来自于这个分区的写请求次数