基准测试技巧

简介

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

请注意,低噪声是必要的,但还不够。 它不排除测量偏差。 例如,请参阅 “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