基准测试提示¶
简介¶
为了对补丁进行基准测试,我们希望尽可能减少所有可能出现的噪声来源。如何做到这一点在很大程度上取决于操作系统。
请注意,低噪声是必要的,但不是充分的条件。它不能排除测量偏差。例如,请参阅 “在没有做任何明显错误的事情的情况下产生错误数据!”由 Mytkowicz、Diwan、Hauswith 和 Sweeney (ASPLOS 2009)撰写。
通用¶
使用高分辨率计时器,例如 Linux 下的 perf。
多次运行基准测试,以便能够识别噪声。
禁用目标系统上的尽可能多的进程或服务。
禁用频率缩放、Turbo Boost 和地址空间随机化(请参阅特定于操作系统的部分)。
如果操作系统支持,则进行静态链接。这避免了加载动态库可能引入的任何变化。这可以通过将
-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¶
禁用 Turbo 模式
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo