前言

“服务器好卡"是运维最常收到的一句话。定位性能瓶颈的标准流程:先看全局(top),再分维度下钻(CPU/内存/IO/网络)。这篇讲前三者的经典工具。

一、top:全局快照

top        # 按 P 按 CPU 排序, M 按内存, 1 展开各核心, c 完整命令

第一行关键指标:

load average: 4.20, 3.10, 2.50

1/5/15 分钟平均负载。经验值:load 持续 > CPU 核数 = 过载。4 核机器 load 4.2,说明已经排队。

CPU 行(%Cpu(s)):

指标 含义 异常解读
us 用户态 CPU 高 = 应用在烧 CPU(正常业务 or 死循环)
sy 内核态 CPU 高 = 系统调用/上下文切换频繁(IO、锁竞争)
id 空闲 低 = CPU 不够用
wa IO 等待 高 = 磁盘是瓶颈(CPU 在等 IO)
st 被宿主机偷走 云主机独有:宿主机超卖,别的 VM 抢资源

内存行(KiB Mem):

total 4G, free 200M, buff/cache 2G, avail 3.2G
  • 看内存够不够,看 avail 而不是 free——buff/cache 是文件缓存,应用需要时秒让出
  • swap used 持续增长 = 物理内存真不够了

进程列表关注:%CPU、%MEM、RES(实际物理内存)、S(状态,大量 D 态查 IO)。

二、vmstat:CPU 与 IO 的动态趋势

vmstat 1 5        # 每 1 秒采样, 共 5 次(一定要看趋势, 单次无意义)
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 200000 300000 2000000    0    0    10    20  500  800 15  5 80  0  0
 8  2      0 150000 300000 1900000    0    0  8000  200  9000 12000 60 20 15 5  0

procs:

  • r:等待 CPU 的进程数(run queue)——r 持续大于核数 = CPU 瓶颈
  • b:阻塞在不可中断 IO 的进程数——b 大 = IO 瓶颈

swap:si/so(换入/换出)——非零 = 内存不足,开始拿磁盘当内存用,性能断崖。

io:bi/bo(块设备读/写,单位 块/s ≈ KB/s)——数值大且 wa 高,就是磁盘忙。

system:in(中断/s)、cs(上下文切换/s)——几万级 cs + sy 高,常见于频繁系统调用或线程风暴。

黄金十字:r 高 → CPU 瓶颈;b 高 + wa 高 → IO 瓶颈;si/so 非零 → 内存瓶颈。

三、iostat:磁盘维度

dnf install -y sysstat
iostat -x 1 3        # 扩展视图, 每 1 秒一次
Device  r/s   w/s   rkB/s  wkB/s  rrqm/s  wrqm/s  %util  await
vda     50.0  200.0  800   3200    0.0     10.0   95.20   12.50
指标 含义 解读
r/s w/s 每秒读/写次数(IOPS) 与盘的规格上限对比
rkB/s wkB/s 吞吐量 顺序大文件看这个
await 每次 IO 平均耗时(ms) SSD >5ms、机械 >15ms 就算高
%util 设备繁忙度 接近 100% = 盘打满(NVMe 并发高时 util 100% 不一定饱和,结合 await 看)
# 找出哪个进程在狂写盘(iotop 交互查看)
dnf install -y iotop
iotop -oP          # 只显示有 IO 的进程

# 或用 pidstat 按进程看 IO/CPU/内存(低侵入, 适合采集)
pidstat -d 1 3     # 磁盘
pidstat -u 1 3     # CPU
pidstat -r 1 3     # 内存

四、内存:free 的正确读法

free -h
              total   used   free   shared  buff/cache  available
Mem:          3.8Gi   1.2Gi  200Mi   10Mi       2.4Gi       2.3Gi
Swap:         2.0Gi   0Bi    2.0Gi
  • available 才是"还能给应用多少”
  • buff/cache 高是好事(Linux 拿空闲内存做缓存加速)
  • 判断内存压力:sar -B 看 majflt/s(缺页),或 vmstat 的 si/so

五、综合实战:一次"卡顿"排查

# 1. 全局看一眼
top
# → load 8, %wa 40, r=2, b=6   指向 IO

# 2. vmstat 确认趋势
vmstat 1 5
# → b 列持续 >0, bo 写入 30MB/s, si/so=0(内存没事)

# 3. iostat 锁定磁盘
iostat -x 1 3
# → vda %util 98, await 25ms   磁盘打满

# 4. 找凶手进程
iotop -oP
# → mysqld 占 80% 写入

# 5. 下钻应用层
# → 慢查询? 一次性 update 亿级大表? binlog 刷盘策略?

五分钟定位方向:top 定维度 → vmstat 定方向 → iostat/iotop 定设备与进程 → 应用层定根因。

六、工具地图(USE 方法)

资源 × 三视角(Utilization 使用率 / Saturation 饱和度 / Errors 错误):

资源 首选工具
CPU top vmstat pidstat -u mpstat -P ALL
内存 free -h vmstat(si/so) sar -B
磁盘 iostat -x iotop pidstat -d
网络 ss iftop nethogs(后续网络篇展开)
全能 sar(历史数据回放)dstat

小结

  • load > 核数 = 过载;wa 高查磁盘;st 高是宿主机超卖
  • vmstat 看趋势:r 高 CPU 瓶颈、b 高 IO 瓶颈、si/so 非零内存告急
  • iostat:await 看延迟、%util 看饱和
  • free 看 available,不是 free
  • 排障路径:top → vmstat → 定向工具 → 应用层

本文是「Linux 运维」系列第 6 篇。