使用 LNT 追踪性能
在过去的一年里,LNT 增加了许多新功能,使性能跟踪和理解性能差异的根本原因变得更加容易。在这篇文章中,我将展示我们如何使用这些功能。
LNT 包含两个主要的功能部分:
- 一个服务器,
a. 可以将正确性和性能测量数据提交到该服务器,方法是发送正确格式的 json 文件,
b. 分析哪些性能变化是显著的,哪些是不显著的,
c. 具有一个 Web 界面,以多种不同的方式显示结果和分析。 - 一个命令行工具,用于运行测试和基准测试,例如 LLVM 的测试套件、SPEC2000 和 SPEC2006 基准测试。
突出显示的功能侧重于跟踪代码的性能,而不是 LNT 可以跟踪和分析的其他方面。
在性能跟踪方面,我们有两个主要用例:
- 提交后检测性能回归和改进。
- 提交前分析补丁对性能的影响。
提交后性能跟踪
步骤 1. 概述“每日报告”页面
假设您的服务器在 http://yourlntserver:8000 运行,则此页面位于 http://yourlntserver:8000/db_default/v4/nts/daily_report
该页面总结了今天发现的重大变化。
您可以从此页面获得的一种视图示例如下所示:
在上面的屏幕截图中,您可以看到在三个不同的程序 bigfib、fasta 和 ffbench 上存在性能差异。ffbench 的改进仅在名为“machine3”的机器上出现,而其他两个程序的性能回归则在多台机器上出现。
该表显示了性能在过去 7 天中的演变,每一天一列。右侧的火线图以图形方式显示了性能在这些天中的演变。当程序运行多次以获得多个采样点时,这些采样点将显示为垂直对齐的单独点(因为它们发生在同一天)。火线图中的背景颜色代表程序二进制文件的哈希值。如果颜色在多天相同,则这些天的二进制文件相同。
让我们先看一下 ffbench 程序。火线图中的背景颜色在过去两天是相同的,因此该程序的二进制文件在这两天没有改变。结论:报告的 -8.23% 的性能变化是由机器上的噪声引起的,而不是由于代码的更改引起的。垂直分散的点也表明,该程序在过去 7 天中一直存在噪声。
现在让我们看一下 bigfib。火线图中的背景颜色自上次运行以来发生了变化,因此让我们进一步调查。通过单击表中的一台机器名称,我们将转到一个图表,该图表显示了该程序在该机器上的性能长期演变。
步骤 2. 长期性能演变图表
此视图显示了该程序自我们开始测量以来的性能演变。当您单击一个点时,每个点代表程序的一次执行,您将看到一个弹出窗口,其中包含修订版、运行日期等信息。
当您单击弹出窗口中“运行:”后面的数字时,它会将您带到运行页面。
步骤 3. 运行页面
运行页面概述了在给定机器上的一次完整“运行”。运行的具体内容取决于您组织数据的方式,但通常它包括在一台机器上运行多次的许多程序,代表特定编译器修订版在一台机器上为一个优化级别生成的代码质量。
此运行页面显示了许多信息,包括自上次运行以来观察到的性能变化。
当鼠标悬停在条目上时,会显示一个“性能分析”按钮,单击该按钮将显示上次运行和当前运行的性能分析。
步骤 4. 性能分析页面
在页面顶部,概述了当前运行和上次运行之间记录的性能事件的差异。
选择要比较的函数后,此页面将显示带注释的汇编代码。
虽然很明显汇编代码之间存在差异,但通过重建控制流图以获得每个基本块的差异视图,通常更容易理解差异。通过单击“视图:”下拉框并选择您看到的汇编语言,您可以获得一个 CFG 视图。我发现显示绝对值而不是相对值有助于更好地理解性能差异,因此我还选择了右侧下拉框中的“绝对数字”。
显然存在一个热点基本块,并且两个版本中的指令存在差异。红色侧边栏中的数字显示,该基本块中花费的周期数已从 431M 增加到 716M。只需点击几下,我就能找到导致性能差异的关键代码生成更改!
我们将上述工作流与 https://llvm.net.cn/viewvc/llvm-project/zorg/trunk/llvmbisect/ 中提供的 llvmbisect 工具相结合,还可以快速找到引入性能差异的提交。我们发现,同时使用上述 LNT 工作流和 llvmbisect 工具对于快速处理性能差异至关重要。
关于为性能跟踪设置自己的 LNT 服务器的指针
设置 LNT 服务器与运行 http://lnt.llvm.org/quickstart.html 中“安装”和“查看结果”下记录的六个命令一样简单。“运行测试”部分特定于 LLVM 测试,其他部分适用于一般软件的性能跟踪。
向 LNT 服务器提交结果的 json 文件格式的文档位于:http://lnt.llvm.org/importing_data.html。
有关如何添加性能分析信息的文档位于 http://lnt.llvm.org/profiles.html。