<p>直接用perf采集+FlameGraph渲染可快速定位CPU消耗最重的代码段,无需改代码或重启服务:先用top/ps找高CPU进程PID,安装perf(Ubuntu用sudo apt install linux-tools-common linux-tools-generic,CentOS用sudo yum install perf)和FlameGraph(git clone https://github.com/brendangregg/FlameGraph.git),再执行sudo perf record -F 99 -p PID -g -- sleep 30采样,最后通过perf script、stackcollapse-perf.pl和flamegraph.pl三步生成SVG火焰图,宽度最大者即为热点函数。</p>

直接用 perf 采集 + FlameGraph 渲染,就能快速定位 CPU 消耗最重的代码段。整个过程不改代码、不重启服务,几分钟搞定。
确认目标进程和安装必要工具
先找到高 CPU 的进程 PID(比如用 top 或 ps aux --sort=-%cpu | head -n 10),再确保系统已装好:
-
perf:Linux 内核自带,但需安装对应包
Ubuntu/Debian:运行sudo apt install linux-tools-common linux-tools-genericCentOS/RHEL:运行sudo yum install perf -
FlameGraph 工具集:从官方仓库获取
git clone https://github.com/brendangregg/FlameGraph.git
把目录加进PATH,或后续直接用相对路径调用脚本
采样运行中的进程
对目标进程做带调用栈的 CPU 采样(关键:必须加 -g):
- 采样指定 PID(如 12345)30 秒:
sudo perf record -F 99 -p 12345 -g -- sleep 30 - 若要分析启动即开始的程序:
sudo perf record -F 99 -g ./myapp arg1 arg2 -
-F 99是推荐频率(避开 100Hz 与系统定时器共振),-g启用调用栈记录,缺一不可
生成并查看火焰图
三步导出 SVG 可视化图:
- 把原始数据转为可读文本:
perf script > out.perf - 折叠重复调用栈(聚合相同路径):
./FlameGraph/stackcollapse-perf.pl out.perf > out.folded - 生成火焰图:
./FlameGraph/flamegraph.pl out.folded > flame.svg
用浏览器打开flame.svg即可交互查看
看懂火焰图找热点
火焰图不是看“哪一层最高”,而是看“哪一块最宽”:
- x 轴宽度 = 被采样次数,越宽说明该函数(及其子调用)占用 CPU 时间越多
-
y 轴是调用栈深度,底部是入口函数(如
main),顶部是当前正在执行的函数 - 重点关注顶部出现的“平顶”宽块——它代表一个长期占据 CPU 的热点函数
- 鼠标悬停可看到函数名、采样数、占比;点击某层可局部放大;Ctrl+F 支持搜索(如搜
malloc或read)


















