效能評測技巧¶
簡介¶
為了評測修補程式,我們希望盡可能減少所有可能的雜訊來源。具體作法很大程度上取決於作業系統。
請注意,低雜訊是必要的,但並非充分條件。它不排除測量偏差。例如,請參閱 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