vmstat是VirtualMeomoryStatistics,虚拟内存统计的缩写,可对虚拟内存、进程、cpu活动进行监控。相比top,我们可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
| 参数 | 用法说明 |
|---|---|
| -a, --active | 显示活跃或非活跃的内存 |
| -f, --forks | 线程从系统启动至今的fork数量。fork一般指启动过的进场数量,Linux操作系统用fork()函数来创建进程 |
| -m, --slabs | 显示slab信息。slab时Linux内核中按照对象大小进行分配的内存分配器,通过slab的信息可以用来查看各个内核模块占用的内存空间,可以通过`cat/proc/meminfo |
| -n,–one-header | 只显示头部第一行的信息 |
| -s, --stats event counter statistics | 以表格方式显示时间计数器的内存状态 |
| -d, --disk statistics | 显示每一块磁盘I/O相关的明细信息 |
| -D,–disk-sum | 显示磁盘I/O相关的汇总信息,-D显示的信息是对-d参数显示的每个磁盘块信息的汇总 |
| -p, --partition | 显示指定的磁盘分区的I/O读写信息 |
| -S, --unit | 使用指定单位显示。参数有k、K、m、M,分别代表1000、1024、1000000、1048576字节、默认单位为K(1024字节) |
| -w,–wide output | 这个参数用于调整命令输出结果的显示方式。输出的结果和单独执行vmstat命令得到的结果完全一样,只是在输出时,会以更宽的宽度来展示数据 |
| -t, --timestamp show timestamp | 在vmstat命令输出数据的基础上,增加每次获取数据时当前时间戳的输出显示 |
| -V,–version output version information and exit | 输出vmstat命令的版本信息 |
最常使用的命令如下,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数。
# vmstat [delay count]每1秒显示一次数据,连续收集10条数据
[root@localhost ~]# vmstat 1 10
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1094548 2108 362988 0 0 28 1 40 59 0 0 100 0 0
0 0 0 1094548 2108 362988 0 0 0 0 106 100 0 1 100 0 0
0 0 0 1094548 2108 362988 0 0 0 0 98 95 0 0 100 0 0
0 0 0 1094548 2108 362988 0 0 0 0 81 75 0 0 100 0 0
0 0 0 1094548 2108 362988 0 0 0 0 85 80 0 0 100 0 0
0 0 0 1094548 2108 362988 0 0 0 0 83 78 0 0 100 0 0
0 0 0 1094548 2108 362988 0 0 0 0 90 84 0 0 100 0 0
0 0 0 1094548 2108 362988 0 0 0 0 86 79 0 0 100 0 0
0 0 0 1094548 2108 362988 0 0 0 0 83 78 0 0 100 0 0
0 0 0 1094548 2108 362988 0 0 0 0 87 83 0 0 100 0 0
| 数据项 | 释义 | 分析/备注 |
|---|---|---|
| r | 表示运行队列,也就是cpu中有多少个进程正在等待。 | 从图中数据来看,这台服务器目前CPU的资源比较空闲。如果r列的数字大于CPU核数,那么说明现在有大量的进程在等待cpu进行计算,可能出现了CPU不够用的情况,就很可能出现CPU瓶颈(在判断时,还需要结合CPU使用的百分比一起来看,也就是图中最后5列的数据指标)。一般该数据超出了CPU核数的3个时,就比较高了;超出5个就很高了;如果超过了10,那就很不正常,服务器的状态就很危险。此时,可能需要去增加cpu数量,或者减少运行的进程数。 |
| b | 表示阻塞的进程数,也就是有多少进程正在不可中断的休眠。比如因为等待I/O、内存交换、CPU等资源而造成了阻塞 | 该值如果过高,需要检查服务器上I/O、内存、CPU资源是不是出现了瓶颈。 |
| swpd | 虚拟内存已使用的大小。 | swap指的是服务器的物理内存不够用时,会把服务器物理内存中的部分空间释放出来,以供急需物理内存来运行的程序使用,而那些从物理内存释放出来的内容一般是一些很长时间没有什么实际运行的程序,这些内容会被临时保存到swap中,等到这些程序要实际运行时,再从swap中恢复到物理内存中。swap一般使用的都是磁盘的空间,而磁盘I/O读写一般会比物理内存慢很多,如果存在大量的swap读写交换,将会非常影响程序运行的性能。因此虚拟内存已使用的大小也就是已从物理内存切换出来的内容大小(单位为K)。此处需要注意,如果swap大于0,并不表明服务器的物理内存不够用,通常还需结合si和so这两个数据指标一起来分析。如果si和so还维持在0左右,那么服务器的物理内存还是够用的。 |
| free | 空闲的物理内存的大小。即还有多少物理内存没有被使用(单位为k) | free不包含buff和cache两列的数据值 |
| buff | 表示作为Linux/Unix系统缓冲区的内存大小。单位为k | 一般对块设备的读写才需要缓冲区,一般内存很大的服务器,该值也会比较大,操作系统也会自动根据服务器的物理内存去调整缓冲区使用内存的大小,以提高读写的速度。 |
| cache | 表示用来给已经打开的文件作为缓存的内存大小。 | cache直接用来缓存我们打开的文件,把空闲的物理内存的一部分拿来作为文件和目录的缓存,为了提高程序执行的性能,当程序使用内存时,buffer/cached会很快被使用,当空闲的物理内存不足时(即free内存不足),这些缓存占用的内存便会释放出来。 |
| si | 每秒从磁盘(虚拟内存 swap)读入虚拟内存的数据大小。 | 如果这个值长期大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉 |
| so | 每秒物理内存写入磁盘(虚拟内存 swap)的数据大小。 | so和si相反。是将内存数据写入磁盘 |
| bi | 表示数据块(block)设备每秒读取的块数量(从磁盘读取数据,一般表每秒读取了此判断而多少个block) | 这里的块设备是指系统上所有的磁盘和其它块设备,默认块大小是1024字节(Byte) |
| bo | 表示块(block)设备每秒写入的块数量(往磁盘写入数据,一般表示每秒有多少个block写入了磁盘) | 在随机磁盘读写时,bi和bo这两个值越大(如超出1024k),CPU在I/O等待的值也会越大 |
| in(interrupter) | 每秒CPU的中断次数 | 包括时间中断 |
| cs | 每秒上下文切换次数的数量,例如我们调用系统函数,就会导致上下文切换、包括线程的切换和进程的上下文切换 | 这个值要越小越好,太大要考虑调低线程或者进程的数目。 |
| us(user time) | 用户CPU时间。 | 一般该值越高,说你名CPU被正常利用的越好 |
| sy (system time) | 内核进程执行时间的百分比 | sy如果太高,表示系统内核消耗的CPU资源多,并不是服务器性能好的表现。通常in、cs、I/O的频繁操作等过高,都会引起sy的指标过高,需要定位问题。 |
| id | 空闲CPU时间的占比。 | 一般来说,id + us + sy = 100。通常可认为id是空闲CPU使用率,us是用户使用率,sy是系统CPU使用率 |
| wa | I/O等待时间百分比 | wa值高时,说明I/O等待比较严重,可能是由于磁盘大量进行随机访问所造成;也可能是磁盘出现瓶颈(块操作非常频繁) |
| st | CPU等待虚拟机调度的时间占比 | 该指标一般在虚拟机才会有,在物理机中,该值一般维持为0。虚拟机中的CPU一般是物理机CPU的虚拟核,一台物理机一般会有多个虚拟机同时在运行,那么此时虚拟机之间就会存在CPU争抢情况。比如某台虚拟机上运行着占用CPU很道德密集型计算,就会导致其他的虚拟机上的CPU需要一直等待密集型计算的虚拟机上CPU的释放。st就是等待时间占CPU的占比,该值如果一直持续很高,那么表示虚拟服务器需要长期等待CPU,运行在该服务器的应用程序的性能也会受到直接的影响 |
| |
内存不足的表现:free memory急剧减少,回收buffer和cacher也无济于事,大量使用交换分区(swpd),页面交换(swap)频繁,读写磁盘数量(io)增多,缺页中断in增多,上下文切换(cs)次数增多,等待IO的进程数(b)增多,大量CPU时间用于等待IO(wa)。
实操一下
显示活跃和非活跃内存
# 显示活跃和非活跃内存
[root@vircent7 opt]# vmstat -a 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free inact active si so bi bo in cs us sy id wa st
4 0 0 178064 249552 462436 0 0 17 5 158 169 1 2 97 0 0
0 0 0 177780 249580 462532 0 0 0 0 457 473 1 4 95 0 0
0 0 0 177820 249580 462560 0 0 0 0 238 282 1 1 99 0 0
1 0 0 177624 249580 462492 0 0 0 22 262 300 1 1 98 0 0
2 0 0 177292 249580 462436 0 0 0 0 273 285 1 2 97 0 0
inact: 非活跃内存大小(当使用-a选项时显示)
active: 活跃的内存大小(当使用-a选项时显示)
查看磁盘的读写
[root@vircent7 opt]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sda 8374 5 650289 5306 10661 462 182952 10634 0 12
sr0 0 0 0 0 0 0 0 0 0 0
dm-0 6310 0 626167 4778 11119 0 188549 11258 0 12
dm-1 88 0 4408 26 0 0 0 0 0 0
查看/dev/sda1磁盘的读/写
[root@vircent7 opt]# vmstat -p /dev/sda1
sda1 reads read sectors writes requested writes
1869 12386 4 4096
对于内存监控,需要关心的指标包括:swpd、free、buff、cache、si和so,尤其需要重视的是free、si和so。很多人都会认为系统的空闲内存(free)少就代表系统性能有问题,其实并不是这样的,这还要结合si和so(内存和磁盘的页面交换)两个指标进行分析。正常来说,当物理内存能满足系统需要的话(也就是说物理内存能足以存放所有进程的数据),那么物理内存和磁盘(虚拟内存)是不应该存在频繁的页面交换操作的,只有当物理内存不能满足需要时系统才会把内存中的数据交换到磁盘中。而由于磁盘的性能是比内存慢很多的,所以如果存在大量的页面交换,那么系统的性能必然会受到很大影响。
参考《软件性能测试、分析与调优实践之路 (张永清)》