vmstat

最近遇到了机器特别卡,请求发到服务器收不到响应的情况,总结了下 vmstat 定位系统性能问题的用法

快速上手

1
2
3
4
5
6
7
[root@VM_80_251_centos ~]# vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
4 0 0 86704 283040 1354508 0 0 1 16 5 0 0 0 99 0 0
0 0 0 86712 283040 1354508 0 0 0 12 231 327 1 0 99 0 0
0 0 0 86712 283040 1354508 0 0 0 0 193 265 0 0 100 0 0
0 0 0 86712 283040 1354512 0 0 0 0 173 235 0 1 99 0 0
  • r : 运行队列进程个数
  • si: 每秒交换分区写入内存量
  • so: 每秒内存写交换分区的量
  • bi: 每秒从块设备读取的块数量
  • bo: 每秒写入块设备的块数量
  • id: cpu 空闲状态百分比
  • wa: 等待io 所消耗的cpu 时间
  • st: 用于虚拟机,如果你的机器是虚拟化设备,虚拟 CPU 等待实际 CPU 的时间的百分比

这些指标我们在 top 里面也是可以看到的

1
2
3
4
5
top - 10:09:07 up 56 days, 22:11,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 82 total, 1 running, 81 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.3 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1882860 total, 74976 free, 165392 used, 1642492 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 1495532 avail Mem

第一行数字

当服务器出现问题,我们用vmstat 1 查找问题的时候,第一行数字是不可信的,指服务器启动至今各项指标的平均值,忽略这一行

怎么算正常,什么情况是有问题

  • cache数值大

cache数值大表示系统缓存了很多磁盘数据,利于磁盘IO的提升,这时候bi 应该会比较小,因为很多读磁盘的操作由cache 承担了

  • si/so 比较大

si/so 表示读写 swap的量,如果有应该是物理内存不够了,要操作交换分区

  • us > 50%

说明用户进程占用时间较多,代码需要优化

  • wa 较高

说明系统的此时系统的瓶颈在等待IO操作,磁盘成为主要瓶颈

  • r > cpu 核数

正在运行的队列任务数大于cpu核数,cpu成为性能瓶颈

  • us/sy 比较大可能也是正常的

如果在进行视频编解码,us会比较大,大于90%;如果要产生大量随机数,sy会比较大

-->