火焰图
火焰图简介
常见的火焰图类型有On-CPU, Off-CPU, Memory, Hot/Cold, Differential等等。
关于火焰图详细的介绍可以参考 Blazing Performance with Flame Graphs, 简而言之:整个图形看起来就像一团跳动的火焰, 这也正是其名字的由来。燃烧在火苗尖部的就是 CPU 正在执行的操作, 不过需要说明的是颜色是随机的, 本身并没有特殊的含义, 纵向表示调用栈的深度, 横向表示消耗的时间. 因为调用栈在横向会按照字母排序, 并且同样的调用栈会做合并, 所以一个格子的宽度越大越说明其可能是瓶颈. 综上所述, 主要就是看那些比较宽大的火苗, 特别留意那些类似平顶山的火苗。
可视化生成器
下载火焰图可视化生成器FlameGraph
# git clone https://github.com/brendangregg/FlameGraph.git
Cloning into 'FlameGraph'...
remote: Enumerating objects: 961, done.
remote: Total 961 (delta 0), reused 0 (delta 0), pack-reused 961
Receiving objects: 100% (961/961), 1.83 MiB | 118.00 KiB/s, done.
Resolving deltas: 100% (547/547), done.
# ls
FlameGraph
生成和创建火焰图需要如下几个步骤
流程 | 描述 | 脚本 |
---|---|---|
捕获堆栈 | 使用 perf/systemtap/dtrace 等工具抓取程序的运行堆栈 | perf/systemtap/dtrace等 |
折叠堆栈 | trace 工具抓取的系统和程序运行每一时刻的堆栈信息, 需要对他们进行分析组合, 将重复的堆栈累计在一起, 从而体现出负载和关键路径 | FlameGraph的stackcollapse工具 |
生成火焰图 | 分析 stackcollapse 输出的堆栈信息生成火焰图 | flamegraph.pl |
不同的 trace 工具抓取到的信息不同, 使用不同的stackcollapse 工具.
stackcollapse | 描述 |
---|---|
stackcollapse.pl | for DTrace stacks |
stackcollapse-perf.pl | for Linux perf_events “perf script” output |
stackcollapse-pmc.pl | for FreeBSD pmcstat -G stacks |
stackcollapse-stap.pl | for SystemTap stacks |
stackcollapse-instruments.pl | for XCode Instruments |
stackcollapse-vtune.pl | for Intel VTune profiles |
stackcollapse-ljp.awk | for Lightweight Java Profiler |
stackcollapse-jstack.pl | for Java jstack(1) output |
stackcollapse-gdb.pl | for gdb(1) stacks |
stackcollapse-go.pl | for Golang pprof stacks |
stackcollapse-vsprof.pl | for Microsoft Visual Studio profiles |
perf生成火焰图
perf采集数据
perf record -F 99 -p 2347 -g -- sleep 30
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.627 MB perf.data (~27375 samples) ]
perf record表示采集系统事件, 没有使用 -e 指定采集事件, 则默认采集 cycles(即 CPU clock 周期), -F 99 表示每秒 99 次, -p 2347 是进程号, 即对哪个进程进行分析, -g 表示记录调用栈, sleep 30 则是持续 30 秒.
-F 指定采样频率为 99Hz(每秒99次), 如果 99次 都返回同一个函数名, 那就说明 CPU 这一秒钟都在执行同一个函数, 可能存在性能问题.
perf record 命令可以统计每个调用栈出现的百分比, 然后从高到低排列.
perf report -n –stdio
生成火焰图
# 解析perf收集的信息
perf script -i perf.data &> perf.unfold
# 生成折叠后的调用栈
./stackcollapse-perf.pl perf.unfold &> perf.folded
# 生成火焰图
./flamegraph.pl perf.folded > perf.svg
我们可以使用管道将上面的流程简化为一条命令
perf script -i perf.data | ./stackcollapse-perf.pl | ./flamegraph.pl > perf.svg
chrome打开perf.svg
解析火焰图
含义
火焰图是基于stack信息生成的SVG图片, 用来展示CPU的调用栈。
y****轴表示调用栈, 每一层都是一个函数。 调用栈越深, 火焰就越高, 顶部就是正在执行的函数, 下方都是它的父函数。
x****轴表示抽样数, 如果一个函数在x****轴占据的宽度越宽, 就表示它被抽到的次数多, 即执行的时间长。 注意x****轴不代表时间, 而是所有的调用栈合并后, 按字母顺序排列的。
火焰图就是看顶层的哪个函数占据的宽度最大。 只要有 “平顶”(plateaus), 就表示该函数可能存在性能问题。
颜色没有特殊含义, 因为火焰图表示的是CPU的繁忙程度, 所以一般选择暖色调。
互动
火焰图是SVG图片,可以与用户互动。
鼠标悬浮 : 火焰的每一层都会标注函数名, 鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比
点击放大 : 在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。
Reset Zoom : 左上角,点击该链接,图片就会恢复原样。
搜索 : 按下 Ctrl+F会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示。
局限
两种情况下, 无法画出火焰图, 需要修正系统行为。
调用栈不完整: 当调用栈过深时,某些系统只返回前面的一部分(比如前10层)。
示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示。
局限
两种情况下, 无法画出火焰图, 需要修正系统行为。
调用栈不完整: 当调用栈过深时,某些系统只返回前面的一部分(比如前10层)。
函数名缺失: 有些函数没有名字,编译器只用内存地址来表示(比如匿名函数)。