下载 Flame Graph 项目
Brendan D. Gregg 的 Flame Graph 工程实现了一套生成火焰图的脚本.
git clone https://github.com/brendangregg/FlameGraph.git
使用 perf 采样
perf record 采集系统事件
# perf record
# 没有使用 -e 指定采集事件, 默认采集 cycles(即 CPU clock 周期)
# -F 99 表示每秒 99 次
# -p 1234 是进程号
# -g 表示记录调用栈
# sleep 30 则是持续 30 秒,注意不是 --sleep
perf record -F 99 -p 1234 -g -- sleep 30
# 记录输出(**对生成火焰图,非必要**)
perf report -n --stdio
火焰图
-
输入:
perf.data
是使用perf record
记录的结果。
-
输出:
perf.svg
是输出的火焰图。
-
y 轴表示调用栈
- 每一层都是一个函数。
- 调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
-
x 轴表示抽样数
- 如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。
- 注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列。
-
火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
-
颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
# 生成折叠后的调用栈
perf script -i perf.data > perf.unfold
# 生成火焰图
/opt/FlameGraph/stackcollapse-perf.pl perf.unfold > perf.folded
# 生成 svg 图
/opt/FlameGraph/flamegraph.pl perf.folded > perf.svg
差分火焰图
-
输入:
perf.data.before
是修改前
的perf.data
。perf.data.after
是修改后
的perf.data
。
-
输出:
diff_frame.before.base.svg
是基于perf.data.before
(修改前)的差分火焰图。diff_frame.after.base.svg
是基于perf.data.after
(修改后)的差分火焰图。
-
红色表示:
- 函数在
修改后
比修改前
调用次数增大
。
- 函数在
-
蓝色表示:
- 函数在
修改后
比修改前
调用次数减少
。
- 函数在
# 生成折叠后的调用栈
perf script -i perf.data.before \