前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >白话火焰图

白话火焰图

作者头像
LA0WAN9
发布于 2021-12-14 00:31:46
发布于 2021-12-14 00:31:46
74200
代码可运行
举报
文章被收录于专栏:火丁笔记火丁笔记
运行总次数:0
代码可运行

很多人感冒发烧的时候,往往会模仿神农氏尝百草的路子:先尝尝抗病毒的药,再试试抗细菌的药,甭管家里有什么药挨个试,什么中药西药,瞎猫总会碰上死耗子,如此做法自然是不可取的,正确的做法应该是去医院验个血,确诊后再对症下药。

让我们回想一下我们一般是如何调试程序的:通常是在没有数据的情况下依靠主观臆断来瞎蒙,而不是考虑问题到底是什么引起的!毫无疑问,调优程序性能问题的时候,同样需要对症下药。好消息是 Brendan D. Gregg 发明了火焰图,可以一针见血的指出程序的性能瓶颈,坏消息是除了 OpenResty 社区,很少看到还有其他人使用火焰图。

常见的火焰图类型有 On-CPUOff-CPU,还有 MemoryHot/ColdDifferential 等等。下面给出某个 PHP 程序的 On-CPU 类型的火焰图例子:

Flame Graph

关于火焰图详细的介绍可以参考 Blazing Performance with Flame Graphs,简而言之:整个图形看起来就像一团跳动的火焰,这也正是其名字的由来。燃烧在火苗尖部的就是 CPU 正在执行的操作,不过需要说明的是颜色是随机的,本身并没有特殊的含义,纵向表示调用栈的深度,横向表示采样的次数。因为调用栈在横向会按照字母排序,并且同样的调用栈会做合并,所以一个格子的宽度越大越说明其可能是瓶颈。综上所述,主要就是看那些比较宽大的火苗,特别留意那些类似平顶山的火苗。

要生成火焰图,必须要有一个顺手的 Tracer 工具,如果操作系统是 Linux 的话,那么选择通常是 perfsystemtap 中的一种。其中 perf 相对更常用,多数 Linux 都包含了它,有兴趣的读者稍后可以参考 Linux Profiling at Netflix 中的介绍,尤其是里面关于如何处理 Broken stacks 问题的描述,建议多看几遍,而 systemtap 相对更强大,不过缺点是你需要先学会它本身的编程语言,如果你和我一样觉得麻烦,那么我强烈推荐你使用春哥的 nginx-systemtap-toolkit,乍一看名字你可能会误以为这个工具包是 nginx 专用的,实际上这里面很多工具适用于任何 C/CPP 语言编写的程序:

那么什么时候使用 On-CPU 火焰图?什么时候使用 Off-CPU 火焰图呢?取决于当前的瓶颈到底是什么,如果是 CPU 则使用 On-CPU 火焰图,如果是 IO 或锁 则使用 Off-CPU 火焰图。如果无法确定,那么可以通过压测工具来确认:通过压测工具看看能否让 CPU 使用率趋于饱和,如果能那么使用 On-CPU 火焰图,如果不管怎么压,CPU 使用率始终上不来,那么多半说明程序被 IO 或锁卡住了,此时适合使用 Off-CPU 火焰图。如果还是确认不了,那么不妨 On-CPU 火焰图和 Off-CPU 火焰图都搞搞,正常情况下它们的差异会比较大,如果两张火焰图长得差不多,那么通常认为 CPU 被其它进程抢占了。

在采样数据的时候,最好通过压测工具对程序持续施压,以便采集到足够的样本。关于压测工具的选择,如果选择 ab 的话,那么务必记得开启 -k 选项,以避免耗尽系统的可用端口。此外,我建议尝试使用诸如 wrk 之类更现代的压测工具。

请按照官方说明来安装。需要着重说明的是,当你安装 kernel-devel 和 kernel-debuginfo 的时候,务必保证所安装的版本和当前内核版本一致,以 CentOS 为例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
shell> yum install yum-utils
shell> yum install kernel-devel
shell> debuginfo-install kernel

当生成的火焰图中有很多十六进制的乱码时,那么意味着对应程序缺失了 debuginfo,可以借助 gdb 来确认这一点,方法如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
shell> gdb -p <PID>

好消息是如果缺失了某些 debuginfo,那么 gdb 会在结尾提示你用 debuginfo-install 命令来安装,坏消息是如果你直接运行多半没有效果,因为 CentOS 缺省没有激活对应的仓库,所以需要在 /etc/yum.repos.d 目录中查找名如 CentOS-Debug.repo 或者 CentOS-Debuginfo.repo 的文件,并在其中设置 enabled=1,如果没有类似名字的文件,那么可以在对应路径里手动创建一个,内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[debug]
name=CentOS-$releasever - DebugInfo
baseurl=http://debuginfo.centos.org/$releasever/$basearch/
gpgcheck=0
enabled=1
protect=1
priority=1

要想熟练的使用火焰图的话,最好的方法就是多看别人的例子。春哥在微博上发过很多例子,这里我列举最具代表性的几个,版权自然归春哥所有:

微博来源:通过 Off-CPU 火焰图可以发现有一个使用互斥锁的 HTTP Cache 检查代码让绝大部分的 Off-CPU 时间都花在了等待进程锁上:

微博来源:在移除了那个引发互斥锁瓶颈的历史代码之后,从图上我们可以清楚地看到 open() 系统调用是下一个最明显的性能瓶颈:

微博来源:启用 nginx 的 open_file_cache 指令可以对打开的文件句柄进行缓存,从而节约昂贵的 open() 系统调用。但是缓存容量并不是越大越好,比如当达到 20000 个元素的容量时,共享内存的锁就成了瓶颈。

如果没有火焰图,我们可能会在解决一个问题后引入另一个问题。

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016-08-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
程序员精进之路:性能调优利器--火焰图
作者:厉辉,腾讯 CSIG 后台开发工程师 本文主要分享火焰图使用技巧,介绍 systemtap 的原理机制,如何使用火焰图快速定位性能问题原因,同时加深对 systemtap 的理解。 让我们回想一下,曾经作为编程新手的我们是如何调优程序的?通常是在没有数据的情况下依靠主观臆断来瞎蒙,稍微有些经验的同学则会对差异代码进行二分或者逐段调试。这种定位问题的方式不仅耗时耗力,而且还不具有通用性,当遇到其他类似的性能问题时,需要重复踩坑、填坑,那么如何避免这种情况呢? 俗语有曰:兵欲善其事必先利其器,个人认
腾讯技术工程官方号
2020/06/15
1.8K0
Linux下systemtap和火焰图介绍及安装
SystemTap 是对 Linux 内核监控和跟踪的工具,详细的介绍及说明见官网。
用户8705059
2021/06/08
1.4K0
掌握运维必备技能--问题故障定位
a. on-CPU:执行中,执行中的时间通常又分为用户态时间user和系统态时间sys。
用户6543014
2019/10/25
1.2K0
掌握运维必备技能--问题故障定位
【转】接入层问题故障定位(火焰图等方法)
原文地址 https://www.jianshu.com/p/0bbac570fa4c
保持热爱奔赴山海
2024/11/27
1140
火焰图:全局视野的Linux性能剖析
日常的工作中,会收到一堆CPU使用率过高的告警邮件,遇到某台服务的CPU被占满了,这时候我们就要去查看是什么进程将服务器的CPU资源占用满了。通常我们会通过top或者htop来快速的查看占据CPU最高的那个进程,如下图:
公众号: 云原生生态圈
2020/07/07
2.5K0
火焰图:全局视野的Linux性能剖析
Linux问题故障定位,看这一篇就够了
有时候会遇到一些疑难杂症,并且监控插件并不能一眼立马发现问题的根源。这时候就需要登录服务器进一步深入分析问题的根源。那么分析问题需要有一定的技术经验积累,并且有些问题涉及到的领域非常广,才能定位到问题。所以,分析问题和踩坑是非常锻炼一个人的成长和提升自我能力。如果我们有一套好的分析工具,那将是事半功倍,能够帮助大家快速定位问题,节省大家很多时间做更深入的事情。
十四君
2020/03/13
3.1K0
Linux问题故障定位,看这一篇就够了
如何看懂火焰图
火焰图(Flame Graph)是由 Linux 性能优化大师 Brendan Gregg 发明的,和所有其他的 profiling 方法不同的是,火焰图以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能导致性能瓶颈的调用栈。
王小明_HIT
2021/09/07
14.9K0
宋宝华:火焰图 全局视野的 Linux 性能剖析
本文介绍了Linux性能剖析利器Flame Graph,从Flame Graph的原理、使用方式、案例以及更多的细节。
Linuxer
2017/11/21
2.4K0
宋宝华:火焰图 全局视野的 Linux 性能剖析
四种火焰图,快速定位Off-CPU性能问题
On-CPU性能问题可以借助On-CPU火焰图解决,但是无法了解进程和线程不在CPU上运行所花费的时间。如果有很多的时间花在同步请求上,也会很容易影响性能表现。
程栩的性能优化笔记
2023/11/01
2.4K0
四种火焰图,快速定位Off-CPU性能问题
使用火焰图进行Java性能分析
内核维护着各种统计信息,被称为Counters,用于对事件进行计数。例如,接收的网络数据包数量,发出的磁盘I/O请求,执行的系统调用次数。常见的这类工具有:
mazhen
2023/11/24
1.2K0
使用火焰图进行Java性能分析
差分火焰图,让你的代码优化验证事半功倍
一般来说,我们将这种火焰图称为on-cpu火焰图,可以用来记录CPU上运行的程序的占比情况。除此之外,还有多种其他种类的火焰图,如:
程栩的性能优化笔记
2023/11/01
8070
差分火焰图,让你的代码优化验证事半功倍
Off-CPU分析:窥见冰山下的性能瓶颈
遇到CPU性能问题时,我们常常通过perf来了解CPU上到底在执行什么,以及通过On-CPU火焰图来帮助我们寻找性能瓶颈。但是,这种方式并不能让我们知道不在CPU上运行的进程和线程到底在做什么。在一些场景中,我们会发现CPU的使用率上不去,性能表现很差,这时候我们也许就需要考虑,是不是花在应用请求、异步调用这种Off-CPU的场景上的时间太多了。
程栩的性能优化笔记
2023/11/01
7590
Off-CPU分析:窥见冰山下的性能瓶颈
真·屠龙之术 | 一次SparkSQL性能分析与优化之旅及相关工具小结
本文是一个OLAP数据源接入到SparkSQL并进行优化的过程。本文总结了调优过程当中一些可以借鉴与讨论的地方,鉴于本人水平有限,还请有这方面调优经验的同学不吝赐教。
王知无-import_bigdata
2021/01/06
1.3K0
真·屠龙之术 | 一次SparkSQL性能分析与优化之旅及相关工具小结
perf和火焰图使用方法
perf是linux上的性能分析工具,perf可以对event进行统计得到event的发生次数,或者对event进行采样,得到每次event发生时的相关数据(cpu、进程id、运行栈等),利用这些数据来对程序性能进行分析。
嵌入式与Linux那些事
2023/03/24
3.8K0
perf和火焰图使用方法
一目了然-火焰图初探
大家好,我是程栩,一个专注于性能的大厂程序员,分享包括但不限于计算机体系结构、性能优化、云原生的知识。
程栩的性能优化笔记
2023/11/01
6620
一目了然-火焰图初探
【Node.js丨主题周】理解perf 与火焰图
火焰图(Flame Graph)看起来就像一团跳动的火焰,因此得名,它可以将 CPU 的使用情况可视化,使我们直观地了解到程序的性能瓶颈。我们通常要结合操作系统的性能分析工具(Profiling Tracer)使用火焰图,常见的操作系统的性能分析工具如下。
博文视点Broadview
2020/06/12
2.1K0
【Node.js丨主题周】理解perf 与火焰图
宋宝华: 用off-cpu火焰图进行Linux性能分析
在《宋宝华:火焰图:全局视野的Linux性能剖析》一文中,我们主要看了on-cpu火焰图,理解了系统的CPU的走向的分析。但是,很多时候,单纯地看on-cpu的情况(什么代码在耗费CPU),并不能解决性能问题,因为有时候性能差的原因瓶颈不一定在CPU上面,而是在off-cpu的时间,比如:
Linux阅码场
2019/12/26
2.8K0
牛逼的Linux性能剖析—perf
系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。代码优化的目标是针对具体性能问题而优化代码或编译选项,以改善软件性能。本篇主要讲性能分析中常用的工具——perf。
刘盼
2019/05/08
6.2K0
牛逼的Linux性能剖析—perf
OpenResty 101
初学者在刚开始学习 OpenResty 的时候,肯定要搭建一个环境,通常来说,我们推荐直接使用官方提供的二进制包,比如 CentOS 的话,直接用 yum 安装即可,不过二进制包有一个限制是它的各种编译选项都是固定的,没办法修改,比如现在新版的二进制包缺省开启了 GC64,用来支持大内存,但是目前的火焰图工具并不支持 GC64,报错:
LA0WAN9
2021/12/14
1.1K0
性能调优工具-火焰图
工具的进化一直是人类生产力进步的标志,合理使用工具能大大提高我们的工作效率,遇到问题时,合理使用工具更能加快问题排查的进度。这也是我为什么非常喜欢 shell 的原因,它丰富的命令行工具集加管道特性处理起文本数据集来真的精准而优雅,让人迷醉。
枕边书
2019/07/19
1.6K0
相关推荐
程序员精进之路:性能调优利器--火焰图
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文