基準測試技巧

簡介

對於基準測試修補程式,我們希望盡可能減少所有可能的雜訊來源。如何做到這一點取決於作業系統。

請注意,低雜訊是必要的,但還不夠。它不排除測量偏差。請參閱 Mytkowicz、Diwan、Hauswith 和 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 的對應 CPU 可以在 /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