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

    文章

    10986

    浏览量

    206723
  • 函数
    +关注

    关注

    3

    文章

    3864

    浏览量

    61307

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

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

收藏 人收藏

    评论

    相关推荐

    Jailhouse原理及openEuler下的性能剖析

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

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

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

    Linux perf 简要介绍

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

    影响linux服务器性能的因素

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

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

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

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

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

    自动火焰炮塔开源分享

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

    RTOS任务间通信为什么不用全局变量?

    RTOS任务间通信为什么不用全局变量?原因在于使用全局变量存在诸多弊端。
    发表于 07-05 09:06 421次阅读

    Linux perf性能、实际应用与案例

    Linux perf(性能分析工具)是一个功能强大且灵活的性能剩余工具,它可以在Linux系统上检测和调试各种性能问题。
    发表于 07-03 10:22 380次阅读

    火焰灯开源构建

    电子发烧友网站提供《火焰灯开源构建.zip》资料免费下载
    发表于 06-30 15:00 0次下载
    <b class='flag-5'>火焰</b>灯开源构建

    使用机器学习来控制火焰喷射器

    电子发烧友网站提供《使用机器学习来控制火焰喷射器.zip》资料免费下载
    发表于 06-16 14:59 0次下载
    使用机器学习来控制<b class='flag-5'>火焰</b>喷射器

    什么是全局中断?

    什么是全局中断?全局中断使能位控制着“所有”中断,它如果关闭的话会屏蔽其它中断,有人经常关闭它,防止其它中断带来干扰,比如在使用GPIO模拟某个时序时,在GPIO传输数据过程中,如果被某个中断干扰
    的头像 发表于 06-14 18:25 1828次阅读

    T420火焰监控器手册

    T420 火焰监控器是基于燃烧控制系统的微处理设备。火焰 监控包括火焰棒和 UV 监测器。所有系统的数据输入和输 出由回馈网络监测。 集成控制器由显示屏和按键组成,其可以知道燃烧器运行
    发表于 06-02 17:25 0次下载

    深度剖析Linux中进程控制(上)

    Linux中,fork函数是非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。 返回值: 在子进程中返回0,父进程中返回子进程的PID
    的头像 发表于 05-12 10:49 326次阅读
    深度<b class='flag-5'>剖析</b><b class='flag-5'>Linux</b>中进程控制(上)

    剖析Linux shell 函数实现

    作为一个嵌入式 Linux 工程师,肯定需要编写 shell 脚本进行一些自动化工作。刚好,我最近就有类似需求——一键交叉编译 DDS。本着“编写漂亮代码的原则”,我用到了 **shell 函数** 。
    的头像 发表于 05-12 10:27 335次阅读
    <b class='flag-5'>剖析</b><b class='flag-5'>Linux</b> shell 函数实现