使用 perf record -e cpu-clock -g 采集带调用栈的 CPU 样本,配合 FlameGraph 生成火焰图,需确保内核符号与用户程序调试信息齐全,perf script 解析后经 stackcollapse-perf.pl 和 flamegraph.pl 输出 SVG。

直接用 perf record 采集带调用栈的 CPU 样本,再配合 FlameGraph 脚本转成火焰图,整个流程清晰、可靠,且无需额外编译或安装第三方分析器。
确保 perf 和内核调试符号可用
perf 依赖内核符号和用户空间二进制的调试信息才能正确展开调用栈。缺一不可:
- 检查 perf 是否已安装并可运行:
perf --version;若报错,Ubuntu/Debian 执行sudo apt install linux-tools-$(uname -r) linux-tools-common,CentOS/RHEL 用sudo yum install perf - 确认内核符号已加载:
sudo cat /proc/kallsyms | head -5应有输出;如为空,需安装linux-image-$(uname -r)-dbgsym(Ubuntu)或kernel-debuginfo(RHEL) - 对用户程序(如 Java、Go、C++ 服务),建议启用调试符号编译(如 GCC 加
-g),否则火焰图中会显示为[unknown]或偏移地址
执行带栈采样的 perf record
关键在于加 -g(记录调用图)和合理设置采样频率。不推荐默认 cycles 事件,cpu-clock 更稳定反映 CPU 时间占用:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 对某进程(PID=1234)采样 60 秒:
sudo perf record -e cpu-clock -g -p 1234 -- sleep 60 - 对全系统所有 CPU 采样(适合定位全局热点):
sudo perf record -e cpu-clock -g -a -- sleep 60 - 高频采样(如排查短时尖峰)可提高频率,例如
-F 999,但注意磁盘 I/O 和 overhead 增加;一般-F 99已足够 - 命令结束后自动生成
perf.data,这是唯一需要保留的原始数据文件
导出调用栈并生成火焰图
这一步不依赖目标服务器环境,推荐在本地机器完成,更安全、更可控:
- 从服务器拷贝
perf.data到本地(如scp user@host:/path/perf.data ./) - 使用
perf script解析为文本调用栈:perf script > perf.unfold - 下载 Brendan Gregg 的 FlameGraph 工具:
git clone https://github.com/brendangregg/FlameGraph - 折叠栈帧:
./FlameGraph/stackcollapse-perf.pl perf.unfold > perf.folded - 生成 SVG 火焰图:
./FlameGraph/flamegraph.pl perf.folded > flamegraph.svg
看懂火焰图的关键提示
火焰图是横向展开的调用栈堆叠图,宽度代表 CPU 时间占比,越宽的函数越“热”:
- 顶部是叶子函数(正在执行的函数),底部是入口函数(如 main、syscall);点击任意框可聚焦查看该函数及其子调用
- 颜色无特定含义,仅作视觉区分;同一颜色族通常表示同一大类(如红色系常为用户代码,蓝色系为内核)
- 重点关注“宽而高”的矩形——说明它既自身耗时长,又调用了大量下层函数;若某函数下方全是平直窄条,可能是锁竞争或频繁系统调用
- 若看到大量
[unknown]或__vdso_*,说明缺少符号或 vDSO 未解析,需补全调试信息或加--call-graph dwarf(部分内核支持)

















