监控 -- 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(颠簸)。
-----------------------------------命令-------------------------------------
-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的主要内容,如果未能解决你的问题,请参考以下文章
Linux入门之常用命令(11) 系统监控 vmstat top