vmstat命令

一、vmstat简介

vmstat命令是最常见的Linux/Unix监控工具。可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。vmstat可以看到整个机器的CPU,内存,IOf,分区的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。

二、命令语法

vmstat [options] [delay [count]]

delay 间隔时间 count 统计几次 不加count则一直按delay间隔刷新

options:

参数                                                   用法说明
-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 version information            输出vmstat命令的版本信息

[root@zedking ~]# vmstat 1 3 #1s间隔 执行三次
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 1503928   2264 210104    0    0     7     1   62   80  0  0 99  0  0
 0  0      0 1503680   2264 210104    0    0     0     0  131  185  0  0 100  0  0
 1  0      0 1503352   2264 210104    0    0     0     0  137  181  0  1 99  0  0
[root@zedking ~]#

三、命令显示字段含义(vmstat不加-参数)

类别 项目 含义 说明
procs(进程) r 可运行的进程(正在运行或者在等待运行) 展示了正在执行和等待cpu资源的任务个数。当这个值超过了cpu个数,就会出现cpu瓶颈。
b The number of processes blocked waiting for I/O to complete.  
memory(内存) swpd the amount of virtual memory used  
free the amount of idle memory  
buff the amount of memory used as buffers  
cache the amount of memory used as cache  
inact the amount of inactive memory vmstat -a选项显示的内容。inactive 被标明可回收的内存。
active the amount of active memory
swap si 每秒从交换区写入内存的大小(单位:kb/s)  
so 每秒从内存写到交换区的大小  
io bi 每秒读取的块数(读磁盘) 块设备每秒接收的块数量,单位是block,这里的块设备是指系统上所有的磁盘和其他块设备
bo 每秒写入的块数(写磁盘) 块设备每秒发送的块数量,单位是block
system in 每秒中断数,包括时钟中断

这两个值越大,会看到由内核消耗的cpu时间sy会越多。

秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目

cs 每秒上下文切换数
CPU(以百分比表示) us 用户进程执行消耗cpu时间(user time)  us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施了
sy 系统进程消耗cpu时间(system time) sys的值过高时,说明系统内核消耗的cpu资源多,这个不是良性的表现,我们应该检查原因。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足
id 空闲时间(包括IO等待时间) 一般来说 us+sy+id=100
wa 等待IO时间 wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。

四.常见性能问题分析

 IO/CPU/men连锁反应
    1.free急剧下降
    2.buff和cache被回收下降,但也无济于事
    3.依旧需要使用大量swap交换分区swpd
    4.等待进程数,b增多
    5.读写IO,bi bo增多
    6.si so大于0开始从硬盘中读取
    7.cpu等待时间用于 IO等待,wa增加
内存不足
    1.开始使用swpd,swpd不为0
    2.si so大于0开始从硬盘中读取
io瓶颈
    1.读写IO,bi bo增多超过2000
    2.cpu等待时间用于 IO等待,wa增加 超过20
    3.sy 系统调用时间长,IO操作频繁会导致增加 >30%
    4.wa io等待时间长
        iowait% <20%            良好
        iowait% <35%            一般
        iowait% >50%
    5.进一步使用iostat观察
CPU瓶颈:load,vmstat中r列
    1.反应为CPU队列长度
    2.一段时间内,CPU正在处理和等待CPU处理的进程数之和,直接反应了CPU的使用和申请情况。
    3.理想的load average:核数*CPU数*0.7
        CPU个数:grep 'physical id' /proc/cpuinfo | sort -u
        核数:grep 'core id' /proc/cpuinfo | sort -u | wc -l
    4.超过这个值就说明已经是CPU瓶颈了
CPU瓶颈
    1.us 用户CPU时间高超过90% 涉及到web服务器,cs 每秒上下文切换次数
    例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
    

   1.cs可以对apache和nginx线程和进程数限制起到一定的参考作用
    2.我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了
较好的趋势:主要是 swap使用少,swpd数值低。si so分页读取写入数值趋近于零

 

posted @ 2022-08-24 20:04  zed99  阅读(126)  评论(0编辑  收藏  举报