vmstat 命令

目录

1. vmstat

2. 字段含义说明

3. 常见问题处理

3.1 常见问题及解决方法

3.2 内存问题现象

4. 常见性能问题分析

4.1 IO/CPU/men连锁反应

4.2 内存不足

4.3 io瓶颈

4.4 CPU瓶颈:load,vmstat中r列

4.5 CPU瓶颈

5. 其他说明


1. vmstat

vmstat(VirtualMeomoryStatistics,虚拟内存统计)是Linux中监控内存的常用工具,可对操作系统的虚拟内存、进程、CPU等的整体情况进行监视。

vmstat -help
常用参数(选项)解释
-a显示活跃和非活跃内存
-f显示从系统启动至今的fork数量 。
-m显示slabinfo
-n只在开始时显示一次各字段名称。
-s显示内存相关统计信息及多种系统活动数量。
delay刷新时间间隔。如果不指定,只显示一条结果。
count刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d显示磁盘相关统计信息。
-p显示指定磁盘分区统计信息
-S使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-V显示vmstat版本信息。

2. 字段含义说明

类别项目含义说明
Procs(进程)r等待执行的任务数展示了正在执行和等待cpu资源的任务个数。当这个值超过了cpu个数,就会出现cpu瓶颈。
b等待IO的进程数量
Memory(内存)swpd正在使用虚拟的内存大小,单位k
free空闲内存大小
buff已用的cache大小,文件系统的cache
cache已用的cache大小,文件系统的cache
inact非活跃内存大小,即被标明可回收的内存,区别于free和active具体含义见:概念补充(当使用-a选项时显示)
active活跃的内存大小具体含义见:概念补充(当使用-a选项时显示)
Swapsi每秒从交换区写入内存的大小(单位:kb/s)
so每秒从内存写到交换区的大小
IObi每秒读取的块数(读磁盘)现在的Linux版本块的大小为1024bytes
bo每秒写入的块数(写磁盘)
systemin每秒中断数,包括时钟中断)这两个值越大,会看到由内核消耗的cpu时间会越多
cs每秒中断数,包括时钟中断
CPU(以百分比表示)Us用户进程执行消耗cpu时间(user time)us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期超过50%的使用,那么我们就该考虑优化程序算法或其他措施了
Sy系统进程消耗cpu时间(system time)sys的值过高时,说明系统内核消耗的cpu资源多,这个不是良性的表现,我们应该检查原因。
Id空闲时间(包括IO等待时间)
wa等待IO时间Wa过高时,说明io等待比较严重,这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈。

3. 常见问题处理

3.1 常见问题及解决方法

  1. 如果 r 经常大于4,且 id 经常少于40,表示 cpu 的负荷很重。

  2. 如果 pipo 长期不等于0,表示内存不足。

  3. 如果 disk 经常不等于0,且在 b 中的队列大于3,表示 io 性能不好。

  4. 如果在 processes 中运行的序列(process r)是连续的大于在系统中的CPU的个数表示系统现在运行比较慢,有多数的进程等待CPU。

  5. 如果 r 的输出数大于系统中可用CPU个数的4倍的话,则系统面临着CPU短缺的问题,或者是CPU的速率过低,系统中有多数的进程在等待CPU,造成系统中进程运行过慢。

  6. 如果空闲时间(cpu id)持续为0并且系统时间(cpu sy)是用户时间的两倍(cpu us)系统则面临着CPU资源的短缺。

当发生以上问题的时候请先调整应用程序对CPU的占用情况.使得应用程序能够更有效的使用CPU。同时可以考虑增加更多的CPU。 关于CPU的使用情况还可以结合mpstat, ps aux top prstat –a 等等一些相应的命令来综合考虑关于具体的CPU的使用情况,和那些进程在占用大量的CPU时间。一般情况下,应用程序的问题会比较大一些。比如一些sql语句不合理等等都会造成这样的现象。

3.2 内存问题现象

内存的瓶颈是由scan rate (sr)来决定的,scan rate是通过每秒的始终算法来进行页扫描的。如果scan rate(sr)连续的大于每秒200页则表示可能存在内存缺陷吗,同样的如果page项中的pi和po这两栏表示每秒页面的调入的页数和每秒调出的页数,如果该值经常为非零值,也有可能存在内存的瓶颈。当然,如果个别的时候不为0的话,属于正常的页面调度这个是虚拟内存的主要原理。

  • 解决办法
  1. 调节applications & servers使得对内存和cache的使用更加有效。

  2. 增加系统的内存。

  3. Implement priority paging in s in pre solaris 8 versions by adding line "set priority paging=1" in /etc/system. Remove this line if upgrading from Solaris 7 to 8 & retaining old /etc/system file.

关于内存的使用情况还可以结 ps aux top  prstat –a 等等一些相应的命令来综合考虑关于具体的内存的使用情况,和那些进程在占用大量的内存。一般情况下,如果内存的占用率比较高,但是,CPU的占用很低的时候,可以考虑是有很多的应用程序占用了内存没有释放,但是,并没有占用CPU时间,可以考虑应用程序,对于未占用CPU时间和一些后台的程序,释放内存的占用。

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

4. 常见性能问题分析

4.1 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增加

4.2 内存不足

  1. 开始使用swpd,swpd不为0
  2. si so大于0开始从硬盘中读取

4.3 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观察

4.4 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瓶颈了

4.5 CPU瓶颈

  • us 用户CPU时间高超过90%

涉及到web服务器,cs 每秒上下文切换次数 例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

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

5. 其他说明

内容含义
b表示阻塞的进程。
swpd虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free空闲的物理内存的大小。
buffLinux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存。
cachecache直接用来记忆我们打开的文件,给文件做缓冲。(这里是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每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种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时间。

原文链接

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值