草庐IT

巧用 “火焰图” 快速分析链路性能

littleguance 2023-03-28 原文

本文旨在帮助读者了解什么是全链路追踪以及如何使用工具来分析链路中性能瓶颈。

?火焰图是什么?

火焰图(Flame Graph)是由 Linux 性能优化大师 Brendan Gregg 发明的用于分析性能瓶颈的可视化图表,它以一个全局的视野来看待时间分布,从顶部往底部列出所有可能导致性能瓶颈 Span。

下面以观测云的火焰图为例,陈述其绘制逻辑:

 

 

 

纵轴(Y轴)代表调用 Span 的层级深度,用于表示程序执行片段之间的调用关系。上面的 Span 是下面 Span 的父 Span。(数据上,可以通过子 Span 的 parent_id 等于父 Span 的 span_id 关联起来)

横轴(X轴)代表单个 Trace 下 Span 的持续时间。一个格子的宽度越大,说明该 Span 从开始到结束的持续时间越长。只要有“平顶”,则表示该函数可能存在性能问题,就可能是造成性能瓶颈的原因。

??为什么要用火焰图?

通常,我们可以通过查询日志、使用Shell等协助定位问题异常原因;再细致一点,会用到Jmap、Jstack分析堆栈跟踪等。但若需要分析至堆栈、调用链的阶段,说明很可能已经是Performance的问题了。但上述方法,或将产生海量文本无法直观分析,或缺乏汇聚型数据难以综合评判,降低了我们排查问题的效率。

因此,为了降低人工二次分析难度、提高性能数据的易懂性,火焰图便被广泛用于分析性能瓶颈问题。它纳入了线程栈的调用链和出现频率两个维度,从而可以非常方便地看到顶层的哪个函数占据的宽度最大,即性能资源都消耗在了哪里;进而,能够直观地定位程序的性能瓶颈,以进行相应地优化。

观测云的火焰图除了展示函数调用的基本性能信息之外,还在同一个可视化图表中关联了多维度数据,便于用户综合评判性能瓶颈的原因所在;同时,充满细节与温度的人性化交互设计,提升了使用体验及工作效率。

???如何巧用观测云火焰图分析链路性能?

3.1 火焰图

 

 


火焰图左侧图示区:

同一种颜色的 Span 对应同一个服务:可直观感知当前 Trace 所涉及到哪些服务请求。(小提示:服务的颜色会继承到链路查看器等其他分析页面)

每一个Span 块默认显示:当前 Span 的资源或操作、持续时间、以及是否存在错误;悬浮还可展示其整体耗时占比。

对于多线程或者异步任务:同层级或下属子Span执行时间可能会出现重叠,图中通过连线的形式来关联父子 Span 之间的关系。

右侧服务列表:

显示当前 Trace 内发生请求调用,所涉及到的服务名称和颜色、该服务执行时间占总执行时间的百分比。(注意:服务名称显示为 None 的情况,则表示当前 trace 未找到 parent_id = 0 的顶层 Span)

3.2  Span 列表

 

 

上图全收起状态,以服务视角:

显示服务类型、名称和颜色,以及当前服务下是否存在 status = error 的 Span;还依次显示当前服务下面的 Span 数量、持续时间的平均值、执行时间总和,以及当前服务的执行时间占总执行时间的百分比。

下图服务行展开状态,以 Span 视角:

显示资源名称、对应服务颜色及当前 span 是否存在 status = error ;还依次显示当前 Span 持续时间、执行时间数值及占总执行时间的百分比。

3.3 服务调用关系

观测云还可以显示当前 Trace 下服务之间的调用关系拓扑:

支持按资源名称模糊匹配,定位某个资源的上下游服务调用关系。

服务 hover 后,显示当前服务下的 Span 数量、服务执行时间及占比。

????如何开启观测云通过火焰图分析链路性能?

4.1 注册与安装

建议通过电脑端,进入【 观测云 】(https://console.guance.com)平台进行实操,并参考观测云学堂【 巧用“火焰图”快速分析链路性能 】(https://www.guance.com/learning/articles/flame_graph01) 的操作指引。

4.2 实际链路数据分析举例

第一步:登录观测云工作空间,查看应用性能监测模块的服务列表,从服务页面已经可以看出 browser服务的 P90 响应时间较长。

第二步:点击 browser服务名称,查看该服务的概览分析视图,可以看出影响当前服务响应时间的最关键的资源是 query_data这个接口,因为这个接口是观测云的一个数据查询接口,所以接下来我们看下这个接口在查询过程当中,到底是因为什么导致耗时较长。

第三步:点击资源名称,跳转到查看器,通过点击 持续时间 倒序查看响应时间的最大值。

第四步:点击 Span 数据,查看分析当前 Span 在整个链路里面的执行性能和其他相关信息。

第五步:点击右上角 [全屏] 模式按钮,放大查看火焰图相关信息。

 

结合整体链路查看,可以看出 browser服务在整个链路中的执行时间占比高达 96.26%,从 Span 列表也可以得出此结论。

根据火焰图的占比和对应的链路详情信息,我们可以总和得出 browser的这个 query_data Span在整个执行过程中可以看到 resource_ttfb(资源加载请求响应时间)耗时 400 多毫秒, resource_first_byte(资源加载首包时间)耗时 1.46 秒。

再结合查看 province的地理位置定位是 Singapore(新加坡),而我们的站点部署在杭州节点,则可以得出是因为地理位置问题导致数据传输的时间变长从而影响了整个的耗时。

 

相关阅读:

【 The Flame Graph --Brendan Gregg 】(https://queue.acm.org/detail.cfm?id=2927301)

【 如何读懂火焰图?--阮一峰的网络日志 】(https://www.ruanyifeng.com/blog/2017/09/flame-graph.html)

【 关于 Traces 、Span 等链路相关概念的介绍 --OpenTracing 】(https://wu-sheng.gitbooks.io/opentracing-io/content/pages/spec.html)

【 巧用“火焰图”快速分析链路性能 】(https://www.guance.com/learning/articles/flame_graph01)

有关巧用 “火焰图” 快速分析链路性能的更多相关文章

  1. Ruby 的数字方法性能 - 2

    我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

  2. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

  3. ruby-on-rails - 如果条件与 &&,是否有任何性能提升 - 2

    如果用户是所有者,我有一个条件来检查说删除和文章。delete_articleifuser.owner?另一种方式是user.owner?&&delete_article选择它有什么好处还是它只是一种写作风格 最佳答案 性能不太可能成为该声明的问题。第一个要好得多-它更容易阅读。您future的自己和其他将开始编写代码的人会为此感谢您。 关于ruby-on-rails-如果条件与&&,是否有任何性能提升,我们在StackOverflow上找到一个类似的问题:

  4. ruby - 如何以表格格式快速打印 Ruby 哈希值? - 2

    有没有办法快速将表格格式的ruby​​哈希打印到文件中?如:keyAkeyBkeyC...1232343451253474456...其中散列的值是不同大小的数组。还是使用双循环是唯一的方法?谢谢 最佳答案 试试我写的这个gem(在表中打印散列、ruby对象、ActiveRecord对象):http://github.com/arches/table_print 关于ruby-如何以表格格式快速打印Ruby哈希值?,我们在StackOverflow上找到一个类似的问题:

  5. ruby - 如何找到我的 Ruby 应用程序中的性能瓶颈? - 2

    我编写了一个Ruby应用程序,它可以解析来自不同格式html、xml和csv文件的源中的大量数据。我如何找出代码的哪些区域花费的时间最长?有没有关于如何提高Ruby应用程序性能的好资源?或者您是否有任何始终遵循的性能编码标准?例如,你总是用加入你的字符串吗?output=String.newoutput或者你会使用output="#{part_one}#{part_two}\n" 最佳答案 好吧,有一些众所周知的做法,例如字符串连接比“#{value}”慢得多,但是为了找出您的脚本在哪里消耗了大部分时间或比所需时间更多,您需要进行分

  6. 电脑启动后显示器黑屏怎么办?排查下面4个问题,快速解决 - 2

    电脑启动出现显示器黑屏是一个相当常见的问题。如果您遇到了这个问题,不要惊慌,因为它有很多可能的原因,可以采取一些简单的措施来解决它。在本文中,小编将介绍下面4种常见的电脑启动后显示器黑屏的原因,排查这些原因,快速解决! 演示机型:联想Ideapad700-15ISK-ISE系统版本:Windows10一、显示器问题如果出现电脑启动后显示器黑屏的情况。那么首先您需要检查一下显示器是否正常工作。您可以通过更换另一个显示器或将当前显示器连接到另一台计算机来检查显示器是否存在问题。如果问题仍然存在,那么您可以排除显示器故障的可能性。 二、显卡问题如果您的电脑配备了独立显卡,那么显卡故障也可能是导致电脑

  7. 建模分析 | 平面2R机器人(二连杆)运动学与动力学建模(附Matlab仿真) - 2

    目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标

  8. 网站日志分析软件--让网站日志分析工作变得更简单 - 2

    网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.

  9. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  10. ABB-IRB-1200运动学分析MATLAB RVC工具分析+Simulink-Adams联合仿真 - 2

    一、机器人介绍        此处是基于MATLABRVC工具箱,对ABB-IRB-1200型号的微型机械臂进行正逆向运动学分析,并利Simulink工具实现对机械臂进行具有动力学参数的末端轨迹规划仿真,最后根据机械模型设计Simulink-Adams联合仿真。 图1.ABBIRB 1200尺寸参数示意图ABBIRB 1200提供的两种型号广泛适用于各作业,且两者间零部件通用,两种型号的工作范围分别为700 mm 和 900 mm,大有效负载分别为 7 kg 和5 kg。 IRB 1200 能够在狭小空间内能发挥其工作范围与性能优势,具有全新的设计、小型化的体积、高效的性能、易于集成、便捷的接

随机推荐