在 Linux 运维和后端开发面试中,“CPU 使用率飙升,如何排查?”是一道高频系统设计题。面试官真正想考察的,不是你会不会敲 top,而是你是否具备从宏观到微观、从现象到根因的完整分析链路。本文将围绕 top、perf 与火焰图这三层递进工具,还原一个可落地的排查思路。
一、先看宏观:top 到底在看什么
很多人回答“用 top 看 CPU”,但面试官追问“看哪一列”时就卡住了。top 输出的 CPU 行(%Cpu(s))包含几个关键指标:
- us(user):用户态 CPU 时间。高通常意味着应用代码在消耗 CPU。
- sy(system):内核态 CPU 时间。高往往指向频繁系统调用、上下文切换或内核瓶颈。
- wa(iowait):等待 I/O 的时间。注意它不算 CPU 真正忙碌,但高 wa 常被误判为 CPU 问题。
- si / hi:软中断 / 硬中断。网络密集型服务(如 Nginx、Redis)常表现为 si 偏高。
- st(steal):被虚拟化层偷走的时间。云主机上 st 高,说明宿主机争抢严重,不是你的问题。
面试要点:先区分“CPU 真的忙”还是“在等”。如果 us + sy 不高而 wa 高,问题在磁盘或网络 I/O,用 iostat、iotop 更合适。
接着在 top 中按 1 展开每个逻辑核,观察是单核打满还是多核均衡。单核打满常见于单线程程序或锁竞争,多核打满则更可能是整体负载过高。
还可以按 P(按 CPU 排序)或 M(按内存排序),快速定位是哪个进程、哪个线程在消耗 CPU。top -H -p <pid> 能展开线程级视图,这对 Java、Go 这类多线程程序尤其关键。
二、再定微观:perf 定位到函数级
top 只能告诉你“哪个进程”,perf 能告诉你“哪个函数”。这是面试中拉开差距的一步。
常用命令:
# 采样 30 秒,记录 CPU 周期事件
perf record -F 99 -p <pid> -g -- sleep 30
# 查看报告,按开销排序
perf report
参数含义值得说清:
-F 99:每秒采样 99 次。用 99 而非 100 是为了避免与系统定时器同步产生采样偏差。-g:记录调用栈(call graph),这是生成火焰图的前提。-p:指定进程;也可用-a采集全系统。
perf report 会列出各函数的采样占比。如果看到某个函数占 40%,基本就能锁定热点。进一步可用 perf top 实时观察,或 perf stat 看 IPC(每周期指令数)、缓存命中率等硬件指标。
面试常见追问:“perf 采样会不会影响生产环境?” 答:采样频率低(如 99Hz)时开销很小,通常可接受;但 perf record -a 全系统采集在高压机器上仍需谨慎,建议限定时长和事件类型。
三、可视化归因:火焰图怎么读
perf report 的数字不够直观,火焰图(Flame Graph)把调用栈按占比横向铺开,是排查 CPU 热点的利器。
生成流程:
perf record -F 99 -p <pid> -g -- sleep 30
perf script > out.perf
git clone https://github.com/brendangregg/FlameGraph
./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
./FlameGraph/flamegraph.pl out.folded > cpu.svg
读图三原则:
- 横轴是占比,不是时间。越宽的方块表示该函数在采样中占比越高,与调用先后顺序无关。
- 纵轴是调用栈深度。从下往上是调用关系,顶层方块是正在执行的函数。
- 找“平顶”。如果某个函数很宽且顶部平坦,说明它自身消耗大量 CPU,而非在等待子调用,这就是优化目标。
例如一个 Java 服务火焰图显示 java.util.HashMap.get 很宽,可能是哈希冲突严重;显示 GC 相关栈很宽,则要查内存分配和 GC 参数。
面试加分点:火焰图不只用于 CPU。用 perf record -e offcpu 可生成 Off-CPU 火焰图,分析线程阻塞;结合 eBPF 还能做内存、锁、I/O 的火焰图。
四、串起完整排查链路
面试时按这个顺序回答,逻辑最清晰:
- 确认现象:
top看us/sy/wa/st,判断是 CPU 忙还是等 I/O,是单核还是多核。 - 定位进程/线程:
top -H或pidstat -t找到具体线程。 - 函数级归因:
perf top快速看热点,perf record + report精确定位。 - 可视化验证:生成火焰图,确认热点函数及调用路径。
- 结合代码优化:算法、锁、缓存、系统调用、GC 等方向对症下药。
补充工具:vmstat 1 看上下文切换(cs)和运行队列(r),mpstat -P ALL 1 看各核负载,pidstat 看进程级明细。这些与 top 互为印证。
结语
回答“如何分析 CPU 使用率”,关键不是罗列工具,而是展现分层排查的思维:先用 top 判断问题性质,再用 perf 缩小到函数,最后用火焰图直观归因。能讲清每一步“为什么用、怎么看、看到什么代表什么”,才是面试官真正想听到的答案。
未经允许不得转载:任鹏个人博客 » Linux 面试中如何分析 CPU 使用率:top、perf 与火焰图

