Post

历史经验Skill化系列(一) -- 火焰图

火焰图 Skill 化,从数据采集到生成到解读,配套 CLI 工具链

历史经验Skill化系列(一) -- 火焰图

1. 引言

最近开启新的系列,将历史博客中的经验和能力AI化,转换为更便捷的Skill。如火焰图、eBPF、gperf-tool、wireshark抓包、google sanitize等等。

火焰图(Flame Graph)由 Brendan Gregg 发明,是性能分析领域最直观的可视化工具。

本系列是历史经验 Skill 化的第一篇,火焰图知识体系见之前博客:《并发与异步编程——性能分析工具:gperftools和火焰图》


2. 火焰图类型

类型横轴采样事件适用场景
On-CPUCPU 时间cpu-clock / cyclesCPU 热点
Off-CPU阻塞时间sched:sched_stat_sleep锁竞争 / I/O 等待
Memory内存操作频率brk / page-faults内存泄漏 / 异常分配
Hot/ColdCPU + 阻塞组合混合负载全景
Differential差值对比两个 profile版本 / 配置变更对比

3. 工具链

完整流程:

1
2
3
4
perf record -F 99 -g -p <PID> -- sleep 30    # 采集 call-stack 采样
perf script                                  # 导出原始数据
stackcollapse-perf.pl                        # 按调用链折叠
flamegraph.pl                                # 生成 SVG

环境安装:

1
2
3
4
5
# Debian/Ubuntu
sudo apt-get install linux-tools-common linux-tools-$(uname -r)

# 克隆 FlameGraph
git clone https://github.com/brendangregg/FlameGraph.git

3.1 On-CPU 火焰图

1
2
3
4
5
6
7
8
9
10
# 对已运行进程采样
sudo perf record -F 99 -g -p <PID> -- sleep 30

# 或直接启动程序
sudo perf record -F 999 -g -- ./your_program

# 导出并生成 SVG
perf script > out.perf
cd FlameGraph
./stackcollapse-perf.pl out.perf | ./flamegraph.pl > out.svg

3.2 Off-CPU 火焰图

1
2
sudo perf record -e 'sched:sched_stat_sleep' -e 'sched:sched_switch' -a -g -- sleep 30
perf script | ./stackcollapse-perf.pl | ./flamegraph.pl > offcpu.svg

3.3 Memory 火焰图

1
2
sudo perf record -e kmem:* -a -g -- sleep 30
perf script | ./stackcollapse-perf.pl | ./flamegraph.pl --colors=mem > mem.svg

3.4 Differential 火焰图

1
./flamegraph.pl --diff=baseline.folded new.folded > diff.svg

4. 常见问题

函数名是十六进制地址:Java / Go 程序需要额外符号表,参考 perf-map-agentfgprof

采样时长:建议 30 秒以上,覆盖完整业务周期。偶发性热点需要更长采样或多次采集。

内核态不可见:加 -a 参数可包含所有 CPU 的内核态栈。


5. Skill 化思路

火焰图能力的 AI 调用接口设计:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
name: flamegraph
description: "生成并分析 On-CPU / Off-CPU / Memory 火焰图,精确定位性能瓶颈"
capabilities:
  - 生成 CPU 火焰图(perf + FlameGraph)
  - 生成 Off-CPU 火焰图
  - 生成 Memory 火焰图
  - 差分火焰图对比分析
triggers:
  - "CPU 占用高"
  - "性能瓶颈排查"
  - "火焰图分析"
input:
  target: "进程 PID 或可执行文件路径"
  duration: "采样时长(秒),默认 30"
  type: "on_cpu | off_cpu | memory"
output:
  artifact: "SVG 文件路径"
  summary: "Top 5 热点函数及占比"

6. 参考链接

This post is licensed under CC BY 4.0 by the author.