效能評測技巧

簡介

為了評測修補程式,我們希望盡可能減少所有可能的雜訊來源。具體作法很大程度上取決於作業系統。

請注意,低雜訊是必要的,但並非充分條件。它不排除測量偏差。例如,請參閱 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