直接用 perf record 采样 + perf report 查看可快速定位 CPU 热点函数:需带调用栈(-g)、确保符号可用(编译加-g、安装 debug 包),报告中顶部函数即最高耗时函数,展开调用栈可追溯调用路径。

直接用 perf record 采样 + perf report 查看,就能快速定位进程运行时消耗 CPU 最多的函数。关键在于采样要带调用栈、符号要可用、结果要能对应到源码逻辑。
快速定位热点函数(推荐流程)
对正在运行的进程做实时采样:
- 先查 PID:
pidof your_program或ps aux | grep your_program - 开始采样(带调用栈,每秒约 99 次):
sudo perf record -F 99 -g -p,持续几秒后按 Ctrl+C 停止 - 生成可读报告:
perf report -n --no-children(-n显示采样次数,--no-children避免合并子函数,更利于定位)
报告中排在最上面的函数,就是当前 CPU 时间占比最高的热点函数;展开其调用栈(按方向键或回车),能看到它被谁调用、路径是否合理。
确保函数名不显示为十六进制地址
如果 perf report 里全是 [unknown] 或 0x7f... 这类地址,说明缺少调试符号:
- 你的程序编译时必须加
-g(如g++ -g main.cpp -o main) - 系统级符号(如 libc、内核函数)需安装对应 debug 包:Ubuntu 装
libc6-dbg和linux-image-$(uname -r)-dbgsym;CentOS/RHEL 装debuginfo-install glibc kernel - 验证符号是否加载成功:运行
perf report后,输入/main搜索主函数名,能命中即正常
进一步确认和可视化(可选但实用)
单靠文本报告有时难以看清调用层级关系,这时可以:
- 用火焰图直观展示:
sudo perf script > out.perf,再配合 FlameGraph 工具生成 SVG:./stackcollapse-perf.pl out.perf | ./flamegraph.pl > flame.svg - 对比多个采样窗口:比如分别在业务高峰期和空闲期采样,用
perf diff对比两次perf.data,突出变化最大的函数 - 聚焦某一个可疑函数反汇编:
perf annotate,查看哪一行汇编指令耗时最多(需有调试符号和源码路径)
替代方案:实时观察(适合快速筛查)
不想等采样结束?可用 perf top 实时滚动查看:
-
sudo perf top -p:只看该进程的热点 -
sudo perf top -g:开启调用图模式,按Enter可展开函数栈 - 注意:默认只显示用户态,如需含内核态,加
-K;刷新慢可加-d 1设为每秒刷新一次











