1、 白话火焰图

让我们回想一下我们一般是如何调试程序的,通常是在没有数据的情况下依靠主观臆断来瞎蒙,而不是考虑问题到底是什么引起的!毫无疑问,调优程序性能问题的时候,同样需要对症下药。好消息是 Linux 内核调优大师发明了火焰图,可以一针见血的指出程序的性能瓶颈,可以快速、准确地识别出最频繁的代码路径,但是很少人在使用火焰图。常见的火焰图类型有 On-CPU,Off-CPU,还有 Memory,Hot/Cold,Differential 等等。
关于火焰图整个图形看起来就像一团跳动的火焰,这也正是其名字的由来。燃烧在火苗尖部的就是 CPU 正在执行的操作,不过需要说明的是颜色是随机的,本身并没有特殊的含义,纵向表示调用栈的深度,横向表示采样的次数。因为调用栈在横向会按照字母排序,并且同样的调用栈会做合并,所以一个格子的宽度越大越说明其可能是瓶颈。综上所述,主要就是看那些比较宽大的火苗,特别留意那些类似平顶山的火苗。

2、火焰图的含义

以下是基于 perf (perf是一款Linux性能分析工具) 结果产生的 SVG 图片,用来展示 CPU 的调用栈。

火焰图的地址: https://queue.acm.org/downloads/2016/Gregg4.svg
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶山",就表示该函数可能存在性能问题。
颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
火焰图是 SVG 图片,可以与用户互动,火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比
在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。

3、 生成火焰图

要生成火焰图,必须要有一个顺手的 Tracer 工具,如果操作系统是 Linux 的话,那么选择通常是 perf,systemtap 中的一种。其中 perf 相对更常用而 systemtap 相对更强大,不过缺点是你需要先学会它本身的编程语言,如果你和我一样觉得麻烦,那么我强烈推荐你使用春哥的 nginx-systemtap-toolkit,乍一看名字你可能会误以为这个工具包是 nginx 专用的,实际上这里面很多工具适用于任何 C/CPP 语言编写的程序
sample-bt:用来生成 On-CPU 火焰图的采样数据 实例:http://openresty.org/download/user-flamegraph.svg
sample-bt-off-cpu:用来生成 Off-CPU 火焰图的采样数据 实例:http://agentzh.org/misc/flamegraph/off-cpu-lua-resty-mysql.svg
那么什么时候使用 On-CPU 火焰图?什么时候使用 Off-CPU 火焰图呢?取决于当前的瓶颈到底是什么,如果是 CPU 则使用 On-CPU 火焰图,如果是 IO 或锁 则使用 Off-CPU 火焰图。如果无法确定,那么可以通过压测工具来确认:通过压测工具看看能否让 CPU 使用率趋于饱和,如果能那么使用 On-CPU 火焰图,如果不管怎么压,CPU 使用率始终上不来,那么多半说明程序被 IO 或锁卡住了,此时适合使用 Off-CPU 火焰图。如果还是确认不了,那么不妨 On-CPU 火焰图和 Off-CPU 火焰图都搞搞,正常情况下它们的差异会比较大,如果两张火焰图长得差不多,那么通常认为 CPU 被其它进程抢占了,在采样数据的时候,最好通过压测工具对程序持续施压,以便采集到足够的样本。

  • 例子1
    通过 Off-CPU 火焰图可以发现有一个使用互斥锁的 HTTP Cache 检查代码让绝大部分的 Off-CPU 时间都花在了等待进程锁上
    https://blog.huoding.com/upload/off-cpu-flame-graph-nginx-cache-1.svg
  • 例子2
    在移除了那个引发互斥锁瓶颈的历史代码之后,从图上我们可以清楚地看到 open() 系统调用是下一个最明显的性能瓶颈
    https://blog.huoding.com/upload/off-cpu-flame-graph-nginx-cache-2.svg
  • 例子3
    启用 nginx 的 open_file_cache 指令可以对打开的文件句柄进行缓存,从而节约昂贵的 open() 系统调用。但是缓存容量并不是越大越好,比如当达到 20000 个元素的容量时,共享内存的锁就成了瓶颈
    https://blog.huoding.com/upload/off-cpu-flame-graph-nginx-cache-3.svg

实际使用火焰图的时候,因为 perf / systemtap 本身对系统性能影响较小,所以我们可以在线上随时采样数据来分析性能,我们甚至可以写一个脚本,自动化定期绘制系统运行状况的火焰图,如此一来,即便发生性能故障时我们没有第一时间在现场,也可以随时根据火焰图历史快照来确诊问题的根源。

4、Perf 命令

Perf 命令(performance的简写)是 Linux 系统原生提供的性能分析工具,返回 CPU 正在执行的函数名以及调用栈(stack)。
通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。

5、Java 性能分析工具 async-profiler

程序员如何读懂火焰图相关推荐

  1. mysql火焰图_如何读懂火焰图?

    原标题:如何读懂火焰图? 文章作者:阮一峰http://www.ruanyifeng.com/原文链接:http://www.ruanyifeng.com/blog/2017/09/flame-gra ...

  2. mysql火焰图_技术|如何读懂火焰图?

    软件的性能分析,往往需要查看 CPU 耗时,了解瓶颈在哪里.火焰图flame graph是性能分析的利器.本文介绍它的基本用法. 一.perf 命令 让我们从 perf 命令(performance ...

  3. 据说:只有程序员才能看懂的图!

    欢迎关注专栏:Java架构技术进阶.里面有大量batj面试题集锦,还有各种技术分享,如有好文章也欢迎投稿哦. 「1」外包产品交付,给客户演示时 「2」与领导斗智斗勇,躲猫猫 「3」领导总是能识破程序员 ...

  4. 只有程序员才能读懂的三国演义(二)

    上一篇,我们讲到,刘备三顾茅庐请来诸葛亮,从而战略,战术,政务全方位体系都建立了. 第八回:诸葛阵法复合多变,进程同步方法多样 自从诸葛亮当军师以来,排兵布阵便开始使用复合式战法,往往是多个将军带着多 ...

  5. 只有程序员才能读懂的西游记,又看了一遍西游记!

    这是一个有关计算机网络协议的故事 一.我佛造经传极乐 话说我佛如来为度化天下苍生,有三藏真经,可劝人为善. 就如图中所示,真经所藏之处,在于云端.佛祖所管辖之下,有四个区域Region,称为四大部洲, ...

  6. php搞笑图,这5张只有程序员才能看懂的搞笑图!

    原标题:这5张只有程序员才能看懂的搞笑图! 1.昨天晚上下班回家,一民警迎面巡逻而来. 突然对我大喊:站住! 民警:int类型占几个字节? 我:4个. 民警:你可以走了. 我感到很诧异. 我:为什么问 ...

  7. 只有程序员看的懂面试圣经

    技术圈 只有程序员看的懂面试圣经|如何拿下编程面试 http://www.epubit.com.cn/article/197 当我最初开始参加编程面试的时候,我所有最心仪的公司都忽视了我.现在回头看那 ...

  8. 只有程序员看的懂的面试圣经|如何拿下编程面试

    只有程序员看的懂的面试圣经|如何拿下编程面试 摘要:当我最初开始参加编程面试的时候,我所有最心仪的公司都忽视了我.现在回头看那个时候,我发现自己当时去参加面试都完全没做任何准备.虽然已经有许多博客文章 ...

  9. 程序员 你读过的书,藏着自己的命运 | 技术类(一)

    做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 分享一位老师的人工智能教程.零基础!通俗易懂!风趣幽默! 大家可以看看是否对自己有帮助,点击这里查看[人工智能教程].接下 ...

最新文章

  1. Django的下载与基本命令
  2. Sublime Text 3 快捷键汇总
  3. 庆祝.NET Core悄然崛起:免费送50本优秀技术书籍,请笑纳!!
  4. Java实验二猜数字游戏,JAVA-第2周实验-猜数字游戏
  5. 数据结构--链表--判断一个字符串是否为回文串(单向链表,双向链表)
  6. 转:HTML错误编号大全
  7. 解决Docker容器内安装chrome浏览器无法启动bug
  8. CSS可见区域全局居中
  9. win7 64 位用VMware安装Ubantu 20130908
  10. 从控制台读取password - C#
  11. 揭秘世界首位机器人公民:按照赫本形象设计、曾扬言毁灭人类
  12. 理解BERT Transformer:Attention is not all you need!
  13. 机器学习,斯坦福公开课
  14. JAVA-JCreator的配置、使用以及常见错误
  15. 易语言之编译后图标模糊的处理方案
  16. 序列傅里叶变换性质matlab,MATLAB傅里叶变换及性质.docx
  17. win7安装SP1补丁
  18. 信息学奥赛一本通(C++版)在线评测系统 - 题解目录
  19. php博客平台 开源,PHP开源博客Blog - PHP开源网(PHP-OPEN.ORG)
  20. 坚持你的梦想,什么时候都不晚!

热门文章

  1. SpringBoot 入门
  2. 旧文重发:IP 库的那些事儿之 2013 - 2014 流水帐版~
  3. 模具毕业设计题目推荐 / 毕业设计(论文)说明书 CAD图纸 三维模型 开题报告 任务书 实习报告 答辩 ……
  4. 如何搭建职业教育智慧课堂?
  5. mSystems:土壤化学计量特性影响土壤C、N和P循环微生物丰度及其对全球变化的抵抗力(一作解读)...
  6. Intel graphics HD 4600 核芯显卡 对比 nVIDIA Geforce GTX 750 2GB GDDR5 独立显卡
  7. Okra框架(三) 搭建HTTP服务器
  8. 【XGBoost】第 7 章:使用 XGBoost 发现系外行星
  9. 利用novnc登录绕过WFA
  10. 《资管新规》深度解读