vmstat-CPU性能调优工具
vmstat
vmstat是VirtualMeomoryStatistics,虚拟内存统计的缩写,可对虚拟内存、进程、cpu活动进行监控。相比top,我们可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样),不足之处是只给出系统总体的上下文切换情况、无法对某个进程进行深入分析,要想查看每个进程的详细情况,就需要使用pidstat命令,pidstat -w
。很多Linux发行版本都默认安装了此命令工具。
vmstat命令的语法和参数
vmstat [-V] [-n] [delay [count]]
参数 | 用法说明 |
---|---|
-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 (Running or Runnable) | 表示运行队列,也就是cpu中有多少个进程正在等待。 | 从图中数据来看,这台服务器目前CPU的资源比较空闲。如果r列的数字大于CPU核数,那么说明现在有大量的进程在等待cpu进行计算,可能出现了CPU不够用的情况,就很可能出现CPU瓶颈(在判断时,还需要结合CPU使用的百分比一起来看,也就是图中最后5列的数据指标)。一般该数据超出了CPU核数的3个时,就比较高了;超出5个就很高了;如果超过了10,那就很不正常,服务器的状态就很危险。此时,可能需要去增加cpu数量,或者减少运行的进程数。 |
b(Blocked) | 表示阻塞的进程数,也就是有多少进程正在不可中断的休眠。比如因为等待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)读入虚拟内存的数据大小。 | 一般如果si和so的值长期不为0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉 |
so | 每秒物理内存写入磁盘(虚拟内存 swap)的数据大小。 | so和si相反。是将内存数据写入磁盘。 |
bi | 表示数据块(block)设备每秒读取的块数量(从磁盘读取数据,一般表每秒读取了此判断而多少个block) | 这里的块设备是指系统上所有的磁盘和其它块设备,默认块大小是1024字节(Byte) |
bo | 表示块(block)设备每秒写入的块数量(往磁盘写入数据,一般表示每秒有多少个block写入了磁盘) | 在随机磁盘读写时,bi和bo这两个值越大(如超出1024k),CPU在I/O等待的值也会越大 |
in(interrupter) | 每秒CPU的中断次数 | 包括时间中断 |
cs(context switch) | 每秒上下文切换次数的数量,例如我们调用系统函数,就会导致上下文切换、包括线程的切换和进程的上下文切换 | 这个值要越小越好,太大要考虑调低线程或者进程的数目。 |
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值高时(参考值20%),说明I/O等待比较严重,可能是由于磁盘大量进行随机访问所造成;也可能是磁盘或者磁盘控制器的带宽出现瓶颈(块操作非常频繁) |
st | CPU等待虚拟机调度的时间占比 | 该指标一般在虚拟机才会有,在物理机中,该值一般维持为0。虚拟机中的CPU一般是物理机CPU的虚拟核,一台物理机一般会有多个虚拟机同时在运行,那么此时虚拟机之间就会存在CPU争抢情况。比如某台虚拟机上运行着占用CPU很道德密集型计算,就会导致其他的虚拟机上的CPU需要一直等待密集型计算的虚拟机上CPU的释放。st就是等待时间占CPU的占比,该值如果一直持续很高,那么表示虚拟服务器需要长期等待CPU,运行在该服务器的应用程序的性能也会受到直接的影响 |
综上,在对CPU的评估中,需要重点注意的是procs项r列的值和CPU项的us、sy、id列的值。
内存不足的表现: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(内存和磁盘的页面交换)两个指标进行分析。正常来说,当物理内存能满足系统需要的话(也就是说物理内存能足以存放所有进程的数据),那么物理内存和磁盘(虚拟内存)是不应该存在频繁的页面交换操作的,只有当物理内存不能满足需要时系统才会把内存中的数据交换到磁盘中。而由于磁盘的性能是比内存慢很多的,所以如果存在大量的页面交换,那么系统的性能必然会受到很大影响。
uptime
uptime是监控系统性能最常用的一个命令之一,主要用来统计系统当前的运行状况。输出的信息依次为:系统现在的时间,系统从上次开机到现在运行了多长时间,系统目前有多少登录用户,系统在1min内、5min内、15min内的平均负载。
20:39:10 up 5 min, 2 users, load average: 0.04, 0.07, 0.04
这里需要注意的是load average这个输出值,这3个值的大小一般不能大于系统CPU的个数,例如,本输出中系统有8个CPU,如果load average的3个值长期大于8,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于8时不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的时间片。
查看逻辑CPU个数的命令:cat /proc/cpuinfo | grep 'processor' | wc -l
top命令也可以输出这些信息,但top命令输出的信息更多,想了解更多可以看下这篇top命令
mpstat
mpstat(MultiProcessor Statistics)是实时系统监控工具。主要报告与CPU相关统计信息,这些信息存放在/proc/stat文件中。它与vmstat命令类似,mpstat是通过/proc/stat里面的状态信息来进行统计的。
在多CPU系统里,使用该命令不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。而vmstat只能查看系统整体的CPU情况。
其实,vmstat中所有关于CPU的统计都适合mpstat,具体调优过程中,可以通过两个命令的结合来综合判断CPU是否有性能问题。例如,当通过两个命令都发现较低的%idle数值时,可以判断应该是CPU不足的问题。而当看到较高的%iowait数值时,可以判断当前负载下I/O系统出现了某些问题。
安装sysstat工具包
需要安装sysstat的工具包,这个工具包中带了很性能分析命令。
# 方式1:(不推荐,因为不能安装最新的版本,会导致没有%wait指标项)
yum install sysstat
# 方式2:使用rpm
wget -c http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm
rpm -Uvh sysstat-11.7.3-1.x86_64.rpm
# rpm -Uvh sysstat-11.7.3-1.x86_64.rpm,如果这条不行,用下面这个
rpm -Uvh sysstat-11.7.3-1.x86_64.rpm --nodeps --force
我的就是需要rpm -Uvh sysstat-11.7.3-1.x86_64.rpm --nodeps --force
才成功。
语法和参数
mpstat [-p {
cpu|ALL}] [interal [count]]
其中,各参数含义如下所述
- -P{cpu|ALL}:表示监控哪个CPU,CPU在[0,CPU个数-1]中取值。
- interal:相邻两次采样的间隔时间。
- count:采样的次数,count只能和delay一起使用
输入mpstat --help获取帮助信息
[root@localhost ~]# mpstat --help
用法: mpstat [ 选项 ] [ <时间间隔> [ <次数> ] ]
Options are:
[ -A ] [ -n ] [ -u ] [ -V ] [ -I {
SUM | CPU | SCPU | ALL } ]
[ -N {
<node_list> | ALL } ] [ -o JSON ] [ -P {
<cpu_list> | ALL } ]
参数 | 含义 |
---|---|
-A | 等同于-u -I ALL -P ALL |
-I | 可以指定SUM CPU SCPU ALL四个参数,SUM表示每个处理器的中断总数,CPU表示每个核的每秒中断数量, SCPU表示每个核每秒的软中断数量 |
-P | 统计的CPU编号,一般用ALL |
-u | 输出列的信息 |
-V | 查看工具版本号 |
# 每秒显示一次监控数据,采集10次
mpstat 1 10
15时06分03秒 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
输出各参数含义:
参数 | 说明 | 从/proc/stat获得数据 |
---|---|---|
CPU | 处理器ID | |
%usr | 显示在用户级(应用程序)执行时发生的CPU利用率百分比 | usr/total*100 |
%nice | 具有nice优先级的用户下,CPU的使用率 | nice/total*100 |
%sys | 显示系统进程消耗的CPU时间百分比。不包括维护硬件和软件中断所花费的时间 | system/total*100 |
%iowait | 显示I/O等待所占用的CPU时间百分比 | iowait/total*100 |
%irq | 显示CPU或CPU用于服务硬件中断的时间百分比 | irq/total*100 |
%soft | 显示CPU或CPU用于服务软件中断的时间百分比。 | softirq/total*100 |
%steal | 显示虚拟机管理器在服务另一个虚拟处理器时虚拟CPU处在非自愿等待下花费时间的百分比 | steal/total*100 |
%guest | 显示运行虚拟处理器时CPU花费时间的百分比 | guest/total*100 |
%gnice | 显示CPU或CPU运行niced客户机所花费的时间百分比 | gnice/total*100 |
%idle | 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间 | idle/total*100 |
统计系统中第3个核的CPU状态信息
mpstat -P 2 3 5
3秒获取一次所有的监控数据
mpstat -P ALL 3
# 每2秒获取所有的cpu的监控数据,采集5次,
mpstat -P ALL 2 5
注意:P是大写
查看所有CPU或指定CPU中断统计
[root@vircent7 opt]# mpstat -I SUM -P ALL
Linux 3.10.0-1160.66.1.el7.x86_64 (vircent7.kyj) 2022年05月22日 _x86_64_ (2 CPU)
15时27分19秒 CPU intr/s
15时27分19秒 all 311.29
15时27分19秒 0 126.02
15时27分19秒 1 185.27
参考《软件性能测试、分析与调优实践之路 (张永清)》、《高性能Linux服务器运维实战:shell编程、监控告警、性能优化与实战案例》