如何使用 SVG 火焰图可视化应用程序的性能

已发表: 2023-02-21

SVG火焰图是可视化应用程序性能的好方法。 通过显示在每个函数中花费的时间,您可以快速识别代码中占用过多时间的区域。 要显示 SVG 火焰图,您需要使用可以生成 SVG 火焰图的工具。 有许多可用的开源工具,例如 flamegraph.io。 生成火焰图后,您可以使用标签将其嵌入到您的网站或博客中。 您还可以使用 Google 表格等工具来显示您的火焰图。 只需创建一个新的电子表格,选择“插入 > 图像”,然后粘贴火焰图的 URL。

如何运行火焰图?

如何运行火焰图?
图片来源:badawi.io

为了运行火焰图,您需要在计算机上安装一些东西。 您首先需要的是 Google Chrome 浏览器。 接下来,您需要安装 Flame Graph 扩展。 安装完这两个东西后,您需要打开 Google Chrome 浏览器并转到Flame Graph 扩展页面。 从那里,您需要单击“创建新的火焰图”按钮。 这将打开一个新选项卡,您需要在其中输入要为其创建火焰图的网站的 URL。 输入 URL 后,您需要单击“创建火焰图”按钮。 这将需要一些时间来创建火焰图。 完成后,您将能够看到结果。

火焰图显示分布式请求跟踪和请求执行期间发生的每个服务调用的摘要。 分布式跟踪的火焰图显示延迟和错误数据,以帮助开发人员识别其应用程序中的瓶颈。 文章提供了如何解释火焰图的解释以及示例,以及用于跟踪分布式跟踪的其他方法。 Y 轴显示调用堆栈的深度(调用次数)。 当您单击火焰图上的跨度时,您通常会看到与调用相关的持续时间和错误的摘要。 您可以通过单击火焰图下方的选项卡来查找指标、日志、网络性能数据、代码热点和其他上下文信息。 螺旋图是由一组环包围的圆形成的。 火焰图可用于可视化用于满足代码分析器请求的方法和代码路径。 Datadog 应用程序性能监控和分布跟踪工具使您能够跟踪跨所有服务的所有请求的路径。

火焰图为开发人员提供了一种快速、简单的方法来查看性能问题

开发人员可以使用火焰图在几秒钟内可视化分布式应用程序的性能。 火焰图可以通过提供请求跟踪的图形表示并突出显示应用程序遇到问题的位置来帮助开发人员识别和纠正性能问题。

你如何在 Flamegraph 上搜索?

您可以通过几种不同的方式在火焰图上进行搜索。 一种方法是使用位于屏幕右上角的搜索框。 此搜索框允许您输入关键字,然后将用于搜索火焰图。 另一种在 flamegraph 上搜索的方法是使用浏览功能。 该功能位于屏幕左侧。 此功能允许您浏览不同类别的火焰图。

随着火焰图的出现,现在更容易搜索它们。 在右侧的大 TCP_send() 框架下有一个写入代码路径。 如果您单击其中一个突出显示的帧,您可以看到为什么会发生这种情况。 Tcp_Send 存在于 59.1% 的测试样本中。 其他需要查找的有趣术语包括 re?cv、spin、copy 和 x。

为什么称为火焰图?

在创建可视化时,Neelakanth 和 Roch 使用了完全随机的颜色。 CPU 很热(忙),这解释了为什么我首先只选择暖色。 因为它类似于火焰,所以火焰图很快流行起来。

火焰的危险

火热的事件是一种释放挫败感并开始热烈讨论的有趣方式。 它们还可能导致人际关系破裂并导致人们分崩离析。
对付火焰最好的方法就是忽视它们。 有人可能会张贴火焰; 你应该是那个忽略它的人。 没有必要回应。 不值得消耗能量。
火焰可能是一种有趣的交流方式,但如果使用不当,在某些情况下也可能有害。 您不必害怕火焰; 相反,您应该避开它们并保持冷静。

谁发明了火焰图?

火焰图已经成为许多语言以及 Netflix 和其他行业进行性能分析的重要工具。 他们的作者 Brendan Gregg 创建了火焰图,该图发表在 2016 年 6 月的 ACM Communications 上。


火焰图查看器

火焰图查看器是一种允许用户以图形形式可视化数据的软件。 该软件通常用于解决计算机或其他设备的问题。

您可以使用 speedscope 以基于网络的方式查看大型性能配置文件。 Brendan Gregg 的 FlameGraphs 的灵感来自 Chrome 开发人员工具的性能面板。 来自系统的数据不会传递到任何服务器,它完全在浏览器中运行。 Chrome 和 Firefox 应该适用于所有平台(尽管我只测试过 Mac)。 在左重视图中,相同的堆栈被组合在一起,无论它们是否已被顺序记录。 每个父代的堆栈都经过排序,使其最重的堆栈位于左侧——因此是左手标签。 情况的详细视图将帮助您了解在给定情况下您有多少函数调用。

Rudro Samanta 一直在使用 speedscope 可视化使用 Xcode 捕获的 iOS 应用程序配置文件。 Jest 用于编写测试用例,Travis CI 用于持续集成代码,Coveralls 用于测试覆盖率报告,Parcel 用于转换源码,prettier 用于自动格式化代码。 实现这一目标的一种方法是增加 speedscope 可以导入的格式数量,以及一种使集成更紧密的方法。 我已经在 speedscope 上工作了九个月,我觉得我已经让它离我而去。 作为一名工程师,我将努力创建可维护、可理解和有用的系统和工具集,以帮助人们解决世界各地的复杂问题。 我相信今年我会投入更多时间在创意和协作项目上。

在线火焰图

火焰图是分析数据的图形表示,通常用于显示软件程序的性能特征。 每个部分的高度表示在该特定代码部分中花费的时间量。 这些部分根据它们被调用的时间从左到右排序。

与树和图不同,火焰图通过以小格式呈现大量信息来有效地利用屏幕空间。 单击此处,您将了解如何将树转换为火焰图,以及火焰图的主要特征有哪些。 火焰图在 Google Cloud Profiler 中用于显示分析数据。 当您跟踪调用堆栈时,帧的宽度会减小,因为被调用者的总 CPU 时间不能超过另一个被调用者的 CPU 时间。 火焰形状是由这种行为引起的。 在使用 CPU 自身时间去除多余的空白和着色帧后,火焰图现在显示如下。 尽管 foo1 和 foo2 的调用堆栈已被保留,但以 foo2 开始并以 foo1 结束的堆栈现在位于帧旁边。

如何制作火焰图?

要生成火焰图,您必须首先对堆栈跟踪进行采样。 它传统上被分为两种类型:系统配置文件,例如 Linux perf,它显示系统代码路径(例如,JVM GC、系统调用、TCP),而不是 Java 配置文件。 可以使用 JVM 分析器,例如 hprof、lJP 和商业分析器。

火焰图与火焰图

火焰图和火焰图之间存在一些关键差异。 火焰图通常显示事件的时间线,而火焰图显示堆栈跟踪。 火焰图通常用于调试性能问题,而火焰图更常用于可视化性能数据。 火焰图是查看程序如何花费时间的好方法。 它们可以向您展示瓶颈在哪里,以及程序如何使用资源。 火焰图是查看程序如何使用资源的好方法。

作为一种用于确定哪些代码路径是热的(因为它们在 CPU 上很忙)的粗略但有用的技术,以固定速率进行分析会产生良好的结果。 火焰图允许您通过对堆栈跟踪进行采样来快速识别热代码路径。 我的 Linux perf (perf_events) 和 DTrace 示例都是您可以安装的软件示例。 FlameGraph 是一种 Perl 工具,可生成交互式 SVG,并允许您通过在图像上拖放来查看详细信息。 可视化可能看起来与探查器中的其他可视化类似,但在某些方面与它们不同。 因为这最初用于可视化 CPU 上的热点,所以它被称为火焰图。 查看 eBPF profile(8) 部分,了解在较新的 Linux 内核中运行的开销较低的方法(不推荐使用 eBPF profile(8))。

有关 perf 的更多信息,请参阅我的 perf_events 页面的火焰图部分。 可以通过包含折叠模式直接从 Linux 4.5 perf 报告输出折叠输出,这只能通过使用 stackcollapse-perf.pl 访问。 此样本以 99 赫兹 (-F 99) 提供由用户和内核堆栈 (-f) 分隔的内核 (-a) 和用户 (-d) 的 lint,样本的时间限制为 60 秒。 可以使用 Fedora 16 中的 SystemTap v1.7 生成火焰图。计时器也可以用于对堆栈跟踪进行采样。 此配置文件探测以系统时钟速率 (CONFIG_HZ) 运行。 SystemTap 可以使用其 systemTap 聚合功能在内核中进行聚合,并将(不太详细的)报告传递给用户。

这些图表是在 Fedora 16 客户机(具有一个虚拟 CPU)上使用 KVM(Ubuntu 主机)(32 位)生成的。 在裸机上,一些代码路径和样本比例会有很大不同。 可以单击分析数据中的元素以查看百分比(但不能单击缩放,因为这是新版本),但不能放大。该图是了解更多 Linux 内部结构的绝佳工具。 在 illumos 内核管理程序主机上,在此示例中可以看到用户和内核堆栈。 独立的 SVG 和 PNG 版本也可用。 为了观察内核时间是如何分配给创建短生命周期的进程的,我对这个火焰图进行了一个工作负载。

火焰图通常用于通过显示头发来识别内核中断负载。 Ubuntu release 1716 中的 NUMA Balancing 消耗了一半以上的 CPU 周期来平衡节点之间的内存,导致性能低下。 在 D3 中重写火焰图对于保持合并顺序不变而不必重新生成火焰图是必不可少的。 在我的 JavaOne 2016 演讲中,使用火焰图在 Linux 上进行 Java 性能分析,我介绍了使用 Linux perf 生成混合模式火焰图的最新技术。 JDK8u60 包含一个名为 /PreservePointerFrame 的功能,它允许您生成性能图和火焰图。 JDK-8068945 已作为堆栈分析(帧指针)的热补丁添加到 JDK 库中。 在 x64 的编译代码中使用 RBP 寄存器作为帧指针时,它被认为是正确的帧指针。

当作为 Jstack 方法运行 DTrace 时,它​​可以跟踪用户级堆栈以及 Java 方法和类。 对于Java程序,Stackcollapse.pl和flamegraph.pl用于生成CPU火焰图。 一些 JVM 版本不支持 ustack helper,这有很多问题。 它适用于任何堆栈跟踪加值组合,而不仅仅是具有 CPU 计数的堆栈跟踪。 第一个问题是由于错误 JDK-6260864,Jstack() 可能无法正确遍历堆栈,该错误于 2005 年提交,截至 2014 年仍未修复。此错误导致我的生产工作负载中的大多数示例堆栈休息。 您可以深入了解设备的内存分配、设备 IO、系统调用模式、CPU 外事件和特定函数调用。 如果使用其中任何一个,则可以获得具有相关值的堆栈跟踪:计数、字节或延迟。 火焰图也可以在火焰图页面上查看。

火焰图 Java

火焰图是一种数据可视化,用于表示软件程序的性能。 它是一个图表,显示程序在每个功能上花费的时间。 条形的高度表示程序在该函数中花费的时间量。 条形的宽度表示程序相对于其他函数在该函数中花费的时间量。

火焰图最近成为一种在 Java 中可视化 CPU 使用率的流行新方法。 它们可以使用 Google 的轻量级 Java 分析器 (code.google.com) 和我的火焰图软件 (github) 创建。 值得庆幸的是,未来火焰图不再是 Java 分析器的独立功能。 在这篇博文中,我们将研究一种仅基于 Java 的基于 JVMTI 的方法,该方法虽然有效,但有一些局限性。 Jeremy Manson 创建了一个轻量级 Java 分析器,可用于对 CPU 进行采样。 此示例报告在 java 启动直至退出时生成,并附加了一个 trace.txt 文件。 要运行该程序,需要支付一些费用。

对于我的程序来说,它很小(请求率仅增加 1%,CPU 消耗增加 7%)。 如果应降低采样率,请参阅后续部分。 flamegraph.pl 程序的输出可以使用各种选项 (list -h) 进行自定义,包括标题。 Richard Warburton 的诚实剖析器基于相同的剖析技术,也能派上用场。 如果我打算在很长一段时间内收集大量数据,我可能会将采样率从 100 赫兹降低到 50 赫兹或更低。