0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

火焰图:全局视野的Linux性能剖析

Linux阅码场 来源:Linuxer 2020-06-28 09:44 次阅读

什么是火焰图

火焰图(Flame Graph)是由Linux性能优化大师Brendan Gregg发明的,和所有其他的trace和profiling方法不同的是,Flame Graph以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能的调用栈。其他的呈现方法,一般只能列出单一的调用栈或者非层次化的时间分布。

我最快乐的童年时代,每逢冬天,尤其是春节的时候,和一家人围坐在火堆旁边烤火。这已经成为最美好的回忆,其实人生追求的快乐非常简单。火焰图的火焰首先来自于根,然后以火苗的形式往上面窜。可以把从靠近地面的根到顶上的每个火苗,想想成一个调用栈。由于火苗有很多根,这正好也和现实生活中程序的执行逻辑相似。

以典型的分析CPU时间花费到哪个函数的on-cpu火焰图为例来展开。

CPU火焰图中的每一个方框是一个函数,方框的长度,代表了它的执行时间,所以越宽的函数,执行越久。火焰图的楼层每高一层,就是更深一级的函数被调用,最顶层的函数,是叶子函数。

火焰图的生成过程是:

先trace系统,获取系统的profiling数据

用脚本来绘制

系统的profiling数据获取,可以选择最流行的perf record,而后把采集的数据进行加工处理,绘制为火焰图。其中第二步的绘制火焰图的脚本程序,通过如下方式获取:

gitclone https://github.com/brendangregg/FlameGraph

火焰图案例

废话不多说,直接从最简单的例子开始说起。talk is cheap, show you the cde,代码如下:

c()

{

for(int i=0;i<1000;i++);

}

b()

{

for(int i=0;i<1000;i++);

c();

}

a()

{

for(int i=0;i<1000;i++);

b();

}

则这三个函数,在火焰图中呈现的样子为:

a()的2/3的时间花在b()上面,而b()的1/3的时间花在c()上面。很多个这样的a->b->c的火苗堆在一起,就构成了火焰图。

进一步理解火焰图的最好方法仍然是通过一个实际的案例,下面的程序创建2个线程,两个线程的handler都是thread_fun(),之后thread_fun()调用fun_a()、fun_b()、fun_c(),而fun_a()又会调用fun_d():

/*

* One example to demo flamegraph

*

* Copyright (c) Barry Song

*

* Licensed under GPLv2

*/

#include

func_d()

{

int i;

for(i=0;i<50000;i++);

}

func_a()

{

int i;

for(i=0;i<100000;i++);

func_d();

}

func_b()

{

int i;

for(i=0;i<200000;i++);

}

func_c()

{

int i;

for(i=0;i<300000;i++);

}

void* thread_fun(void* param)

{

while(1) {

int i;

for(i=0;i<100000;i++);

func_a();

func_b();

func_c();

}

}

int main(void)

{

pthread_t tid1,tid2;

int ret;

ret=pthread_create(&tid1,NULL,thread_fun,NULL);

if(ret==-1){

...

}

ret=pthread_create(&tid2,NULL,thread_fun,NULL);

...

if(pthread_join(tid1,NULL)!=0){

...

}

if(pthread_join(tid2,NULL)!=0){

...

}

return 0;

}

先看看不用火焰图的缺点在哪里。

如果不用火焰图,我们也可以用类似perf top这样的工具分析出来CPU时间主要花费在哪里了:

$gcc exam.c -pthread

$./a.out&

$sudo perf top

perf top的显示结果如下:

perf top提示出来了fun_a()、fun_b()、fun_c(), fun_d(),thread_func()这些函数内部的代码是CPU消耗大户,但是它缺乏一个全局的视野,我们无法看出全局的调用栈,也弄不清楚这些函数之间的关系。火焰图则不然,我们用下面的命令可以生成火焰图(以root权限运行):

perf record -F 99 -a -g -- sleep 60

perf script | ./stackcollapse-perf.pl > out.perf-folded

./flamegraph.pl out.perf-folded > perf-kernel.svg

上述程序捕获系统的行为60秒钟,最后调用flamegraph.pl生成一个火焰图perf-kernel.svg,用看图片的工具就可以打开这个svg。

上述火焰图显示出了a.out中,thread_func()、func_a()、func_b()、fun_c()和func_d()的时间分布。

从上述火焰图可以看出,虽然thread_func()被两个线程调用,但是由于thread_func()之前的调用栈是一样的,所以2个线程的thread_func()调用是合并为同一个方框的。

更深阅读

除了on-cpu的火焰图以外,off-cpu的火焰图,对于分析系统堵在IO、SWAP、取得锁方面的帮助很大,有利于分析系统在运行的时候究竟在等待什么,系统资源之间的彼此伊伴。

比如,下面的火焰图显示,nginx的吞吐能力上不来的很多程度原因在于sem_wait()等待信号量。

上图摘自Yichun Zhang (agentzh)的《Introduction to offCPU Time Flame Graphs》。

关于火焰图的更多细节和更多种火焰图各自的功能,可以访问:

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11032

    浏览量

    207297
  • 函数
    +关注

    关注

    3

    文章

    4154

    浏览量

    61576

原文标题:火焰图:全局视野的Linux性能剖析

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    HarmonyOS实战开发-全局状态保留能力弹窗

    介绍 全局状态保留能力弹窗一种很常见的能力,能够保持状态,且支持全局控制显隐状态以及自定义布局。使用效果参考评论组件 效果预览 使用说明 首先程序入口页对全局弹窗初始化
    发表于 05-07 14:53

    AI火焰识别,火焰检测摄像头助力降低防火安全监控成本、及时报警

    针对这一问题,AI火焰识别技术应运而生。火焰检测摄像头作为AI火焰识别的重要组成部分,不仅可以降低防火安全监控成本,还能及时报警,为保障人们的生命和财产安全发挥重
    的头像 发表于 04-12 14:09 359次阅读
    AI<b class='flag-5'>火焰</b>识别,<b class='flag-5'>火焰</b>检测摄像头助力降低防火安全监控成本、及时报警

    鸿蒙实战开发-全局UI方法的功能

    使用全局UI的方法定义日期滑动选择器弹窗并弹出。
    的头像 发表于 02-02 17:13 317次阅读
    鸿蒙实战开发-<b class='flag-5'>全局</b>UI方法的功能

    Jailhouse原理及openEuler下的性能剖析

    Jailhouse 诞生于西门子,自 2013 年 11 月遵循 GPLv2,至今发展 9 年,最新版本为 v0.12。Jailhouse 本身不对 Linux 做任何修改,通过硬件隔离的方式实现
    的头像 发表于 12-12 10:40 3455次阅读
    Jailhouse原理及openEuler下的<b class='flag-5'>性能</b><b class='flag-5'>剖析</b>

    深入剖析高速SiC MOSFET的开关行为

    深入剖析高速SiC MOSFET的开关行为
    的头像 发表于 12-04 15:26 562次阅读
    深入<b class='flag-5'>剖析</b>高速SiC MOSFET的开关行为

    数字隔离器的剖析

    电子发烧友网站提供《数字隔离器的剖析.pdf》资料免费下载
    发表于 11-24 10:41 1次下载
    数字隔离器的<b class='flag-5'>剖析</b>

    Linux内核slab性能优化的核心思想

    今天分享一篇内存性能优化的文章,文章用了大量精美的深入浅出地分析了Linux内核slab性能优化的核心思想,slab是Linux内核小对象
    的头像 发表于 11-13 11:45 395次阅读
    <b class='flag-5'>Linux</b>内核slab<b class='flag-5'>性能</b>优化的核心思想

    Linux perf 简要介绍

    性能剩余工具,它可以在Linux系统上检测和调试各种性能问题。Linux内核集成了perf工具,可用于探测内核性能事件、硬件
    的头像 发表于 11-09 17:06 509次阅读

    如何使用perf性能分析工具

    放在一起,是内核级的工具。perf是在Linux上做剖析分析的首选工具。 perf命令介绍 perf 工具提供了一组丰富的命令来收集和分析性能和跟踪数据。perf支持的命令如下: usage: perf
    的头像 发表于 11-08 15:36 640次阅读
    如何使用perf<b class='flag-5'>性能</b>分析工具

    python 使用Dis模块进行代码性能剖析

    就像一个黑匣子,很多时候我们不知道python内部是怎样执行代码的,而且DEBUG的时候也没有机器指令可以查看,非常不利于代码优化。但是没关系,现在我们有Dis模块来对代码进行性能剖析。 为什么下面
    的头像 发表于 11-03 15:39 359次阅读
    python 使用Dis模块进行代码<b class='flag-5'>性能</b><b class='flag-5'>剖析</b>

    影响linux服务器性能的因素

    一般互联网的项目都是部署在linux服务器上的,如果linux服务器出了问题,那么咱们平时学习的高并发,稳定性之类的是没有任何意义的,所以对linux性能的把握就显得非常重要。 当然很
    的头像 发表于 10-09 15:29 276次阅读

    使用Arm Streamline分析树莓派的性能

    Pi”是学习与精炼公司进行Linux剖析的有用工具。由于“草莓皮”板是为教育设计的,它们不需要复杂的程序来设置特征特征特征分析。 1.1 在你开始使用该指南之前,你需要使用简化性能,我们将在“开始精简
    发表于 08-29 06:30

    紫外光电探测器T0CON-ABC1用于天然气燃烧火焰探测

    物质燃烧时,会产生可见光或不可见光辐射,同时产生烟雾和释放热量。火焰探测器,也称为光敏火灾探测器,用于对火灾的光特性作出反应。即一种能扩散火焰燃烧的光强度和火焰闪烁频率的火灾探测器。随着天然气
    的头像 发表于 08-03 10:15 598次阅读
    紫外光电探测器T0CON-ABC1用于天然气燃烧<b class='flag-5'>火焰</b>探测

    自动火焰炮塔开源分享

    电子发烧友网站提供《自动火焰炮塔开源分享.zip》资料免费下载
    发表于 07-11 10:43 0次下载
    自动<b class='flag-5'>火焰</b>炮塔开源分享

    Linux性能调优的思路

    Linux操作系统是一个开源产品,也是一个开源软件的实践和应用平台
    的头像 发表于 07-11 09:13 319次阅读