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

    文章

    11628

    浏览量

    217951
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66831

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入剖析NCP13994:高性能半桥谐振转换器控制器

    在电子工程师的设计世界里,一款优秀的控制器就像是一位得力助手,能够为电源转换设计带来诸多便利和高性能表现。今天,我们就来深入剖析安森美(onsemi)的NCP13994,一款专为半桥谐振转换器打造的高性能电流模式控制器。
    的头像 发表于 12-05 11:27 219次阅读
    深入<b class='flag-5'>剖析</b>NCP13994:高<b class='flag-5'>性能</b>半桥谐振转换器控制器

    深入剖析 onsemi NL7SZ19:1 到 2 解码器/多路分配器的卓越性能与应用

    深入剖析 onsemi NL7SZ19:1 到 2 解码器/多路分配器的卓越性能与应用
    的头像 发表于 12-01 13:54 158次阅读
    深入<b class='flag-5'>剖析</b> onsemi NL7SZ19:1 到 2 解码器/多路分配器的卓越<b class='flag-5'>性能</b>与应用

    深入剖析ADS5546:高性能14位ADC的卓越之选

    的首选。今天,我们就来深入剖析这款ADC,了解它的技术细节和应用要点。 文件下载: ads5546.pdf 核心特性,铸就卓越性能 高采样率与高精度 ADS5546具备高达190 MSPS的最大采样率,能够快速准确地采集信号。同时,它拥有14位的分辨率,且无丢失码,确保了
    的头像 发表于 11-29 10:41 773次阅读
    深入<b class='flag-5'>剖析</b>ADS5546:高<b class='flag-5'>性能</b>14位ADC的卓越之选

    探索微观世界的“神奇火焰”:射频等离子体技术浅谈

    你是否想象过,有一种特殊的“火焰”,它并不灼热,却能瞬间让材料表面焕然一新;它不产生烟雾,却能精密地雕刻纳米级的芯片电路?这种神奇的“火焰”,就是今天我们要介绍的主角——射频等离子体(RF Plasma)。
    的头像 发表于 10-24 18:03 1082次阅读

    Linux系统性能优化技巧

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

    Linux网络性能调优方案

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

    Linux系统性能调优方案

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

    Linux系统目录结构全面剖析

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

    Linux系统性能指南

    Linux服务器运行了很多应用,在高负载下,服务器可能会出现性能瓶颈,例如CPU利用率过高、内存不足、磁盘I/O瓶颈等,从而导致系统卡顿,服务无法正常运行等问题。所以针对以上问题,可以通过调整内核参数和系统的相关组件,优化应用程序来提高服务器的
    的头像 发表于 06-23 14:12 1484次阅读
    <b class='flag-5'>Linux</b>系统<b class='flag-5'>性能</b>指南

    Linux主要的性能有哪些?

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

    基于RV1126开发板的火焰检测算法开发

    火焰检测是一种基于深度学习的对火焰进行检测定位的目标检测。基于大规模火焰数据识别训练,配合摄像头,实时识别监控区内明火情况立刻发出警报,提醒监控室查看,及时止损。
    的头像 发表于 04-14 14:53 584次阅读
    基于RV1126开发板的<b class='flag-5'>火焰</b>检测算法开发

    电机故障诊断常见误区的剖析

    纯分享帖,需要者可点击附件获取完整资料~~~*附件:电机故障诊断常见误区的剖析.pdf (免责声明:本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内容!)
    发表于 04-07 17:35

    BNC接头技术原理与工程应用剖析:从结构到性能优化

    在现代电子通信和射频领域,BNC接头作为一种广泛应用的连接器件,发挥着至关重要的作用。它以其可靠的连接性能、优异的电气特性和广泛的兼容性,成为众多电子设备和系统中不可或缺的一部分。本文将深入剖析
    的头像 发表于 12-31 16:07 2247次阅读
    BNC接头技术原理与工程应用<b class='flag-5'>剖析</b>:从结构到<b class='flag-5'>性能</b>优化

    思特威推出高性能智能交通应用全局快门图像传感器产品

    近日,技术先进的CMOS图像传感器供应商思特威(SmartSens,股票代码688213),全新推出高性能智能交通(ITS)应用全局快门图像传感器产品——SC935HGS(9MP)及SC635HGS(6MP)。
    的头像 发表于 12-26 10:48 1307次阅读

    多光谱火焰检测摄像头

    随着工业化进程的加快,火灾安全问题日益受到重视。传统的火焰检测技术主要依赖于温度传感器和烟雾探测器,但这些方法在某些情况下存在响应慢、误报率高等缺陷。为了解决这些问题,多光谱火焰检测摄像头应运而生
    的头像 发表于 12-11 10:50 1093次阅读
    多光谱<b class='flag-5'>火焰</b>检测摄像头