前言
“服务器好卡"是运维最常收到的一句话。定位性能瓶颈的标准流程:先看全局(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 篇。