现代系统中的噪声
硬件和软件中有许多旨在提高性能的特性。但并非所有特性都具有确定性行为。让我们考虑动态频率调整11(DFS):这是一种允许CPU在短时间内增加频率的特性,从而使其运行速度显著提高。然而,CPU不能长时间保持在“超频”模式下,因此稍后会将频率降回基础值。DFS通常在很大程度上取决于核心温度,这使得很难预测对我们实验的影响。
如果我们在“冷”处理器上连续启动两次基准测试,1第一次运行可能会在一段时间内以“超频”模式运行,然后将频率降回基准水平。然而,第二次运行可能没有这种优势,将以基准频率运行而不进入“Turbo模式”。尽管我们两次运行了完全相同版本的程序,但它们运行的环境并不相同。图@fig:FreqScaling显示了动态频率调整可能导致测量结果的差异。正如你所看到的,由于第一次运行在更高的频率下运行,因此比第二次运行快1秒。在笔记本电脑上进行基准测试时,这样的情况经常发生,因为它们的散热能力有限。
频率调整是一种硬件特性,但测量中的变化也可能来自软件特性。让我们考虑一个文件系统缓存的例子。如果我们对进行大量文件操作的应用程序进行基准测试,例如git status
命令,文件系统可能在性能方面起到重要作用。当运行基准测试的第一次迭代时,文件系统缓存中可能缺少所需的条目。然而,当第二次运行相同的基准测试时,文件系统缓存将被热身,使其比第一次运行明显更快。
不幸的是,测量偏差不仅来自环境配置。[@Mytkowicz]的论文表明,UNIX环境大小(即存储环境变量所需的总字节数)和链接顺序(给链接器提供的目标文件的顺序)可能以不可预测的方式影响性能。此外,还有许多其他影响内存布局并可能影响性能测量的方法。[@Curtsinger13]提出了一种在现代架构上实现统计上可靠的软件性能分析的方法。这项工作表明,通过在运行时高效且重复地随机化代码、堆栈和堆对象的放置,可以消除来自内存布局的测量偏差。不幸的是,这些想法并没有得到很大发展,现在这个项目几乎被放弃了。
请记住,即使运行类似Linux top这样的任务管理工具也会影响测量,因为CPU核心会被激活并分配给它。这可能会影响实际基准测试运行的核心频率。
要获得一致的测量结果,需要以相同的条件运行所有基准测试的所有迭代。然而,要复制完全相同的环境并完全消除偏差是不可能的:可能会存在不同的温度条件、电力传递峰值、运行的邻近进程等。追踪系统中所有潜在的噪音和变化可能是一个永无止境的故事。有时无法实现,例如在对大型分布式云服务进行基准测试时。
为了确保性能测试(例如微基准测试)具有明确且稳定的结果,消除系统中的非确定性行为是有益的。例如,当您实现代码更改并希望通过对相同程序的两个不同版本进行基准测试来了解相对加速比时,您可以控制基准测试的大多数变量,包括其输入、环境配置等。在这种情况下,消除系统中的非确定性有助于获得更加一致和准确的比较。完成本地测试后,请记住验证投影性能改进是否反映在实际测量中。读者可以在附录 A 中找到一些示例,这些示例说明了哪些功能会使性能测量产生噪音以及如何禁用它们。此外,还有一些工具可以设置环境以确保基准测试结果具有低方差,其中一个这样的工具是 temci14。
在评估实际性能提升时,不建议消除系统非确定性行为。工程师应该尝试复制他们正在优化的目标系统配置。对测试系统进行任何人工调整都会使结果与您的服务用户在实际中看到的结果相背离。此外,任何性能分析工作,包括分析(参见 [@sec:profiling]),都应在与实际部署中类似的系统上进行。
最后,重要的是要记住,即使特定硬件或软件功能具有非确定性行为,也并不意味着它被认为是有害的。它可能会产生不一致的结果,但它旨在提高系统的整体性能。禁用此类功能可能会减少微基准测试中的噪音,但会使整个套件运行更长时间。这对于 CI/CD 性能测试尤其重要,因为整个基准测试套件的运行时间有限制。
1. 冷处理器是指处于空闲模式一段时间,使其冷却下来的 CPU ↩
11. 动态频率缩放 - https://en.wikipedia.org/wiki/Dynamic_frequency_scaling ↩
14. Temci - https://github.com/parttimenerd/temci ↩