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
    +关注

    关注

    88

    文章

    11810

    浏览量

    219513
  • 函数
    +关注

    关注

    3

    文章

    4421

    浏览量

    67822

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    12 位高速 ADC AD9432:性能剖析与应用指南

    12 位高速 ADC AD9432:性能剖析与应用指南 在电子设计领域,高速、高精度的模数转换器(ADC)是实现信号处理和数据采集的关键组件。AD9432 作为一款 12 位、具有 80 MSPS
    的头像 发表于 04-02 17:05 397次阅读

    AD7327:高性能12位ADC的深度剖析与应用指南

    AD7327:高性能12位ADC的深度剖析与应用指南 引言 在电子设计领域,模数转换器(ADC)扮演着至关重要的角色,它是模拟世界与数字世界之间的桥梁。AD7327作为一款8通道、12位加符号的逐次
    的头像 发表于 04-02 10:10 193次阅读

    AD9625:高性能12位ADC的深度剖析与应用指南

    AD9625:高性能12位ADC的深度剖析与应用指南 在电子设计领域,模数转换器(ADC)的性能直接影响着整个系统的精度和稳定性。AD9625作为一款12位的高性能ADC,以其卓越的特
    的头像 发表于 03-30 15:00 189次阅读

    AD9081:高性能混合信号前端的技术剖析

    AD9081:高性能混合信号前端的技术剖析 在当今的电子领域,对于高性能、高集成度的混合信号前端(MxFE)的需求日益增长。AD9081作为一款备受关注的产品,以其卓越的性能和丰富的功
    的头像 发表于 03-25 15:05 139次阅读

    昉·星光开发板火焰传感器探测火光

    本次课程为昉·星光开发板IoT开发系列课程的第九讲,将带领同学们在昉·星光开发板上,使用火焰传感器探测火焰火光。 本次课程,在昉·星光开发板V1和V2上,操作步骤相同。 一、学习目标 学习昉
    发表于 03-16 06:48

    内核配置项引发网络性能下降的深度剖析

    在嵌入式系统开发中,内核配置对系统性能起着关键作用。近期在对基于 Rockchip 平台的 Linux 内核配置调试时,发现三个内核跟踪器配置项(CONFIG_IRQSOFF_TRACER
    的头像 发表于 02-01 16:48 1807次阅读
    内核配置项引发网络<b class='flag-5'>性能</b>下降的深度<b class='flag-5'>剖析</b>

    瑞芯微(EASY EAI)RV1126B 火焰检测

    1.火焰检测简介火焰检测是一种基于深度学习的对火焰进行检测定位的目标检测。基于大规模火焰数据识别训练,配合摄像头,实时识别监控区内明火情况立刻发出警报,提醒监控室查看,及时止损。本
    的头像 发表于 01-13 11:52 7161次阅读
    瑞芯微(EASY EAI)RV1126B <b class='flag-5'>火焰</b>检测

    博通薄膜热释电火焰传感器:技术特性与应用潜力

    博通薄膜热释电火焰传感器:技术特性与应用潜力 在电子工程领域,火焰检测技术至关重要,它关乎着众多场景下的安全保障。博通的薄膜热释电红外火焰探测器凭借其卓越的性能,成为了
    的头像 发表于 12-30 16:35 336次阅读

    ezPyro™ TO I²C 热释电红外火焰传感器:高性能火焰检测的理想之选

    ezPyro™ TO I²C 热释电红外火焰传感器:高性能火焰检测的理想之选 在电子工程师的日常设计工作中,火焰检测传感器是一个关键的组件,它在许多安全和监控系统中发挥着至关重要的作用
    的头像 发表于 12-30 16:10 757次阅读

    AMD UltraScale架构:高性能FPGA与SoC的技术剖析

    AMD UltraScale架构:高性能FPGA与SoC的技术剖析 在当今的电子设计领域,高性能FPGA和MPSoC/RFSoC的需求日益增长。AMD的UltraScale架构凭借其创新的技术和卓越
    的头像 发表于 12-15 14:35 722次阅读

    Linux系统性能优化技巧

    经过10年一线运维经验,我发现大多数工程师只掌握了Linux优化的冰山一角。今天分享的这些秘技,能让你的系统性能提升200%以上!
    的头像 发表于 08-27 14:34 1133次阅读

    Linux网络性能调优方案

    在当今高并发、大流量的互联网环境下,网络性能往往成为系统的瓶颈。作为一名资深运维工程师,我在生产环境中遇到过无数次因为TCP/IP参数配置不当导致的性能问题。今天分享一套完整的Linux网络
    的头像 发表于 08-06 18:01 1488次阅读

    Linux系统性能调优方案

    关键要点预览:本文将深入解析Linux系统性能瓶颈的根本原因,提供可直接落地的调优方案,让你的系统性能提升30-50%!
    的头像 发表于 08-06 17:49 1053次阅读

    Linux系统目录结构全面剖析

    Linux文件系统采用层次化的目录结构,这种设计遵循了Unix哲学中的"一切皆文件"原则。理解Linux目录层次架构对于系统管理员、运维工程师和开发人员来说至关重要,它不仅影响系统的组织方式,还直接关系到系统的可维护性、安全性和性能
    的头像 发表于 07-21 17:33 970次阅读

    Linux主要的性能有哪些?

    都有确定的用途。它支持32位和64位硬件,能运行主要的unix工具软件、应用程序和网络协议。linux继承了unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。 Linux主要特性 1 永久免费
    的头像 发表于 04-30 18:09 761次阅读
    <b class='flag-5'>Linux</b>主要的<b class='flag-5'>性能</b>有哪些?