Linux 面试中如何分析 CPU 使用率:top、perf 与火焰图

在 Linux 运维和后端开发面试中,“CPU 使用率飙升,如何排查?”是一道高频系统设计题。面试官真正想考察的,不是你会不会敲 top,而是你是否具备从宏观到微观、从现象到根因的完整分析链路。本文将围绕 topperf 与火焰图这三层递进工具,还原一个可落地的排查思路。

一、先看宏观: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,用 iostatiotop 更合适。

接着在 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

读图三原则

  1. 横轴是占比,不是时间。越宽的方块表示该函数在采样中占比越高,与调用先后顺序无关。
  2. 纵轴是调用栈深度。从下往上是调用关系,顶层方块是正在执行的函数。
  3. 找“平顶”。如果某个函数很宽且顶部平坦,说明它自身消耗大量 CPU,而非在等待子调用,这就是优化目标。

例如一个 Java 服务火焰图显示 java.util.HashMap.get 很宽,可能是哈希冲突严重;显示 GC 相关栈很宽,则要查内存分配和 GC 参数。

面试加分点:火焰图不只用于 CPU。用 perf record -e offcpu 可生成 Off-CPU 火焰图,分析线程阻塞;结合 eBPF 还能做内存、锁、I/O 的火焰图。

四、串起完整排查链路

面试时按这个顺序回答,逻辑最清晰:

  1. 确认现象topus/sy/wa/st,判断是 CPU 忙还是等 I/O,是单核还是多核。
  2. 定位进程/线程top -Hpidstat -t 找到具体线程。
  3. 函数级归因perf top 快速看热点,perf record + report 精确定位。
  4. 可视化验证:生成火焰图,确认热点函数及调用路径。
  5. 结合代码优化:算法、锁、缓存、系统调用、GC 等方向对症下药。

补充工具:vmstat 1 看上下文切换(cs)和运行队列(r),mpstat -P ALL 1 看各核负载,pidstat 看进程级明细。这些与 top 互为印证。

结语

回答“如何分析 CPU 使用率”,关键不是罗列工具,而是展现分层排查的思维:先用 top 判断问题性质,再用 perf 缩小到函数,最后用火焰图直观归因。能讲清每一步“为什么用、怎么看、看到什么代表什么”,才是面试官真正想听到的答案。

未经允许不得转载:任鹏个人博客 » Linux 面试中如何分析 CPU 使用率:top、perf 与火焰图

赞 (0) 打赏

评论 0

取消
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏