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分页读取写入数值趋近于零