当前位置: 首页 > 编程日记 > 正文

火焰图(Flame Graphs)的安装和基本用法

火焰图(Flame Graphs)

一、概述:

火焰图(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_bfunc_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 轴是时间轴,而不是抽样次数。

参考资料:

https://github.com/brendangregg/FlameGraph

http://www.brendangregg.com/flamegraphs.html

https://www.jianshu.com/p/492218c163d9

http://www.ruanyifeng.com/blog/2017/09/flame-graph.html

转载于:https://www.cnblogs.com/wx170119/p/11459995.html

相关文章:

用TCP/IP进行网际互联一

地址解析协议ARP主机知道某个目的主机的IP就可以知道该目的主机的物理地址。改进ARP每个ARP广播分组中都包含有发送方自身的IP和物理地址的绑定,接收方在处理ARP分组时,先在自己的缓存中更新发送方IP到物理地址的绑定信息。ARP是一个隐藏底层网络物理编址…

【learning】矩阵树定理

问题描述 给你一个图(有向无向都ok),求这个图的生成树个数    一些概念 度数矩阵:\(a[i][i]degree[i]\),其他等于\(0\) 入度矩阵:\(a[i][i]in\_degree[i]\),其他等于\(0\) 出度矩阵&#xff1…

各大知名企业的Research展示

大公司為了要拉開彼此的差距, 除了專注於目前的產品外, 都會為了未來做準備, 而這些研究通常都會做一個 Research 的專區來呈現成果, 如下述列表: Google ResearchYahoo! ResearchThe Facebook ProjectMicrosoft Research - Turning Ideas into Reality微軟亞洲研究院IBM Resea…

解决Eclipse添加新server时无法选择Tomcat7的问题

关闭Eclipse删除WorkSpace目录下/.metadata/.plugins/org.eclipse.core.runtime/.settings目录中的org.eclipse.wst.server.core.prefs和org.eclipse.jst.server.tomcat.core.prefs重启Eclipse转载于:https://www.cnblogs.com/tnsay/p/11466746.html

java 判断object类型_Java学习-方法与多态的学习心得

一 1.什么是方法重写方法的重写或方法的覆盖(overriding)子类根据需求对从父类继承的方法进行重新编写重写时,可以用super.方法的方式来保留父类的方法构造方法不能被重写 2.方法重写规则(1)方法名相同(2)参数列表相同(3)返回值类型相同或者是…

实习日志(2)2011-12-30

这篇文章并没有给出如何使用ResultSet的具体例子,只是从ResultSet的功能性上进行了详细的讲述。希望这篇文章对大家理解ResultSet能够有所帮助。下面就是这篇文章的具体内容。 结果集(ResultSet)是数据中查询结果返回的一种对象,可以说结果集是一个…

Javascript使用三大家族和事件来DIY动画效果相关笔记(一)

1.offset家族◆offsetWidth和offsetHeight表示盒子真实的宽度高度,这个真实的宽度包括 四周的边框、四周的padding、及定义的宽度高度或内容撑开的高度和宽度,可以用来检测盒子实际的大小,属性也是只读不可写的,返回的是不带单位的…

React 学习

一、搭建webpack4.x环境 1.创建工程文件夹(ReactDemo) 2.在工程文件夹下,快速初始化项目 npm init -y // 创建一个package.json文件 3.在工程文件夹下,创建源码文件夹(src)和编译打包文件夹&#xf…

python创建mysql数据库_python 怎么创建create mysql的数据库

展开全部 我采用的是MySQLdb操作的MYSQL数据库。先来一个简单的例2113子吧: import MySQLdb try: connMySQLdb.connect(hostlocalhost,userroot,passwdroot,dbtest,port3306) curconn.cursor() cur.execute(select * from user) cur.close() conn.close() except My…

杂谈---改变个人习惯

在提升编码技术的过程,自己也在生活中学到了很多。发现了自己的很多缺陷:不够勇敢、不够冒险、骄傲的无厘头,还有自己对情绪的掌控远没有自己想象的那么有火候,这段时间也得好好谢谢她,要不然我压根意识不到问题有多严…

ldconcig详解

ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链接库的管理命令--ldconfigldconfig 命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib…

第3章—高级装配—条件化的Bean

条件化的Bean 通过活动的profile,我们可以获得不同的Bean。Spring 4提供了一个更通用的基于条件的Bean的创建方式,即使用Conditional注解。 Conditional根据满足某个特定的条件创建一个特定的Bean。比如,当某一个jar包在一个类路径下时&#…

c#委托与事件(二)

这篇博客是在上篇的基础开始讲述了一下委托的一些用法,首先我举一个例子说明了一下前面章节的知识点,接下来我说了将方法作为参数传递的一个案例,接下来实现了一个委托实现冒泡排序的方法,如果你们和我一样正在学习,希…

互联网公司java面试题(一)

1、JDK和JRE区别? JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基础的类库。通过JDK开发人员将源码文件(java文件)编译成字节码文件(class文 件)。JRE是Java运行环境,不含开发环境,即没有编译器和调…

python属于哪种类型的语言_Python是什么类型的编程语言,有什么特性

由于近几年人工智能的不断发展,Python也跟着火了,因为Python是深度学习技术的主流应用编程语言。同时它的应用场景很多,被称为“胶水语言”。下面给大家科普一下Python这门神奇的编程语言,以及语言特性,帮大家更清晰的…

Linux下C语言线程池的实现(1)

http://hi.baidu.com/lingiloveyou/blog/item/21e57cf3322a6b40342accc7.html 什么时候需要创建线程池呢?简单的说,如果一个应用需要频繁的创建和销毁线程,而任务执行的时间又非常短,这样线程创建和销毁的带来的开销就不容忽视&am…

一篇简单易懂的原理文章,让你把JVM玩弄与手掌之中

jvm原理 Java虚拟机是整个java平台的基石,是java技术实现硬件无关和操作系统无关的关键环节,是java语言生成极小体积的编译代码的运行平台,是保护用户机器免受恶意代码侵袭的保护屏障。JVM是虚拟机,也是一种规范,他遵循…

python代码画皮卡丘_Python气象绘图实例我们一起画台风(代码+数据)

前段时间袭击中国的超强台风“利奇马”,以及这两天袭击美国的五级飓风“多利安”,让我们感受到了大自然的力量。所以,今天分享一个简单的Python实例,也算是延续前面python气象绘图系列(点击链接1;点击链接2)&#xff0…

Windows Socket编程笔记之最简单的小Demo

Windows Socket编程的大致过程:服务器端:----过程-------------对应的API------- 0.初始化 | WSAStartup() 1.创建Socket | socket() 2.绑定Socket | bind() 3.监听 | listen() 4.接受连接 | accept() 5.接收/发送数据 | recv()/send()…

React项目实战

一、环境搭建 1.安装react-cli脚手架(保证提前安装好Node最新版本) npm config set registry http://registry.npm.taobao.org/ npm config set sass-binary-site http://npm.taobao.org/mirrors/node-sass npm isntall -g create-react-app 2.查看react…

win7完美兼容DynamipsGUI(小凡模拟器)攻略

博主又是好久没写了,今天闲来无事与大家一起分享一下如何在windows7平台下完美兼容DynamipsGUI(小凡模拟器)的一个小窍门~ 对于学习cisco的朋友来说,DynamipsGUI(小凡模拟器)一定不陌生,在这就不…

使用PHPExcel 对表格进行,读取和写入的操作。。。。

下面的代码是使用PHPExcel 对多个表格数据进行读取, 然后整合的写入新的表格的方法!!!代码有点粗糙 , 多多保函!!! 这里有些地方注意下,如果你的表格数据过大&#xff0c…

c# .netframwork 4.0 调用 2.0时报错 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。...

“System.IO.FileLoadException”类型的未经处理的异常在 XXX.dll 中发生 其他信息: 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集。 这时需要改dbconfig配置 在configuration 节点…

python多线程并发_Python进阶记录之基础篇(二十四)

回顾在Python进阶记录之基础篇(二十三)中,我们介绍了进程的基本概念以及Python中多进程的基本使用方法。其中,需要重点掌握多进程的创建方法、进程池和进程间的通信。今天我们讲一下Python中的多线程。线程的基本概念线程是操作系统能够进行运算调度的最…

awk处理文件内容格式

今天运营出了点问题,需要对特定时间段充值数做一个处理,文件格式有特定要求,要符合erlang的格式{roleID,gold}.mysql导出所有数据结果如下【取部分数据看】:kuwo 4 50004106230500 100kuwo 4 50004106230900 …

QQ远程协助没动静?QQ版本有讲究

一位网友觉得电脑反应速度慢了,想通过QQ远程协助让我处理一下。不料接受请求后,等了许久都显示网友电脑的桌面,而网友那边QQ也没有任何提示。 反复尝试了几次都是如此。 询问网友得知他用的QQ为2011版,而我使用的QQ是2008版。难…

java课堂测试样卷-----简易学籍管理系统

程序设计思路:分别建立两个类:ScoreInformation类(用来定义学生的基本信息以及设置set和get函数)ScoreManagement类(用来定义实现学生考试成绩录入,考试成绩修改,绩点计算等功能的函数)和一个主…

python3安装setuptools步骤_setuptools、pip的安装

第2篇分享 安装setuptools 下载setuptools源码setuptools-25.2.0.tar.gz选择需要的版本 这是一个压缩文件,将其解压到桌面,并进入该文件夹 按住shift键后,在文件夹空白处点击鼠标右键,选择:在此处打开命令窗重点&#…

如何将简单CMS后台管理系统示例转换为Java、Php等不同后台语言的版本

等下要去坐车,今天就不继续唠叨开发过程了,来谈一下普遍比较关心的后台语言问题。学习Ext JS,笔者一直强调学习的中心思路是“界面与数据是分离”。只要好好掌握这个思路,深入了解Ext JS的运作过程,就不会为后台语言使…

[面试]future模式

Future模式 什么是future模式? 传统单线程环境下,调用函数是同步的,必须等待程序返回结果后,才可进行其他处理。 Futrue模式下,调用方式改为异步。 Futrue模式的核心在于:充分利用主函数中的等待时间,利用…