vmstat : virtual memory
statistics(虚拟内存统计),vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用率,虚拟内存交换情况,IO读写情况。这个命令在Linux/Unix系统都支持,相对于top命令,vmstat可以看到整个CPU,memory,
IO的使用情况,而不是单单看到各个进程的资源使用率.
(并不是说vmstat命令比top好,不用场景的应用不一样而已)。
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔,单位是秒;第二个参数是采样的次数,如:
[email protected]:~# vmstat2 1
procs -----------memory-------------------
---swap-- -----io---- -system------cpu----
r b
swpd
free buff
cache
si so
bi
bo in
cs
us sy id wa
1 0
0 3498472 315836
3819540
0 0
1 2
0 0
100 0
2表示每2秒采集一次服务器状态,1表示只采集一次。
在实际应用过程中,我们会在一段时间内一直监控,不想监控的时候直接结束vmstat,例如:
[email protected]:~# vmstat 2
procs-----------memory---------- ---swap-------io----
-system-- ----cpu----
r b
swpd
free
buff
cache si
so
bi bo
in
cs us
sy
id wa
1 0
0 3499840
315836 3819660
0 0
1 2
0 0
100 0
0 0
0 3499584
315836
3819660
0 0
0 88
158
0 0
100 0
0 0
0 3499708
315836
3819660
0 0
2 86
162
0 0
100 0
0 0
0 3499708
315836
3819660
0 0
10 81
151
0 0
100 0
1
0 3499732
315836
3819660
0 0
2
83 154
0 100
上面表示每2秒采集一次数据,一直采集,直到手动结束,上面采集了5次就结束了
接下来分析每一个字段返回值:
PROCS
r : (run)
CPU运行队列,cpu在单位时间内所能处理的进程数越高,那它的性能应该就越高。但是关于这个负载,网上很说法,有的说r值不应该超过cpu的核心数量;有的说r值不应该超过cpu核心数量的2倍;有的说不能超过cpu核心数量的3倍。其实每种说法都是对的,都是担心cpu承受不住,但上面说法不完全正确。关于这个数,我们应该根据当前的应用系统来判断。最主要的判断是cpu在达到一定程度负载的时候,系统能够运行良好。如果cpu的负载都超过核心数的好几倍了但是软件还依然运行流畅,那这个也是可以有的。
b :
(block)表示阻塞的进程,当运行队列r值的数量逐渐增加,达到了一定值的时候,进程就会被移动到b里面。理论上讲,blocked的值会一直增加,直到系统崩溃。
MEMORY
swpd : (swap
disk)虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是内存泄露的原因,那么该升级内存或者把耗内存的任务迁移到其他机器
内存泄露:用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。(其实说白了就是该内存空间使用完毕之后未回收)即所谓内存泄漏。
内存泄漏形象的比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。
free
:空闲的物理内存的大小
buff :
linux/unix系统是用来存储目录里面有什么内容权限等 的缓存
cache
:直接用来记忆我们打开的文件,给文件做缓冲,这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高程序执行的能力,当程序使用内存时,buffer/cached会很快地被使用
1.A buffer is something that has yet to be "written" to
disk.
2.A cache is something that has been "read" from the disk and
stored for later use.
Cache:由于cpu的速度远高于主内存,cpu直接从内存中存取数据要等待一定的时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。
Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2
Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
SWAP
si : (swap
in) 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存的进程解决掉.
so : (swap
out)每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。。。
I/O
bi : (block
in)块设备每秒接受的块数量(单位:KB/秒),这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小为1024byte,上面例子中没有io操作,
bo : (block
out) 块设备每秒发送的块数量(单位:KB/秒),例如我们读取文件,bo就要大于0,bi和bo一般都很接近0,不然就是IO过于频繁,需要调整。
块设备:系统中能够随机(不需要按顺序)访问固定大小数据片(chunks)的设备被称作块设备,这些数据片就称作块。最常见的块设备是硬盘、软盘、CD
ROM、闪存等。他们都是以安装文件系统的方式使用的,这也是块设备一般的访问方式。
字符设备:字符设备按照字符流的方式被有序访问,像串口和键盘就都属于字符设备。如果一个硬件设备是以字符流的方式被访问的话,那就应该将它归于字符设备,反过来,如果一个设备是随机(无序的)访问的,那么它就属于块设备。
SYSTEM
in :
(interrupt) 每秒CPU的中断次数,包括中断时间。
cs : (context
switch) 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值越小越好,太大了,要考虑调低线程或者进程的数目。例如在web服务器中,做性能的时候,常常会进行几千甚至上万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程就是比较合适的值了。系统调用也是,每次调用函数,我们的代码就会进入内核空间,导致上下文切换,这个很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正事的时间少,CPU没有充分利用,是不可取的。
CPU
us : (user
time) 用户CPU时间,
sy : (system
time)系统时间
id :
(idle) 空闲CPU时间
wa : (wait
time) 等待IO 的CPU时间,wa值越高,说明IO等待越严重。如果wa值超过20%,说明IO等待严
重
如果一个CPU被充分利用的话,利用率分类之间均衡的比例应该是:
user time :65%-70%
system time :30%-35%
idle time :0%-5%
一般情况 us+sy+id=100
通过vmstat识别CPU瓶颈
如果r经常大于3,且id经常少于40,表示CPU的负荷很重。
如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu
us),系统则面临着cpu资源的短缺。
当cpu出现瓶颈的解决办法
1. 最简单的就是增加CPU个数、
2. 通过调整任务时间,如大任务放到系统不繁忙的情况下执行,进而平衡系统
3. 调整已有任务的优先级
首先表明,vmstat中的cpu的度量是百分比,当us+sy的值接近100时,表示cpu正在接近满负荷工作,cpu满负荷工作并不能说明什么,Unix总是试图尽可能的繁忙,使得任务的吞吐量最大化。唯一能够确定cpu瓶颈的还是r值。
通过vmstat识别IO瓶颈
如果disk经常不等于0,且在b中的队列大于3,表示io性能不好