perf生成火焰图

火焰图

火焰图简介

常见的火焰图类型有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.plfor DTrace stacks
stackcollapse-perf.plfor Linux perf_events “perf script” output
stackcollapse-pmc.plfor FreeBSD pmcstat -G stacks
stackcollapse-stap.plfor SystemTap stacks
stackcollapse-instruments.plfor XCode Instruments
stackcollapse-vtune.plfor Intel VTune profiles
stackcollapse-ljp.awkfor Lightweight Java Profiler
stackcollapse-jstack.plfor Java jstack(1) output
stackcollapse-gdb.plfor gdb(1) stacks
stackcollapse-go.plfor Golang pprof stacks
stackcollapse-vsprof.plfor 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层)。

函数名缺失: 有些函数没有名字,编译器只用内存地址来表示(比如匿名函数)。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值