CPU 特性用于性能分析

性能分析的最终目标是识别性能瓶颈并定位与之相关的代码部分。不幸的是,没有预定的步骤可供遵循,因此可以采用多种不同的方法。

通常,对应用程序进行性能分析可以快速了解应用程序的热点。有时,这是开发人员修复性能低效率所需要做的全部工作。特别是高级性能问题通常可以通过性能分析来揭示。例如,考虑这样一个情况:您刚刚对应用程序中的函数 foo 进行了一些更改,突然发现性能明显下降。因此,您决定对应用程序进行性能分析。根据您对应用程序的心理模型,您期望 foo 是一个冷函数,它不会出现在热门函数的前 10 名列表中。但是当您打开性能分析结果时,您会发现它消耗的时间比以前多得多。您很快意识到自己在代码中犯了错误并修复了它。如果性能工程中的所有问题都这么容易修复,这本书就不会存在了。

当您踏上从应用程序中榨取最后一点性能的旅程时,最基本的热点列表是不够的。除非你有一个水晶球或者你脑海中有一个完整处理器的准确模型,你需要额外的支持来理解性能瓶颈是什么。然而,在使用本章提供的信息之前,请确保您尝试优化的应用程序没有重大性能缺陷。因为如果确实存在,使用 CPU 性能监控功能进行低级别优化是没有意义的。它可能会让你走错方向,而不是修复真实的高级性能问题,你将只會优化糟糕的代码,这只是浪费时间。

一些开发人员依赖他们的直觉,并进行随机实验,试图强制各种编译器优化,如循环展开、向量化、内联化等等。事实上,有时你可能会很幸运,并会享受来自同事的一部分赞扬,甚至可能在你的团队中获得非官方的性能大师称号。但通常,你需要有非常好的直觉和运气。在这本书中,我们不教你如何变得幸运。相反,我们展示了在实践中被证明行之有效的方法。

现代 CPU 不断增加新特性,以不同方式增强性能分析。使用这些特性可以大大简化查找缓存未命中、分支预测错误等低级问题。在本章中,我们将介绍现代 CPU 上的一些硬件性能监控功能。不同厂商的处理器不一定具有相同的特性集。在本章中,我们将重点关注英特尔、AMD 和 ARM 处理器中可用的性能监控功能。RISC-V 生态系统还没有成熟的性能监控基础设施,因此我们这里不会涉及。

  • 自顶向下微架构分析 (TMA) 方法,详见 [@sec:TMA]。这是一种强大的技术,用于识别程序对 CPU 微架构利用效率低下的情况。它描述了工作负载的瓶颈,并允许定位源代码中发生瓶颈的确切位置。它抽象了 CPU 微架构的复杂性,即使对于经验不足的开发人员来说也相对容易使用。
  • 最近分支记录 (LBR),详见 [@sec:lbr]。这是一个机制,可以与执行程序同时连续记录最近的分支结果。它用于收集调用堆栈、识别热门分支、计算单个分支的错误预测率等等。
  • 处理器事件采样 (PEBS),详见 [@sec:secPEBS]。这是一个增强采样的特性。其主要优点包括:降低采样的开销;并提供“精确事件”功能,使其能够精准定位导致特定性能事件的指令。
  • 英特尔处理器跟踪 (PT),详见附录 D。它是一个记录和重建程序执行的工具,每条指令都会记录时间戳。其主要用途是事后分析和根源分析性能问题。

英特尔 PT 特性在附录 D 中介绍。英特尔 PT 本来应该是性能分析的“终结手段”。由于其运行时开销低,它是一个非常强大的分析功能。但事实证明它在性能工程师中并不受欢迎。部分原因是工具中的支持还不成熟,部分原因是在很多情况下它都是一种杀鸡用牛刀,使用采样分析器更容易。此外,它会产生大量数据,这不适合长时间运行的工作负载。

上述特性从 CPU 的角度提供了程序效率的见解。在下一章中,我们将讨论性能分析工具如何利用它们提供多种不同类型的性能分析。

results matching ""

    No results matching ""