基准测试技巧¶
简介¶
为了对补丁进行基准测试,我们希望尽可能减少所有可能的噪声来源。 如何做到这一点很大程度上取决于操作系统。
请注意,低噪声是必要的,但还不够。 它不排除测量偏差。 例如,请参阅 “Producing Wrong Data Without Doing Anything Obviously Wrong!” by Mytkowicz, Diwan, Hauswith and Sweeney (ASPLOS 2009)。
概述¶
使用高分辨率计时器,例如 linux 下的 perf。
多次运行基准测试,以便能够识别噪声。
在目标系统上禁用尽可能多的进程或服务。
禁用频率缩放、睿频加速和地址空间随机化(请参阅特定于操作系统的部分)。
如果操作系统支持静态链接,则使用静态链接。 这避免了加载动态库可能引入的任何变化。 这可以通过将
-DLLVM_BUILD_STATIC=ON
传递给 cmake 来完成。尽量避免使用存储。 在某些系统上,您可以使用 tmpfs。 将程序、输入和输出放在 tmpfs 上可以避免接触真实的存储系统,真实存储系统可能具有相当大的可变性。
挂载它(至少在 linux 和 freebsd 上)
mount -t tmpfs -o size=<XX>g none dir_to_mount
Linux¶
禁用地址空间随机化
echo 0 > /proc/sys/kernel/randomize_va_space
将 scaling_governor 设置为 performance
for i in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor do echo performance > $i done
使用 https://github.com/lpechacek/cpuset 为您正在进行基准测试的程序保留 CPU。 如果使用 perf,请至少保留 2 个核心,以便 perf 在一个核心中运行,而您的程序在另一个核心中运行
cset shield -c N1,N2 -k on
这会将所有线程移出 N1 和 N2。
-k on
表示即使内核线程也会被移出。禁用您将用于基准测试的 CPU 的 SMT 对。 CPU N 的配对可以在
/sys/devices/system/cpu/cpuN/topology/thread_siblings_list
中找到,并使用以下命令禁用echo 0 > /sys/devices/system/cpu/cpuX/online
使用以下命令运行程序
cset shield --exec -- perf stat -r 10 <cmd>
这将在隔离的 CPU 中运行
--
之后的命令。 特定的 perf 命令运行<cmd>
10 次并报告统计信息。
完成这些设置后,您可以预期 perf 变化小于 0.1%。
Linux Intel¶
禁用睿频模式
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo