vmstat详解

vmstat命令:  用来获得有关进程、虚存、页面交换空间及 CPU活动的信息。这些信息反映了系统的负载情况

root@pms-mysql ~]# vmstat 1 10

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----

 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 762072 280348 4051748    0    0     0     3    0    2  0  0 100  0  0
 0  0      0 763776 280348 4051748    0    0     0    40  371  154  0  1 98  1  0
 0  0      0 763776 280348 4051748    0    0     0     0   40   29  0  0 100  0  0
 0  0      0 763744 280348 4051748    0    0     0     0   37   35  0  0 100  0  0
 0  0      0 763744 280348 4051748    0    0     0     0   39   32  0  0 100  0  0
 0  0      0 763744 280348 4051748    0    0     0     0   36   36  0  0 100  0  0

 0  0      0 763744 280348 4051748    0    0     0    12  104   76  0  0 96  4  0

类别

项目

含义

说明

Procs(进程)

r

等待执行的任务数

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

B

等待IO的进程数量

 

Memory(内存)

swpd

正在使用虚拟的内存大小,单位k

 

free

空闲内存大小

 

buff

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

 

cache

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

 

inact

非活跃内存大小,即被标明可回收的内存,区别于free和active

具体含义见:概念补充(当使用-a选项时显示)

active

活跃的内存大小

具体含义见:概念补充(当使用-a选项时显示)

Swap

si

每秒从交换区写入内存的大小(单位:kb/s)

 

so

每秒从内存写到交换区的大小

 

IO

bi

每秒读取的块数(读磁盘)

现在的Linux版本块的大小为1024bytes

bo

每秒写入的块数(写磁盘)

 

system

in

每秒中断数,包括时钟中断

这两个值越大,会看到由内核消耗的cpu时间会越多

cs

每秒上下文切换数

CPU(以百分比表示)

Us

用户进程执行消耗cpu时间(user time)

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

Sy

系统进程消耗cpu时间(system time)

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

Id

空闲时间(包括IO等待时间)

 

wa

等待IO时间

Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。

内存监控:

需要关心的指标包括:swpd、free、buff、cache、si和so,尤其需要重视的是free、si和so。很多人都会认为系统的空闲内存(free)少就代表系统性能有问题,其实并不是这样的,这还要结合si和so(内存和磁盘的页面交换)两个指标进行分析。正常来说,当物理内存能满足系统需要的话(也就是说物理内存能足以存放所有进程的数据),那么物理内存和磁盘(虚拟内存)是不应该存在频繁的页面交换操作的,只有当物理内存不能满足需要时系统才会把内存中的数据交换到磁盘中。而由于磁盘的性能是比内存慢很多的,所以如果存在大量的页面交换,那么系统的性能必然会受到很大影响。

CPU的性能监控:

主要关注3个指标:运行队列、CPU使用率和上下文切换,理解这3个指标的概念和原理对于发现和处理CPU性能问题有很大的帮助。

1. 运行队列每个CPU都会维护一个运行队列,调度器会不断地轮询让队列中的进程运行,直到进程运行完毕将其由队列中删除。如果CPU过载,就会出现调度器跟不上系统要求,导致运行队列中等待运行的进程越来越多。正常来说,每个CPU的运行队列不要超过3,如果是双核CPU 就不要超过6

2. CPU使用率

   CPU使用率一般可以分为一下几个部分。

   a. 用户进程:运行用户进程所占用的CPU时间的百分比。

   b. 系统进程:运行系统进程和中断所占用的CPU的时间百分比。

   c. 等待IO:因为IO等待而使CPU处于idle状态的时间百分比。

   d. 空闲:CPU处于空闲状态的时间百分比

如果CPU的空闲率长期低于10%,那么表示CPU的资源已经非常紧张,应该考虑进程优化或添加更多地CPU。“等待IO”表示CPU因等待IO          资源而被迫处于空闲状态,这时候的CPU并没有处于运算状态,而是被白白浪费了,所以“等待IO应该越小越好。

3. 上下文切换

         通过CPU时间轮询的方法,Linux能够支持多任务同时运行。对于普通的CPU,内核会调度和执行这些进程,每个进程都会被分配CPU时   间片并运行。当一个进程用完时间片或者被更高优先级的进程抢占时间块后,它会被转到CPU的等待运行队列中,同时让其他进程在CPU上运行。这个进程切换的过程被称为上下文切换。过多的上下文切换会造成系统的很大的开销。


系统监控的实验:

实例一,大量的算术运算

本程序会进入一个死循环,不断的进行求平方根的操作,模拟大量的算术运算的环境.
测试源程序如下:

#include   
void  
run_status(void)  
  {  
    double pi = M_PI;  
    double pisqrt;  
    long i;  
      while(1){  
      pisqrt = sqrt(pi);  
      }  
  }  
int  
main (void)  
  {  
    run_status();  
    exit(EXIT_SUCCESS);  
  }

gcc run.c -o run -lm
./run&

运行:

root@test:~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0 772300  42420 175356    0   31     5   138   22   14  0  0 99  0
 1  0      0 772292  42420 175356    0    0     0     0   45   22  5  0 95  0
 1  0      0 772284  42420 175356    0    0     0     0  276   15 100  0  0  0
 1  0      0 772284  42420 175356    0    0     0     0  298   12 100  0  0  0
 1  0      0 772284  42420 175356    0    0     0     0  273   11 100  0  0  0
 1  0      0 772284  42420 175356    0    0     0     0  278   16 100  0  0  0
 1  0      0 772284  42420 175356    0    0     0     0  276   14 100  0  0  0
 1  0      0 772284  42420 175356    0    0     0     0  275   16 100  0  0  0
 1  0      0 772284  42420 175356    0    0     0     0  284   14 99  1  0  0
 1  0      0 772284  42420 175356    0    0     0     0  285   14 100  0  0  0
 1  0      0 772284  42420 175356    0    0     0     0  281   13 100  0  0  0
 1  0      0 772284  42420 175356    0    0     0     0  270   18 100  0  0  0
 0  0      0 772292  42420 175356    0    0     0     0   51   28  4  0 96  0
 0  0      0 772292  42420 175356    0    0     0     0   25   11  0  0 100  0

由于不断地在做算术运算,从上面可以看出:

1. r表示在运行队列中等待的进程数,上面的数据表示r=1,一直有进程在等待,

2. in表示每秒的中断数,包括时钟中断,运行队列中有等待的进程(看参数r的值),中断数in就上来了

3. us表示用户进程使用的cpu时间,随着r=1,用户的cpu占用时间直接达到了100%

4. id表示cpu的空闲时间,一开始的时候id很高,达到95%,后来程序开始跑,cpu一直处于繁忙状态(看参数r,us的值),id就一直为0,等程序终止,id就是上去了

实例二,大量的系统调用
本脚本会进入一个死循环,不断的执行cd命令,从而模拟大量系统调用的环境
测试脚本如下:

#!/bin/bash  
while (true)  
do  
  cd ;  
done  

chmod +x loop.sh
./loop.sh

root@test~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0 772300  42500 175364    0   30     5   136   22   14  0  0 99  0
 0  0      0 772300  42500 175364    0    0     0     0   27   14  0  0 100  0
 1  0      0 772220  42500 175364    0    0     0     0  213 2482  6 70 24  0
 1  0      0 772204  42500 175364    0    0     0     0  283 3298  8 92  0  0
 1  0      0 772204  42500 175364    0    0     0     0  281 3343  5 95  0  0
 1  0      0 772204  42500 175364    0    0     0     0  283 3381  5 95  0  0
 1  0      0 772204  42500 175364    0    0     0     0  271 3362  8 92  0  0
 1  0      0 772204  42508 175356    0    0     0    12  267 3359  8 92  0  0
 0  0      0 772276  42508 175364    0    0     0     0  253 2883  8 76 16  0
 0  0      0 772276  42508 175364    0    0     0     0   29   12  0  0 100  0
 0  0      0 772276  42508 175364    0    0     0     0   39   18  0  0 100  0

 随着程序不断调用cd命令,运行队列有等待的进程r(看参数r),每秒的中断数in(看参数in),下文切换的次数cs骤然提高(看参数cs),系统占用的cpu时间sy(看参数sy)也不断提高,cpu空闲时间id(看参数id)一直为0。当程序终止的时候,r,in,cs,sy数据都下来了,id上去了,表示系统已经空闲下来了。

实例三,大量的io操作

我们用dd命令,从/dev/zero读数据,写入到/tmp/data文件中,如下:
dd if=/dev/zero of=/tmp/data bs=1M count=1000

运行:

root@debian6:~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0 772176  42564 175352    0   30     5   134   23   14  0  0 99  0
 0  0      0 772176  42564 175352    0    0     0     0   35   15  0  1 99  0
 1  0      0 687220  42564 257976    0    0     4     0  181   23  0 55 45  0
 1  0      0 545356  42564 397552    0    0    12 142664  667  246  0 100  0  0
 1  0      0 400276  42564 540208    0    0     0 147424  576  228  0 100  0  0
 1  0      0 254948  42564 683216    0    0     0 173268  625  242  0 100  0  0
 1  0      0 110364  42564 825140    0    0     0 136864  477   71  0 100  0  0
 2  0      0  15400  11384 950396    0    0     0 140976  531  585  0 100  0  0
 0  0      0  15028  11388 952236    0    0    12 199253  638  611  0 76 21  3
root@debian6:~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0 911284  11392  69752    0   30     5   143   23   14  0  0 99  0
 0  0      0 911284  11392  69752    0    0     0     0   33   15  1  0 99  0
 1  0      0 827704  11396 152232    0    0    60     0   98   27  0 24 74  2
 1  0      0 304424  11396 667096    0    0     0 520604 1336  710  0 100  0  0
 0  0      0  17564  11380 952288    0    0     8 417144 1166  874  0 97  3  0
 0  0      0  17572  11380 952288    0    0     0     0   34   10  0  0 100  0
 0  0      0  17572  11380 952288    0    0     0     0   38   19  0  0 100  0

root@debian6:~# dd if=/dev/zero of=/mnt/date1 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 6.31404 s, 166 MB/s
root@debian6:~# dd if=/dev/zero of=/mnt/data1 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 2.19338 s, 478 MB/s

1.  bo写数据到磁盘的速率,bi是从磁盘读的速度
2.  dd不断的向磁盘写入数据,所以bo的值会骤然提高,而cpu的wait数值也变高,说明由于大量的IO操作,系统的瓶径出现IO设备上
3. 由于对文件系统的写入操作,cache也从175352KB提高到了952236KB,又由于大量的写中断调用,in的值也从35提高到638,上下文切换cs的值从23到了611


我们用dd命令,从/dev/zero读数据,写入到/tmp/data文件中,如下:
dd if=/dev/zero of=/tmp/data bs=1M count=1000

运行:

root@debian6:~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0 772176  42564 175352    0   30     5   134   23   14  0  0 99  0
 0  0      0 772176  42564 175352    0    0     0     0   35   15  0  1 99  0
 1  0      0 687220  42564 257976    0    0     4     0  181   23  0 55 45  0
 1  0      0 545356  42564 397552    0    0    12 142664  667  246  0 100  0  0
 1  0      0 400276  42564 540208    0    0     0 147424  576  228  0 100  0  0
 1  0      0 254948  42564 683216    0    0     0 173268  625  242  0 100  0  0
 1  0      0 110364  42564 825140    0    0     0 136864  477   71  0 100  0  0
 2  0      0  15400  11384 950396    0    0     0 140976  531  585  0 100  0  0
 0  0      0  15028  11388 952236    0    0    12 199253  638  611  0 76 21  3
root@debian6:~# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0      0 911284  11392  69752    0   30     5   143   23   14  0  0 99  0
 0  0      0 911284  11392  69752    0    0     0     0   33   15  1  0 99  0
 1  0      0 827704  11396 152232    0    0    60     0   98   27  0 24 74  2
 1  0      0 304424  11396 667096    0    0     0 520604 1336  710  0 100  0  0
 0  0      0  17564  11380 952288    0    0     8 417144 1166  874  0 97  3  0
 0  0      0  17572  11380 952288    0    0     0     0   34   10  0  0 100  0
 0  0      0  17572  11380 952288    0    0     0     0   38   19  0  0 100  0

root@debian6:~# dd if=/dev/zero of=/mnt/date1 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 6.31404 s, 166 MB/s
root@debian6:~# dd if=/dev/zero of=/mnt/data1 bs=1M count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 2.19338 s, 478 MB/s

1. bo写数据到磁盘的速率,bi是从磁盘读的速度
2. dd不断的向磁盘写入数据,所以bo的值会骤然提高,而cpu的wait数值也变高,说明由于大量的IO操作,系统的瓶径出现IO设备上
3. 由于对文件系统的写入操作,cache也从175352KB提高到了952236KB,又由于大量的写中断调用,in的值也从35提高到638,上下文切换cs的值从23到了611











  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值