CPU 性能分析与调优
CPU 分析工具
# 整体负载
uptime
# load average: 1.52, 1.38, 0.92(1/5/15 分钟)
# 规则:load average < CPU 核心数 = 正常
# 每个 CPU 的使用率
mpstat -P ALL 1 5
# 进程级 CPU 使用
top -b -n 1 -o %CPU | head -20
# 或 pidstat
pidstat -u 1 5
# 线程级分析
top -H -p <pid>
# 系统调用追踪
strace -c -p <pid>
# 火焰图(终极武器)
perf record -ag -p <pid> -- sleep 30
perf script | stackcollapse-perf.pl | flamegraph.pl > cpu.svg
CPU 瓶颈定位流程
调优手段
| 手段 | 命令 | 说明 |
|---|---|---|
| CPU 亲和性 | taskset -c 0,1 <cmd> | 绑定进程到指定 CPU 核心 |
| 进程优先级 | nice -n -5 <cmd> | 提高进程调度优先级 |
| cgroup 限制 | K8s resources / systemd | 限制容器/服务的 CPU 配额 |
常见面试问题
Q1: 服务器 load average 很高但 CPU 使用率不高,什么原因?
答案:
load average 统计的是可运行 + 不可中断睡眠的进程数。CPU 使用率不高但 load 高,通常是大量进程处于 D 状态(不可中断睡眠 = 等待 IO):
- 用
vmstat 1看b列(blocked 进程数) - 用
iostat -x 1看%util和await(磁盘是否饱和) - 用
ps aux | awk '$8~/D/'找 D 状态进程
根因通常是磁盘 IO 瓶颈或 NFS 挂载卡住。