注册
perf生成火焰图
专栏/技术分享/ 文章详情 /

perf生成火焰图

DM_12128 2023/12/14 1507 0 0
摘要

perf生成火焰图

火焰图简介

顾名思义,整个图形看起来就像一团跳动的火焰, 这也正是其名字的由来。燃烧在火苗尖部的就是 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生成火焰图

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) ]

例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

image.png

生成火焰图

# 解析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

image.png

解析火焰图

含义

火焰图是基于stack信息生成的SVG图片, 用来展示CPU的调用栈。

y轴表示调用栈: 每一层都是一个函数。 调用栈越深, 火焰就越高, 顶部就是正在执行的函数, 下方都是它的父函数。

x轴表示抽样数: 如果一个函数在x轴占据的宽度越宽, 就表示它被抽到的次数多, 即执行的时间长。 注意x轴不代表时间, 而是所有的调用栈合并后, 按字母顺序排列的。

火焰图就是看顶层的哪个函数占据的宽度最大。 只要有 “平顶”(plateaus), 就表示该函数可能存在性能问题。

颜色没有特殊含义, 因为火焰图表示的是CPU的繁忙程度, 所以一般选择暖色调。

互动

火焰图是SVG图片,可以与用户互动。

鼠标悬浮: 火焰的每一层都会标注函数名, 鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比

点击放大: 在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。

Reset Zoom: 左上角,点击该链接,图片就会恢复原样。

搜索: 按下 Ctrl+F会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示。

局限

两种情况下, 无法画出火焰图, 需要修正系统行为。

调用栈不完整: 当调用栈过深时,某些系统只返回前面的一部分(比如前10层)。

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

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服