基准测试提示

简介

为了对补丁进行基准测试,我们希望尽可能减少所有可能出现的噪声来源。如何做到这一点在很大程度上取决于操作系统。

请注意,低噪声是必要的,但不是充分的条件。它不能排除测量偏差。例如,请参阅 “在没有做任何明显错误的事情的情况下产生错误数据!”由 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