顾名思义,整个图形看起来就像一团跳动的火焰, 这也正是其名字的由来。燃烧在火苗尖部的就是 CPU 正在执行的操作,不过需要说明的是颜色是随机的,本身并没有特殊的含义,纵向表示调用栈的深度,横向表示消耗的时间.,因为调用栈在横向会按照字母排序,并且同样的调用栈会做合并,所以一个格子的宽度越大越说明其可能是瓶颈.。综上所述,,主要就是看那些比较宽大的火苗, 特别留意那些类似平顶山的火苗。
下载火焰图可视化生成器FlameGraph
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 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) ]
例1:perf record -a -F 99 -g -p `pidof dmserver` -- sleep 30 (-a所有核)
例2:perf record -C 0-15 -F 99 -g -- sleep 30(-C对应的核数)
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
火焰图是基于stack信息生成的SVG图片, 用来展示CPU的调用栈。
y轴表示调用栈: 每一层都是一个函数。 调用栈越深, 火焰就越高, 顶部就是正在执行的函数, 下方都是它的父函数。
x轴表示抽样数: 如果一个函数在x轴占据的宽度越宽, 就表示它被抽到的次数多, 即执行的时间长。 注意x轴不代表时间, 而是所有的调用栈合并后, 按字母顺序排列的。
火焰图就是看顶层的哪个函数占据的宽度最大。 只要有 “平顶”(plateaus), 就表示该函数可能存在性能问题。
颜色没有特殊含义, 因为火焰图表示的是CPU的繁忙程度, 所以一般选择暖色调。
火焰图是SVG图片,可以与用户互动。
鼠标悬浮: 火焰的每一层都会标注函数名, 鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比
点击放大: 在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。
Reset Zoom: 左上角,点击该链接,图片就会恢复原样。
搜索: 按下 Ctrl+F会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示。
两种情况下, 无法画出火焰图, 需要修正系统行为。
调用栈不完整: 当调用栈过深时,某些系统只返回前面的一部分(比如前10层)。
函数名缺失: 有些函数没有名字,编译器只用内存地址来表示(比如匿名函数)。
文章
阅读量
获赞