linux常用命令之vmstat命令教程

发布时间:2020-10-26编辑:脚本学堂
本文介绍了linux常用命令之vmstat命令的用法,vmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、中断、上下文切换、CPU使用等,有需要的朋友参考下。

vmstat是什么?

vmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、中断、上下文切换、CPU使用等。

对于 linux 的性能分析,100%理解 vmstat 输出内容的含义,并能灵活应用,那对系统性能分析的能力就算是基本掌握了。
vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。
这个命令是我查看Linux/Unix最喜爱的命令,
一个是Linux/Unix都支持,二是相比top命令,可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。
 

解释

一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:# vmstat 2 1
vmstat的输出分为以下几种模式:
(1)、VM MODE (普通选项)
(2)、DISK MODE(-d选项)
(3)、DISK PARTITION MODE(-p选项)
(4)、SLAB MODE (-m选项)

对输出解释如下:
  1)procs
  a.r列表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU个数,就说明CPU资源不足,可以考虑增加CPU;
  b.b列表示在等待资源的进程数,比如正在等待I/O或者内存交换等。
  2)memory
  a、swpd列表示切换到内存交换区的内存数量(以KB为单位)。如果swpd的值不为0或者比较大,而且si、so的值长期为0,那么这种情况一般不用担心,不会影响系统性能;
  b、free列表示当前空闲的物理内存数量(以KB为单位);
  c、buff列表示buffers cache的内存数量,一般对块设备的读写才需要缓冲;
作为buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
  d、cache列表示page cached的内存数量,一般作文件系统的cached,频繁访问的文件都会被cached。如果cached值较大,就说明cached文件数较多。如果此时IO中的bi比较小,就说明文件系统效率比较好。

作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。
  3)swap
  a、si列表示由磁盘调入内存,也就是内存进入内存交换区的数量;
  b、so列表示由内存调入磁盘,也就是内存交换区进入内存的数量
  c、一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足,需要考虑是否增加系统内存
  4)IO
  a、bi列表示从块设备读入的数据总量(即读磁盘,单位KB/秒)
  b、bo列表示写入到块设备的数据总量(即写磁盘,单位KB/秒)
  这里设置的bi+bo参考值为1000,如果超过1000,而且wa值比较大,则表示系统磁盘IO性能瓶颈。
  5)system
  a、in列表示在某一时间间隔中观察到的每秒设备中断数;
  b、cs列表示每秒产生的上下文切换次数。
  上面这两个值越大,会看到内核消耗的CPU时间就越多。
  6)CPU
  a、us列显示了用户进程消耗CPU的时间百分比。us的值比较高时,说明用户进程消耗的CPU时间多,如果长期大于50%,需要考虑优化程序啥的。
  b、sy列显示了内核进程消耗CPU的时间百分比。sy的值比较高时,就说明内核消耗的CPU时间多;如果us+sy超过80%,就说明CPU的资源存在不足。
  c、id列显示了CPU处在空闲状态的时间百分比;
  d、wa列表示IO等待所占的CPU时间百分比。wa值越高,说明IO等待越严重。如果wa值超过20%,说明IO等待严重。
  e、st列一般不关注,虚拟机占用的时间百分比。 (Linux 2.6.11)

r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。

swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。

buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。

bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in 每秒CPU的中断次数,包括时间中断
cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apachenginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt 等待IO CPU时间。

以下是vmstat命令的使用实例,大家做个参考。
 

复制代码 代码示例:

[root@localhost ~]# vmstat -f  -f  显示自开机以来forks的总数,包括fork、vfork和clone system calls,总数和tasks创建的数量是一致的。
[root@localhost ~]# vmstat -a  -a  显示 活动(active)和 非活动(inactive)的内存。
[root@rac01 ~]# vmstat -s  -s  显示各种事件计数器表和内存统计信息
[root@rac01 ~]# vmstat -d  -d  显示磁盘数据(disk statistics)
[root@rac01 ~]# vmstat -D  -D  显示磁盘统计表(disk table)
[root@rac01 ~]# vmstat -p /dev/sda2 2  -p 分区  显示磁盘分区数据
[root@rac01 ~]# vmstat -S k 2  -S 单位

[root@centos5 ~]# vmstat -m  与下面的命令类似
Cache Num Total Size Pages
size-32 4018 4068 32 113
[root@CentOS5 ~]# slabtop

[root@CentOS5 ~]# ll /proc/slabinfo

[root@CentOS5 ~]# vmstat -p /dev/sdb1 2 -n  不重复显示标题头,只显示一次
sdb1 reads read sectors writes requested writes
1129843 23753591 264152 37455672
1129844 23753599 264153 37455688
1129844 23753599 264157 37455800
1129845 23753607 264173 37456104
1129845 23753607 264175 37456136

下面通过运维中的案例加以分析,开发人员报告系统运行缓慢,影响用户访问。
流程与步骤
一,登录相关故障主机。
1.top查看看到负载较高
 

复制代码 代码示例:
top - 15:58:54 up 34 days, 35 min, 2 users, load average: 5.54, 5.35, 5.09
 

2.vmstat查看
 

复制代码 代码示例:
[root@CentOS5 ~]# vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 9 77580 52532 3512 1066464 0 0 6 57 6 3 1 0 99 0 0
0 11 77580 54268 3436 1064712 0 0 1324 5516 1158 498 49 6 0 46 0
0 8 77580 54264 3456 1064956 0 0 966 3176 1095 349 6 2 0 93 0
20 8 77580 54572 3372 1064492 0 0 682 7406 1148 596 59 7 0 35 0
1 10 77580 53736 3300 1064772 0 0 2190 11894 1268 1270 84 13 0 2 0
2 9 77580 54968 3172 1062376 0 0 852 12480 1116 361 88 11 0 2 0
0 6 77580 52228 3180 1065692 0 0 840 5994 1123 548 52 6 0 42 0
20 9 77580 54108 3200 1063668 0 0 940 5488 1112 487 54 7 0 40 0
4 10 77580 51588 3244 1066748 0 0 454 6752 1081 317 51 6 0 43 0
1 8 77580 54732 2840 1063384 0 0 944 12140 1130 582 77 12 0 11 0
0 10 77580 55488 2596 1057480 0 0 1044 33282 1082 201 3 4 0 94 0
1 8 77580 56696 2664 1058312 0 0 466 18 1223 415 2 1 0 97 0
0 9 77580 56736 2728 1062004 0 0 708 1540 1154 417 7 2 0 91 0
1 7 77580 53676 2780 1065040 0 0 1552 6840 1152 748 78 11 0 12 0
5 8 77580 52828 2768 1065776 0 0 3088 2958 1301 939 18 3 0 79 0
5 8 77580 54844 2808 1063516 0 0 1168 7900 1142 803 89 11 0 0 0
 

3.iostat查看
 

复制代码 代码示例:

[root@CentOS5 ~]# iostat 1
avg-cpu: %user %nice %system %iowait %steal %idle
24.62 0.00 2.51 72.86 0.00 0.00

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.00 0.00 0.00 0 0
sda1 0.00 0.00 0.00 0 0
sda2 0.00 0.00 0.00 0 0
sda3 0.00 0.00 0.00 0 0
sdb 259.30 5953.77 3320.60 11848 6608
sdb1 259.30 5953.77 3320.60 11848 6608
dm-0 678.39 6082.41 3320.60 12104 6608
 

4.iostat查看
 

复制代码 代码示例:

[root@CentOS5 ~]# iostat -xN 1
Linux 2.6.18-194.el5 (CentOS5) 2014年05月17日

avg-cpu: %user %nice %system %iowait %steal %idle
2.24 0.05 0.46 5.22 0.00 92.03

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 0.21 1.61 0.48 0.73 12.21 18.72 25.61 0.02 15.94 6.99 0.84
sda1 0.01 0.00 0.00 0.00 0.03 0.00 30.51 0.00 15.86 12.73 0.00
sda2 0.12 0.38 0.02 0.01 1.10 3.10 132.98 0.00 38.78 32.13 0.10
sda3 0.08 1.23 0.45 0.72 11.07 15.62 22.72 0.02 15.33 6.57 0.77
sdb 0.35 73.18 18.65 4.47 392.15 621.19 43.83 0.22 9.48 2.96 6.85
sdb1 0.35 73.18 18.65 4.47 392.13 621.19 43.83 0.22 9.48 2.96 6.85
datavg-oracle 0.00 0.00 18.99 77.65 392.12 621.19 10.49 3.84 39.72 0.71 6.85

5.ps命令查看
 

复制代码 代码示例:
[root@CentOS5 ~]# ps aux|grep oracle
[root@CentOS5 ~]# ps -ef|grep ora|wc -l
127
[root@CentOS5 ~]# ps aux|grep D

6.fuser命令查看
 

复制代码 代码示例:

[root@CentOS5 ~]# fuser -vm /oracle

USER PID ACCESS COMMAND
/oracle: oracle 2859 F..e. tnslsnr
oracle 2926 F.ce. oracle
oracle 2928 F.ce. oracle
oracle 2930 F.ce. oracle
oracle 2932 F.ce. oracle
oracle 2934 F.ce. oracle
oracle 2936 F.ce. oracle
oracle 2938 F.ce. oracle
oracle 2940 F.ce. oracle
oracle 2942 F.ce. oracle
oracle 2944 F.ce. oracle

以上就是linux下vmstat命令的用法,希望对大家有所帮助。