Linux 性能监控实战:top 与 vmstat 定位 CPU 瓶颈

14 ℃ 0 条
内容摘要服务器变慢时只重启往往治标不治本。本文用 top、vmstat、iostat 三个系统自带工具,讲清 load average 与 CPU 各指标的含义,说明如何区分 CPU 密集、内存不足与磁盘 IO 饱和三类瓶颈,并给出现成的排查命令与判断阈值。
Linux 性能监控实战:top 与 vmstat 定位 CPU 瓶颈

服务器变慢时,很多人的第一反应是重启。其实 CPU 密集、内存不足、磁盘 IO 饱和这三类问题在监控指标上的表现完全不同,用错命令会把排查方向带偏。本文给出一套 Linux 性能监控的通用排查路径,用 top、vmstat、iostat 三个系统自带工具,从负载数字一路定位到真实瓶颈。

一、先读懂负载与 CPU 的三组数字

1. load average 不是 CPU 使用率

load average 表示过去 1、5、15 分钟内处于可运行态和不可中断态的平均进程数,它把正在等待磁盘 IO 的进程也算进去了。因此 8 核机器上负载 8 只是刚好跑满;若此时 wa 很高,说明瓶颈在磁盘而不是计算。经验做法是拿负载除以核数,得到的结果超过 1 再结合 5 分钟、15 分钟的走势,判断是短时波动还是持续过载。核数可用 nproc 或 grep -c processor /proc/cpuinfo 直接读出。

2. us、sy、wa、id 分别说明什么

top 顶部的 CPU 行里,us 是用户态时间,sy 是内核态时间,wa 是等待 IO 完成的空闲时间,id 是真正空闲。sy 长期偏高通常与系统调用频繁、上下文切换过多有关;wa 持续超过 20% 说明磁盘是瓶颈源头,此时加 CPU 没有意义。另外注意 st 列,它是被虚拟机监控器偷走的时间,云主机上 st 偏高说明宿主机超卖。

二、用 top 与 vmstat 交替定位

1. top 的交互式观察要点

top 默认每 3 秒刷新一次,按 1 可以展开每个逻辑核的占用,用来判断是不是只有单核跑满;按 P 按 CPU 排序、按 M 按内存排序,能快速锁定异常进程。看内存时要分清 RES 与 VIRT:RES 是常驻物理内存,VIRT 是虚拟地址空间,VIRT 很大往往只是地址预留,并不占用真实内存。若 CPU 高而找不到对应进程,按 H 打开线程视图再排查。

top -o %CPU -d 2        # 按 CPU 排序,2 秒刷新
top -bn1 | head -20     # 批处理模式抓一次快照

2. vmstat 的 r 与 b 队列

vmstat 一次采样输出一整行指标,比 top 更适合观察趋势。r 列是可运行进程数,持续大于 CPU 核数说明已经出现排队;b 列是阻塞进程数,大于 0 通常卡在 IO 上。cs 列是每秒上下文切换次数,几百到几千属正常,达到数万则要先查是不是线程池配置过大。加 -w 让宽表格对齐,采样间隔与次数写在命令末尾。

vmstat -w 1 5           # 每 1 秒采样一次,共 5 次

三、内存与磁盘 IO 的连带排查

1. free 的正确读法

free 输出里的 available 列才是应用真正可用的内存,buff/cache 中大部分可被回收,不应算作已被占用。如果 available 长期低于总内存的 10%,同时 swap 使用量持续增长,说明内存已经吃紧,系统开始换页,这又会进一步加重磁盘负担。此时可用 vmstat 的 si、so 两列确认换页速率,单位是 KB/s,只要长期非零就说明内存不足。

free -h                      # 人类可读单位输出

2. 用 iostat 判断磁盘饱和度

iostat 的 %util 接近 100% 说明设备长期繁忙;await 是单个 IO 的平均完成时间,单位为毫秒,若明显高于 svctm 则存在排队。配合 -x 输出扩展指标、-d 只看设备,可以避开 CPU 行干扰,直接对着盘看。要注意 %util 对固态盘并不准确,SSD 可以并行处理多个请求,此时更应关注 await 与队列长度 aqu-sz。

iostat -x 1 3           # 每 1 秒输出扩展指标,共 3 次

关键配置提示

  • 判断负载必须先除以 CPU 核数,再交叉看 wa 是否偏高。
  • sy 与上下文切换偏高时,用 vmstat 的 cs 列继续定位。
  • swap 持续增长说明内存不足,优先扩容而不是调参。

发表评论 (已有0条评论)

快来评论,快来抢沙发吧~