vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。


一、vmstat命令简单用法

[root@localhost ~]# vmstat 2 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
17  0 5114092 824896 152508 1647704    0    0     1    38    0    0 99  1  1  0  0

2表示每个两秒采集一次服务器状态,1表示采集一次。


二、vmstat返回结果含义

[root@localhost ~]# vmstat 2 6
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
90  0 5108036 501140 159128 1953048    0    0     1    38    0    0 99  1  1  0  0
42  0 5108036 500328 159132 1953492    0    0     0   154 4944 32704 99  0  1  0  0
23  0 5108028 500336 159140 1953984   16    0    16  1000 4671 31510 99  0  1  0  0
20  0 5108028 495740 159156 1954308    0    0     0    44 4683 32490 99  0  0  0  0
17  0 5107996 495356 159176 1954628    0    0     0   956 4924 32816 100  0  0  0  0
21  0 5107996 495480 159184 1955112    0    0     0     6 4632 30949 100  0  0  0  0

在上面的命令中,每2s采集一次数据,总共采集6次结束。


  1. procs

    r:表示运行队列(就是说多少个进程真的分配到CPU),当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队 列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。

    b:表示阻塞的进程

  2. memory

    可以使用命令查看服务器的内存信息:

       # cat /proc/meminfo

    swpd:虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。

    free:空闲的物理内存的大小

    buff:Linux/Unix系统是用来存储目录里面有什么内容,权限等的缓存

    cache:cache直接用来记忆我们打开的文件,给文件做缓冲

  3. swap

    si:每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。

    so:每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

  4. io

    bi:块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte

    bo:块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。

  5. system

    in:每秒CPU的中断次数,包括时间中断

    cs:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的 数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或 者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核 空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的 时间少了,CPU没有充分利用,是不可取的。

    us:用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。

  6. cpu

    sy:系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。

    id:空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。

    wa:等待IO CPU时间。

    st:Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.


三、vmstat选项

vmstat [-a] [-n] [delay [ count]]
vmstat [-f] [-s] [-m]
vmstat [-S unit]
vmstat [-d]
vmstat [-p disk_partition]
vmstat [-V]

[-a]

显示 活动(active)和 非活动(inactive)的内存。

[root@localhost ~]# vmstat -a
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
21  0 4967788  42880 1520052 10006484    0    0     1    38    0    0 99  1  1  0  0

[-n]

只显示头信息,不周期性显示。这里没有测试出-n的作用,貌似有和没有,结果都一样。

[-f]

显示自开机以来forks的总数,包括fork、vfork和clone system calls,总数和tasks创建的数量是一致的。

[root@localhost ~]# vmstat -f
     14859691 forks

[-s]

显示各种事件计数器表和内存统计信息,这显示不重复。

[root@localhost ~]# vmstat -s
     12296092  total memory
     12253332  used memory
     10025748  active memory
      1496224  inactive memory
        42760  free memory
       150184  buffer memory
      2291928  swap cache
      8385920  total swap
      4967456  used swap
      3418464  free swap
   7370236747 non-nice user cpu ticks
       100426 nice user cpu ticks
     15924721 system cpu ticks
     44507677 idle cpu ticks
       180918 IO-wait cpu ticks
       359319 IRQ cpu ticks
     24376961 softirq cpu ticks
            0 stolen cpu ticks
     47630567 pages paged in
   2863042186 pages paged out
      1042307 pages swapped in
      2022082 pages swapped out
   3796748541 interrupts
     24399669 CPU context switches
   1414397902 boot time
     14860006 forks

[-m]

显示slabinfo

[-S unit]

unit表示返回值中数字的单位

k:1000

K:1024 (默认为K)

m:1000000

M:1048576

比较:k和K



[-d]

显示磁盘数据(disk statistics)

[root@localhost ~]# 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
cciss/c0d0 2063193 1232311 43446915 20089385 18545671 34543612 424731298 4742899      0   6714
cciss/c0d1 3460050 466721 51812099 9271428 328915899 333788431 5301510802 534921888      0  13434
md0        0      0       0       0      0      0       0       0      0      0

[ -D ]

显示磁盘统计表(disk table)

[root@localhost /]# vmstat -D
           19 disks
            8 partitions
      5523524 total reads
      1699437 merged reads
     95265054 read sectors
     29383985 milli reading
    347485112 writes
    368357613 merged writes
   5726634996 written sectors
    539699320 milli writing
            0 inprogress IO
        20151 milli spent IO

[-p]

显示磁盘分区数据(disk partition statistics )

查看磁盘分区:

[root@localhost /]#  fdisk -l
Disk /dev/cciss/c0d0: 146.7 GB, 146778685440 bytes
255 heads, 63 sectors/track, 17844 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
           Device Boot      Start         End      Blocks   Id  System
/dev/cciss/c0d0p1   *           1         522     4192933+  83  Linux
/dev/cciss/c0d0p2             523        1566     8385930   82  Linux swap / Solaris
/dev/cciss/c0d0p3            1567        3132    12578895   83  Linux
/dev/cciss/c0d0p4            3133       17844   118174140    5  Extended
/dev/cciss/c0d0p5            3133        4176     8385898+  83  Linux
/dev/cciss/c0d0p6            4177        5220     8385898+  83  Linux
/dev/cciss/c0d0p7            5221       17844   101402248+  83  Linux
Disk /dev/cciss/c0d1: 146.7 GB, 146778685440 bytes
255 heads, 63 sectors/track, 17844 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
           Device Boot      Start         End      Blocks   Id  System
/dev/cciss/c0d1p1   *           1       17844   143331898+  83  Linux
vmstat 使用:
[root@localhost /]# vmstat -p /dev/cciss/c0d0p1
cciss/c0d0p1    reads   read sectors  writes    requested writes
               86632    1701410    4119989   9299028

[-V]

显示版本信息

[root@localhost ~]# vmstat -V
procps version 3.2.7