当前位置:网站首页>Flame Graphs 火焰图安装与使用
Flame Graphs 火焰图安装与使用
2022-07-23 16:05:00 【wespten】
一、火焰图概述
火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点。
perf 命令(performance 的缩写)是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。

二、安装perf和可视化生成器
# yum install perf -y //yum方式安装perf
# git clone https://github.com/brendangregg/FlameGraph.git //选择好火焰图文件存放路径后执行该条命令,从github上获取火焰图的相关文件,获取完成后会有一个FlameGraph的文件夹如下图:

说明:打开文件夹,里面大部分是perf语言写的脚本,生成火焰图后续会用到,如下图,右图为各pl文件用途释义。


到此,安装完成。
三、perf 采集数据
# perf record -F 99 -a -g -- sleep 60 //对CPU所有进程以99Hz采集,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。执行60秒后会弹出如下图提示表示采集完成,在当前目录会生成一个perf.data的文件# perf record -F 99 -p 181 -g -- sleep 60 //对进程ID为181的进程进行采集,采集时间为60秒,执行期间不要退出上述代码中perf record表示记录,-F 99表示每秒99次,-p 13204是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 30则是持续30秒,-a 表示记录所有cpu调用。
更多参数可以执行perf --help查看。
perf.data文件生成后,表示采集完成。最好是在火焰图的目录下进行采集,方便转换成SVG图形。
四、生成火焰图
# perf script -i perf.data &> perf.unfold //生成脚本文件
# ./FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded
# ./FlameGraph/flamegraph.pl perf.folded > perf.svg //执行完成后生成perf.svg图片,可以下载到本地,用浏览器打开 perf.svg,如下图
五、火焰图的含义
火焰图是基于 perf 结果产生的 SVG 图片,用来展示 CPU 的调用栈。

y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
六、互动性
火焰图是 SVG 图片,可以与用户互动。
(1)鼠标悬浮
火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。下面是一个例子。
mysqld'JOIN::exec (272,959 samples, 78.34 percent)(2)点击放大
在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。

左上角会同时显示"Reset Zoom",点击该链接,图片就会恢复原样。
(3)搜索
按下 Ctrl + F 会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示。
七、火焰图示例
下面是一个简化的火焰图例子。
首先,CPU 抽样得到了三个调用栈。
func_c
func_b
func_a
start_thread
func_d
func_a
start_thread
func_d
func_a
start_thread
上面代码中,start_thread是启动线程,调用了func_a。后者又调用了func_b和func_d,而func_b又调用了func_c。
经过合并处理后,得到了下面的结果,即存在两个调用栈,第一个调用栈抽中1次,第二个抽中2次。
start_thread;func_a;func_b;func_c 1
start_thread;func_a;func_d 2
有了这个调用栈统计,火焰图工具就能生成 SVG 图片。

上面图片中,最顶层的函数g()占用 CPU 时间最多。d()的宽度最大,但是它直接耗用 CPU 的部分很少。b()和c()没有直接消耗 CPU。因此,如果要调查性能问题,首先应该调查g(),其次是i()。
另外,从图中可知a()有两个分支b()和h(),这表明a()里面可能有一个条件语句,而b()分支消耗的 CPU 大大高于h()。
八、局限
两种情况下,无法画出火焰图,需要修正系统行为。
(1)调用栈不完整
当调用栈过深时,某些系统只返回前面的一部分(比如前10层)。
(2)函数名缺失
有些函数没有名字,编译器只用内存地址来表示(比如匿名函数)。
九、常见应用的火焰图
Node 应用的火焰图
Node 应用的火焰图就是对 Node 进程进行性能抽样,与其他应用的操作是一样的。
$ perf record -F 99 -p `pgrep -n node` -g -- sleep 30详细的操作可以看这篇文章。
Chrome 浏览器的火焰图
Chrome 浏览器可以生成页面脚本的火焰图,用来进行 CPU 分析。
打开开发者工具,切换到 Performance 面板。然后,点击"录制"按钮,开始记录数据。这时,可以在页面进行各种操作,然后停止"录制"。
这时,开发者工具会显示一个时间轴。它的下方就是火焰图。

浏览器的火焰图与标准火焰图有两点差异:它是倒置的(即调用栈最顶端的函数在最下方);x 轴是时间轴,而不是抽样次数。

火焰图使用详情,请参考:
边栏推荐
- MySQL massive write problem optimization scheme MySQL parameter tuning
- Ali Er Mian: what is CAS?
- 本周一问 | Vivado 综合阶段什么约束生效?
- Analyze the CPU surge of an RFID tag system written by.Net
- MySQL事务,从redo log、bin log、undo log说起...
- Lin Zhiying is still in the intensive care unit and will undergo a second round of surgery: the police said he did not wear a seat belt
- go中的協程原理詳解
- Role definition in USB type-C PD CC logic chip
- Test and development experience
- Sentinel 安装图解
猜你喜欢

数字安全巨头Entrust披露六月遭到勒索软件团伙攻击

Go medium high parallel communication mode: the underlying principle of channel pipeline
![[jzoof] 13 plage de mouvement du robot](/img/c3/56ae78f19578ff8ad8d9b824b7d99f.png)
[jzoof] 13 plage de mouvement du robot

本周一问 | Vivado 综合阶段什么约束生效?

Information theory: introduction and information measures

rhcsa笔记三

悲观锁和乐观锁

MySQL 8.0.23 failed to reinstall for four times in'writing configuration file'

MYSQL基础及性能优化

Simply understand why the first EVM equivalent zkevm polygon is fully betting
随机推荐
多线程编程
配置Gom引擎登錄器出現錯誤提示:沒有發現必備補丁文件!
[215] Gin Framework connection to MySQL Database
CSDN custom T-shirts are waiting for you to get, and the benefits of new programmer are coming!
JS: image URL to Base64 encoding
变分法 (Calculus of Variations)
数字安全巨头Entrust披露六月遭到勒索软件团伙攻击
MySQL事务,从redo log、bin log、undo log说起...
Non inherited polymorphic ideas cooperate with typeID to realize the transmission of different parameters
go中的协程原理详解
Leetcode: Jianzhi offer II 115. reconstruction sequence [graph theory thinking + in degree consideration + topological sorting]
Machine learning (9) - Feature Engineering (3) (supplementary)
Qt多线程实例与connect第五个参数[通俗易懂]
C language -- implementation of address book and screentogif
Seata
(11) STM32 - IO pin multiplexing and mapping
Test and development experience
gom及gee架设黑屏的原因以及个别装备地图不显示怎么办?
能与PowerDesigner媲美的数据库建模工具PDMan[通俗易懂]
参与开源社区还有证书拿?