原帖:

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

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

  以典型的分析CPU时间花费到哪个函数的on-cpu火焰图为例来展开。CPU火焰图中的每一个方框是一个函数,方框的长度,代表了它的执行时间,所以越宽的函数,执行越久。火焰图的楼层每高一层,就是更深一级的函数被调用,最顶层的函数,是叶子函数。

火焰图的生成过程是:

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

2.用脚本来绘制

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

git clone 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 <pthread.h>
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性能剖析相关推荐

  1. linux perf生成火焰图,火焰图:全局视野的Linux性能剖析

    原标题:火焰图:全局视野的Linux性能剖析 文章背景 日常的工作中,会收到一堆CPU使用率过高的告警邮件,遇到某台服务的 CPU被占满了 ,这时候我们就要去查看是什么进程将服务器的CPU资源占用满了 ...

  2. 形容linux技术视野的词,火焰图:全局视野的Linux性能剖析

    原创 宋宝华 Linux阅码场 6月13日 什么是火焰图 火焰图(Flame Graph)是由Linux性能优化大师Brendan Gregg发明的,和所有其他的trace和profiling方法不同 ...

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

    什么是火焰图 火焰图(Flame Graph)是由Linux性能优化大师Brendan Gregg发明的,和所有其他的trace和profiling方法不同的是,Flame Graph以一个全局的视野 ...

  4. 宋宝华: 用off-cpu火焰图进行Linux性能分析

    在<宋宝华:火焰图:全局视野的Linux性能剖析>一文中,我们主要看了on-cpu火焰图,理解了系统的CPU的走向的分析.但是,很多时候,单纯地看on-cpu的情况(什么代码在耗费CPU) ...

  5. linux 没有windows.h头文件_宋宝华: Linux内核编程广泛使用的前向声明(Forward Declaration)...

    本文系转载,著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作者:宋宝华 来源: 微信公众号linux阅码场(id: linuxdev) 前向声明 编程定律 先强调一点:在一切可 ...

  6. 宋宝华:评Linux 5.13内核

    目录 Misc cgroup Landlock安全模块 系统调用的堆栈随机化 printk无锁ringbuffer的进一步优化 BPF可调用内核函数 公共的IO PAGE Fault支持 Linux ...

  7. 宋宝华:LEP(Linux易用剖析器) 是什么,为什么以及怎么办(2)

    LEP(LINUX EASY PROFILING) 是Linuxer之LEP项目组(Barry Song,Mac Xu,陈松等以及陈莉君教授/西邮Linux 3+1实验室)正在致力于打造的一个开源项目 ...

  8. 宋宝华: 关于DMA ZONE和dma alloc coherent若干误解的彻底澄清

    原创 宋宝华 Linux阅码场 2018-01-22 作者简介 宋宝华,他有10几年的Linux开发经验.他长期在大型企业担任一线工程师和系统架构师,编写大量的Linux代码,并负责在gerrit上r ...

  9. 宋宝华_2010年11-12月Linux驱动和内核讲座PPT下载

        12月29日,宋宝华老师在线讲座(按键和LCD驱动) cloudquan 2010-12-20 2/146 heyan0208 3 天前 00:37     宋宝华_2010年12月11日_& ...

  10. 宋宝华:论一切都是文件之匿名inode

    01 唯有文件得人心 当一个女生让你替她抓100只萤火虫,她一定不是为了折磨你,而是因为她爱上了你.当你们之间经历了无数的恩恩怨怨和彼此伤害,她再次让你替她抓100只萤火虫,那一定是因为她还爱着你. ...

最新文章

  1. 5m 云服务器2核4g_华为云服务器2核4G 5M 248一年
  2. 独家 | 一文盘点AutoML 库(附PPT等链接)
  3. 小测试来检验一下你原型链理解的怎么样。
  4. c++ setstate() 和 clear() 函数
  5. 怎么看电脑系统是win几_一文看懂arm架构和x86架构有什么区别
  6. 田沄(1980-),男,博士,中国工程院—清华大学联合博士后科研工作站博士后,北京师范大学副教授....
  7. pascal闪电入门系列目录
  8. 毕业答辩PPT免费下载
  9. linux shell 脚本 pdf,Shell脚本学习指南 中文PDF版
  10. 三菱Q系列PLC大型程序Q01U伺服12轴 实际使用中程序
  11. 秀米图文排版转html,秀米微信编辑器图文排版H5秀图文教程
  12. 详细介绍如何使用MATLAB中的机器人工具箱建立机器人模型(DH法建模)(机械臂)
  13. storyBoard中TopLayout和SuperView
  14. 从百亿美元到零估值,硅谷的Theranos或许不止一个
  15. php实现股票日线数据转换为周线月线,通达信引用月线数据,如何在日线里调用周线和月线函数?...
  16. 清华应届程序员同时被5家公司录取,晒出工资,网友:羡慕
  17. 浅谈 Java 中的枚举
  18. IDEA ctrl+alt+L 格式化快捷键不起作用
  19. “蔚来杯“2022牛客暑期多校训练营1
  20. [日推荐]『装逼助手』一秒变土豪

热门文章

  1. JAVA中的继承和覆盖
  2. CodeForces Round #295 Div.2
  3. C#两种创建快捷方式的方法
  4. 服务器上装的hadoop系统,在Ubuntu Server 18.04.1中安装Hadoop系统环境
  5. oracle ora00020,ORA-00020: maximum number of processes (1000) 错误处理
  6. php foreach 多出一个_PHP如何实现统计数据合并
  7. [译] REST API 已死,GraphQL 长存
  8. .Net码农就业求职储备(新手进阶)
  9. networking常用命令
  10. Javascript从零开始学习第一天