基準測試技巧¶
簡介¶
對於基準測試修補程式,我們希望盡可能減少所有可能的雜訊來源。如何做到這一點取決於作業系統。
請注意,低雜訊是必要的,但還不夠。它不排除測量偏差。請參閱 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