监控 -- vmstat

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了监控 -- vmstat相关的知识,希望对你有一定的参考价值。

小Q:躲在某一时间,想念一段时光的掌纹;躲在某一地点,想念一个站在来路也站在去路的,让我牵挂的人。

简单的描述,希望可以帮到大家,有更多关于vmstat的用法,希望可以互相讨论!

======================================================

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

          系统中运行的每个进程都需要使用内存,但不是每个进程都需要每时每刻使用系统分 配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用  的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次 调用,并将释放出的内存提供给有需要的进程使用。

         在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。

         分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。

当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。 经管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时 的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing(颠簸)

-----------------------------------命令-------------------------------------

技术分享-a:显示活跃和非活跃内存

-f显示从系统启动至今的fork数量 。

-m显示slabinfo

-n只在开始时显示一次各字段名称。

-s显示内存相关统计信息及多种系统活动数量。

delay刷新时间间隔。如果不指定,只显示一条结果。

count刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。

-d显示磁盘相关统计信息。

-p显示指定磁盘分区统计信息

-S使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)

-V显示vmstat版本信息。

类别

项目

含义

说明

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等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。

 ------------------------------------常见问题处理-------------------------------------

如果r经常大于4,且id经常少于40,表示cpu的负荷很重。

如果pi,po长期不等于0,表示内存不足

如果disk经常不等于0,且在b中的队列大于3,表示io性能不好。

1.)如果在processes中运行的序列(process r)是连续的大于在系统中的CPU的个数表示系统现在运行比较慢,有多数的进程等待CPU。

2.)如果r的输出数大于系统中可用CPU个数的4倍的话,则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢。

3.)如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us)系统则面临着CPU资源的短缺。

-------------------------------vmstat特例用法--------------------------------------
查看系统已经fork了多少次

vmstat -f
processes  114688

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

查看内存的active和inactive

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
 0  0      0 361952  80536  48396    5  140   255   441 1031   87  6  8 85  1  0

    注:inact和active的数据来自于/proc/meminfo.

查看内存使用的详细信息

vmstat -s
       515600  total memory
       154020  used memory
        48396  active memory
        80600  inactive memory
            0  used swap
      1052248  free swap
        31352 non-nice user cpu ticks
          167 nice user cpu ticks

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

查看磁盘的读/写

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
sda    26411  18657 2900913  144728  22982 605889 5030968 3128488      0    117
hdc      143     94    1276     357      0      0       0       0      0      0
fd0        0      0       0       0      0      0       0       0      0      0
md0        0      0       0       0      0      0       0       0      0      0

    注:这些信息主要来自于/proc/diskstats.
merged:表示一次来自于合并的写/读请求,一般系统会把多个连接/邻近的读/写请求合并到一起来操作.

查看/dev/sda1磁盘的读/写

vmstat -p /dev/sda1
sda1          reads   read sectors  writes    requested writes
               35215    2842778     430114    3440912

     注:这些信息主要来自于/proc/diskstats
reads:来自于这个分区的读的次数.
read sectors:来自于这个分区的读扇区的次数.
writes:来自于这个分区的写的次数.
requested writes:来自于这个分区的写请求次数.

查看系统的slab(内存分配机制)信息

vmstat -m
Cache                       Num  Total   Size  Pages
rpc_buffers                   8      8   2048      2
rpc_tasks                     8     20    192     20
rpc_inode_cache               6      9    448      9
ip_fib_alias                 14    113     32    113
ip_fib_hash                  14    113     32    113
fib6_nodes                   24    113     32    113
ip6_dst_cache                16     30    256     15
ndisc_cache                   1     20    192     20
RAWv6                         4     11    704     11

----------------------------- ---------实验实例---------------------------------------

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

测试源程序如下:#include <stdio.h>#include <math.h>#include <unistd.h>#include <stdlib.h>
voidrun_status(void){double pi = M_PI;double pisqrt;long i;while(1){pisqrt = sqrt(pi);}}
intmain (void){run_status();
exit(EXIT_SUCCESS);}
gcc run.c -o run -lm./run&

运行:

vmstat 1
注:我们的程序不断的进行算术运算,r的值由0变成了1,而cpu的用户态利用率也达到了100%.如下:
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 304592  25244 147800    0    0     0     0 1010   31  0  1 99  0  0
 0  0      0 304592  25244 147800    0    0     0     0 1020   37  0  0 100  0  0
 1  0      0 304592  25244 147800    0    0     0    36 1016   46 69  1 30  0  0
 1  0      0 304592  25244 147800    0    0     0     0 1067   56 100  0  0  0  0
 1  0      0 304592  25244 147800    0    0     0     0 1010   31 100  0  0  0  0

实例二:大量的系统调用

本脚本会进入一个死循环,不断的执行cd命令,从而模拟大量系统调用的环境测试脚本如下:#!/bin/bash
while (true)docd ;done
chmod +x loop.sh./loop.sh

运行:

vmstat 1
注:程序不断的调用cd命令,此时进程不断的进行上下文切换,所以cs的值会骤然提高,而cpu的内核态利用率也会达到98%左右.如下:
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 304592  25248 147804    0    0   111    15 1025  179 20 20 59  0  0
 0  0      0 304592  25248 147804    0    0     0     0 1013   36  0  0 100  0  0
 1  0      0 304592  25248 147816    0    0     0     0 1015  422  1 72 27  0  0
 2  0      0 304592  25248 147816    0    0     0     0 1012  544  3 97  0  0  0
 1  0      0 304592  25248 147816    0    0     0     0 1007  522  3 97  0  0  0
 1  0      0 304592  25248 147816    0    0     0    64 1015  523  3 97  0  0  0
 2  0      0 304592  25248 147816    0    0     0     0 1003  572  2 98  0  0  0
 1  0      0 304592  25248 147816    0    0     0     0 1012 1263  2 98  0  0  0
 1  0      0 304592  25248 147816    0    0     0     0 1006 1264  3 97  0  0  0
 1  0      0 304592  25248 147816    0    0     0     0 1015 1249  3 97  0  0  0


实例三:大量的io操作

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

运行:

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.

接下来我们还用dd命令,这回从/tmp/data文件读,写到/dev/null文件中,如下:
dd if=/tmp/test1 f=/dev/null bs=1M

运行:

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.

接下来我们继续用dd命令,把数据写到/dev/ram1里,如下:
dd if=/dev/zero f=/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

运行:

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会增加.

实例四:大量的占用内存

本程序会不断分配内存,直到系统崩溃.
#include <stdio.h>#include <string.h>#include <stdlib.h>
int main (int argc, char *argv[]){void *ptr;int n = 0;while (1){ptr = malloc(0x100000);
if (ptr == NULL)break;
memset(ptr, 1, 0x100000);printf("malloced %d MB\n", ++n);}
pause();}
gcc callmem.c -o callmem./callmem

运行:

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   7512  18796 451064    0    0   346   442 1028  105  8 10 81  1  0
 0  0      0   7512  18796 451064    0    0     0     0 1012   36  0  1 99  0  0
 2  0      0   6096  18704 417676    0    0     0     0 1042  169  0 88 12  0  0
 1  0      0   5896  18616 379356    0    0     0     0 1048  183  1 99  0  0  0
 1  0      0   6324  18532 340796    0    0     0    36 1043  215  1 99  0  0  0
 1  0      0   6376  18444 302372    0    0     0     0 1048  195  0 100  0  0  0
 1  0      0   6036  18384 264904    0    0     0   &nbs

以上是关于监控 -- vmstat的主要内容,如果未能解决你的问题,请参考以下文章

vmstat和iostat命令进行Linux性能监控

使用vmstat和iostat命令进行Linux性能监控

linux监控工具vmstat命令详解(转)

Linux入门之常用命令(11) 系统监控 vmstat top

Vmstat命令监控Linux资源并将数据通过图形化方式显示

vmstat详解