linux系统监控示例:vmstat

一。基础演示:

[nwom@WLAN-linux-3 ~]$ vmstat -n 2 10 ([nwom@WLAN-linux-3~]vmstat –n 2 10 以每2秒钟的频率执行10次取样)
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
19  0    192 1120896 386040 14156336    0    0     1    18    0    0 10  8 82  0  0
14  0    192 1120976 386048 14156348    0    0     0    86 1015 114979 12 30 58  0  0
 7  0    192 1121204 386048 14156380    0    0     0    44 1001 113762 12 30 58  0  0
 7  0    192 1121448 386048 14156380    0    0     0    44 1005 116078 12 30 58  0  0
 6  0    192 1121620 386048 14156380    0    0     0    94 1008 115518 12 30 58  0  0
 5  0    192 1121744 386048 14156380    0    0     0     0 1010 112765 12 29 59  0  0
10  0    192 1121968 386048 14156388    0    0     0     0 1004 113684 12 30 58  0  0
30  0    192 1121972 386048 14156388    0    0     0   192 1012 111992 15 31 54  0  0
 6  0    192 1122200 386048 14156388    0    0     0     0 1009 112802 15 31 53  0  0
12  0    192 1121984 386048 14156388    0    0     0    38 1007 113815 12 30 58  0  0
[nwom@WLAN-linux-3 ~]$ 

注释:vmstat输出结果中第一行展示的是自最后一次启动以来的平均值,所以此行可以忽略。

输出栏位如下:

Process(procs

r :等待运行时间的进程数。
b :处于不可中断睡眠状态的进程数。

Memory

swpd :虚拟内存使用量(KB)。
free :空闲内存量(KB)。
buff :用作buffer的内存量(KB)。
cache :用作cache的内存量(KB)。

swap

si :从硬盘交换到内存的数量(KBps)。
so :交换到硬盘的内存数量(KBps)。

IO

bi:发送到块设备的块的数量(blocks/s)。
bo:从块设备获取的块的数量(blocks/s)。

System

in :每秒钟的中断数量,包括时钟中断。
cs :每秒钟上下文交换的数量。

CPU(整个CPU时间的百分比

us :花费在非内核代码的CPU时间(用户时间,包括Nice时间)。
sy :花费在内核代码的CPU时间(系统时间)。
id :空闲时间。在2.5.41内核以前,还包括I/O等待时间。
wa :IO等待时间。在2.5.41内核以前,显示为0。

vmstat命令提供了许多命令行参数,使用man手册查看参数的详细文档。常用的参数有:

-m :显示内核的内存使用情况(slabs)

-a :显示活动和非活动内存分页相关信息

-n :只显示一次栏位名称行,当在取样模式通下将输出信息存储到文件时非常有用。
(例如,root#vmstat –n 2 5 以每2秒钟的频率执行5次取样)

备注:
如果 r经常大于4 ,且id经常少于40,表示cpu的负荷很重。
如果空闲时间(id)持续为0并且系统时间(sy)是用户时间(us)两倍 系统则面临着CPU资源的短缺

二、系统监控的实验:

  以下实验转自(http://home.lupaworld.com/home-space-uid-56821-do-blog-id-233122.html),感兴趣的可以动手操作

实例一:大量的算术运算

 1 #本程序会进入一个死循环,不断的进行求平方根的操作,模拟大量的算术运算的环境.
 2 #测试源程序如下:
 3 #include <stdio.h> 
 4 #include <math.h> 
 5 #include <unistd.h> 
 6 #include <stdlib.h> 
 7  
 8 void 
 9 run_status(void) 
10 { 
11     double pi = M_PI; 
12     double pisqrt; 
13     long i; 
14     while(1){ 
15         pisqrt = sqrt(pi); 
16     } 
17 } 
18  
19 int main (void) 
20 { 
21     run_status(); 
22     exit(EXIT_SUCCESS); 
23 } 
24 #编译
25 gcc run.c -o run -lm
26 #运行
27 ./run&

监测:

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 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就是上去了

实例二:大量的系统调用

 1 #本脚本会进入一个死循环,不断的执行cd命令,从而模拟大量系统调用的环境
 2 #测试脚本如下:
 3 #!/bin/bash 
 4  
 5 while (true) 
 6 do 
 7  cd ; 
 8 done 
 9 
10 运行
11 ./loop.sh

监测:

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 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操作

1.用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 st
 0  0      0 302160  25868 149004    0    0    77   116 1027  151 14 17 69  0  0
 1  0      0 302160  25868 149004    0    0     0     0 1018   35  0  1 99  0  0
 3  0      0 134884  26032 311628    0    0     0 109872 1423  102  0 100  0  0  0
 1  0      0  14596  26148 428808    0    0     0 117208 1372  120  0 100  0  0  0
 1  0      0   6224  22908 440592    0    0     4 64944 1305  322  0 98  0  2  0
 1  0      0   5976  21836 441016    0    0     4 79072 1447  162  0 51  0 49  0
 0  2      0   5716  21956 439672    0    0     4 79016 1431  374  0 81  0 19  0
 2  2      0   6180  22044 438064    0    0     0 61432 1392  285  0 61  0 39  0
 2  2      0   6912  22104 436828    0    0     4 73980 1486  253  1 59  0 40  0
 0  4      0   5876  14132 448856    0    0     8 63784 1378  313  0 69  0 31  0
 0  2      4   5980   4140 457860    0    0     0 46756 1399  274  0 65  0 35  0
 1  3      4   6060   3892 457580    0    0     8 69876 1398  214  0 46  0 54  0
 1  4      4   6120   2872 457348    0    0     0 59920 1364  327  0 71  0 29  0

注:dd不断的向磁盘写入数据,所以bo的值会骤然提高,而cpu的wait数值也变高,说明由于大量的IO操作,系统的瓶径出现在低速的设备上.由于对文件系统的写入操作,cache也从149004KB提高到了457348KB,又由于大量的写中断调用,in的值也从1018提高到1364.

2.还用dd命令,这回从/tmp/data文件读,写到/dev/null文件中,如下:

dd if=/tmp/test1 of=/dev/null bs=1M

监测:

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 st
 0  0     60   7056   2492 464560    0    0   177   517 1028  116 10 12 78  1  0
 0  0     60   7056   2492 464560    0    0     0     0 1006   32  0  0 100  0  0
 0  1     60   5768   2296 465032    0    4 94340     4 1514  252  0 65 17 18  0
 1  1     60   5876   2220 466032    0    0 150148    56 1770  306  0 93  0  7  0
 0  1     60   5792   2180 467152    0    0 98872     0 1598  281  0 81  0 19  0
 0  1     60   6308    988 469816    0   52 89556    52 1722  303  0 88  0 12  0
 2  1     60   5620   1004 470488    0    0 79052     0 1671  690  0 72  0 28  0
 0  1     60   6548   1028 469540    0    0 67392     4 1535  657  1 66  0 33  0
 1  1     60   5648   1060 470588    0    0 47408    16 1400  482  0 44  0 56  0
 0  1     60   6368   1088 469836    0    0 70212     0 1561  666  0 66  0 34  0

注:dd不断的从/tmp/data磁盘文件中读取数据,所以bi的值会骤然变高,最后我们看到b(不可中断进程数)也由0变成了1.

3.#接下来我们继续用dd命令,把数据写到/dev/ram1里,如下:

dd if=/dev/zero of=/dev/ram1 bs=1M count=16
16+0 records in
16+0 records out
16777216 bytes (17 MB) copied, 0.0635522 seconds, 264 MB/s

监测:

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 st
 0  0     60   6156   6256 466280    0    0   366   480 1029  111  9 11 79  1  0
 0  0     60   6156   6256 466280    0    0     0     0 1011   32  0  0 100  0  0
 0  0     60   6156   6256 466292    0    0    12     0 1031   65  0  3 96  1  0
 0  0     60   6156   6264 466284    0    0     0    48 1022   48  0  1 99  0  0
 0  0     60   6148  17920 454652    0    0     0     4 1021   81  0  8 92  0  0
 0  0     60   6148  17920 454652    0    0     0     0 1013   32  1  0 99  0  0
 0  0     60   6148  17920 454652    0    0     0     0 1016   36  0  1 99  0  0
 0  0     60   6148  17920 454652    0    0     0     0 1006   31  0  0 100  0  0
 0  0     60   6148  17920 454652    0    0     0     0 1026   42  0  0 100  0  0

注:dd从/dev/zero读取数据,写入到/dev/ram1里面,由于/dev/ram1是设备节点,所以buff会增加.

实例四:大量的占用内存

 1 #本程序会不断分配内存,直到系统崩溃
 2 #include <stdio.h> 
 3 #include <string.h> 
 4 #include <stdlib.h> 
 5  
 6 int main (int argc, char *argv[]) 
 7 { 
 8     void *ptr; 
 9     int n = 0; 
10     while (1){ 
11         ptr = malloc(0x100000); 
12  
13         if (ptr == NULL) 
14             break; 
15  
16         memset(ptr, 1, 0x100000); 
17         printf("malloced %d MB\n", ++n); 
18     } 
19  
20     pause(); 
21 } 
22 #编译
23 gcc callmem.c -o callmem
24 #运行
25 ./callmem

监测:

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 880944  70656  51692    0    0   125    13   27   35  0  2 97  1
 0  0      0 880944  70656  51692    0    0     0     0   17   12  0  0 100  0
 1  0      0 733344  70656  51692    0    0     0     0  259  339  2 52 46  0
 1  0      0 312240  70656  51692    0    0     0     0  484  674  2 98  0  0
 1  0      0 152776  70656  51692    0    0     0     0  417  469  0 100  0  0
 0  2      0  12396  68868  45748    0    0     0     0  410  444  1 97  0  2
 1  0    652 605960  60932  39120    0  908     0   908  141  130  0 34  0 66
 0  0    524 903632  60932  39136    0    0     0     0   32   14  0  3 97  0
 0  0    524 903632  60932  39136    0    0     0     0   13    8  0  0 100  0
 0  0    524 903632  60932  39136    0    0     0     0   13    9  0  0 100  0
 0  0    524 903632  60932  39136   32    0    32     0   14   12  0  0 99  1
 0  0    524 903632  60932  39136    0    0     0     0   15   18  0  0 100  0
 0  0    524 903632  60932  39140    0    0     0     0   26    8  0  0 100  0
 0  0    524 903632  60932  39140    0    0     0     0   20    7  0  0 100  0
 0  0    524 903632  60932  39140    0    0     0     0   18    9  0  0 100  0
 0  0    524 903632  60932  39140    0    0     0     0   17   19  0  0 100  0
 0  0    524 903632  60932  39140    0    0     0     0   17   12  0  0 100  0

注:我们看到cache迅速减少,而swpd迅速增加,这是因为系统为了分配给新的程序,而从cache(文件系统缓存)回收空间,当空间依然不足时,会用到swap空间.而于此同时,si/so也会增加,尤其是so,而swap属于磁盘空间,所以bo也会增加

 

posted @ 2013-03-11 18:15  PoleStar  阅读(498)  评论(0编辑  收藏  举报