在 Ubuntu 20.04 上遇到进程 CPU 占用率飙升至 100% 时最推荐的做法是先通过 top 确认进程 ID再使用 perf record 采集采样数据最后通过 perf report 查看热点函数调用栈。先说结论perf 是 Linux 内核自带的性能分析工具适合在生产环境低开销地定位 CPU 热点但需要确保内核版本与工具版本匹配。先定位确认具体是哪个进程和线程占用 CPU避免误杀正常高负载业务。先做安装与当前内核版本一致的 linux-tools 包使用 perf record 采集调用栈。再验证根据热点函数优化代码或配置后观察 CPU 负载是否回落。命令速用版以下命令假设你已经知道目标进程的 PID例如 12345。# 1. 安装 perf 工具需匹配当前内核版本 sudo apt update sudo apt install linux-tools-generic linux-tools-$(uname -r) # 2. 确认进程 ID 和占用最高的线程 top -H -p 12345 # 3. 采集 30 秒的性能数据-g 表示记录调用栈 sudo perf record -p 12345 -g -- sleep 30 # 4. 查看分析报告 sudo perf report为什么会这样当某个进程 CPU 占用达到 100%通常指单核满载时说明该进程正在密集执行计算任务或陷入死循环。操作系统调度器虽然能切换任务但无法告诉你是哪行代码在空转。perf 基于硬件事件采样如 CPU 时钟周期每隔固定时间记录一次当前执行的指令指针累积足够样本后就能统计出哪些函数占用了最多的 CPU 时间片。相比 strace 等追踪系统调用的工具perf 对用户态代码的内部逻辑可见性更好且开销通常在 5% 以内适合线上临时排查。分步处理第一步确认目标进程使用 top 命令找到 CPU 占比最高的进程 PID。如果是因为某个线程导致按 top 界面中的 H 键开启线程视图找到占用最高的线程 IDTID。第二步安装匹配的工具Ubuntu 20.04 默认可能未安装 perf 或版本不匹配。运行uname -r查看内核版本确保安装的linux-tools包版本与之对应。如果版本不一致perf record 可能会报错提示 kernel map 失败。第三步采集数据执行sudo perf record -p PID -g -- sleep 30。这里-p指定进程-g记录调用图sleep 30控制采集时长。生产环境建议控制在 30-60 秒避免生成过大的数据文件。第四步分析报告运行sudo perf report进入交互式界面。按百分比排序找到占用率最高的函数符号。如果是业务代码符号直接定位源码如果是库函数或内核函数结合日志分析是否涉及锁竞争或系统调用。怎么验证是否生效优化代码或配置后重启服务并观察监控面板。使用top -p PID再次查看 CPU 占比确认是否从 100% 降至正常水平。同时检查应用日志确认没有因优化引入新的错误或延迟。公开资料中没有看到可靠的量化数据表明 perf 本身能降低 CPU它只是定位工具效果取决于后续的代码修复。常见坑1.权限不足perf 需要 root 权限或配置/proc/sys/kernel/perf_event_paranoid参数否则无法采集内核态数据。2.符号缺失如果报告显示大量十六进制地址而非函数名说明缺少调试符号。对于自有代码编译时请加上-g参数。3.生产影响虽然 perf 开销小但在极高负载下仍可能加剧竞争。建议在业务低峰期操作或先在测试环境复现。4.内核 mismatchUbuntu 升级内核后旧的 linux-tools 可能失效需重新安装对应版本工具包。