Perfcompare:效能比較試用建構工具

「perfcompare」試用建構工具是選用的 CQ 試用建構工具,可在不到達網頁的情況下評估變更對效能的影響 (也就是用於預先提交的效能測試)。無論是否套用 CL,系統都會執行效能測試並比較結果,瞭解是否有任何效能迴歸或改善的問題。

Google 員工如需其他說明文件,可以參閱 Google 內部 Perfcompare 文件

使用方式

fuchsia.git CLs

如要在 Gerrit CL 上執行 Perfcompare,請按照下列步驟操作:

  • 啟動建構:在 Gerrit 網頁版 UI 中選取「Choose tryjobs」,然後從建構工具清單中選取一或多個 Perfcompare 建構工具。快速達成這個目的的方法是在搜尋欄位中輸入「perfcompare」,這樣就能篩選清單以顯示可用的 Perfcompare 建構工具。
  • 取得結果:Gerrit 中的 CL 上會顯示試用建構工具的結果頁面連結。建構工具執行完畢後,會在建構頁面的「Compare perf test without and CL」-> "stdout" (或「raw」) 下方取得結果。

下列 Perfcompare 建構工具目前可用,並支援執行 fuchsia.git 的效能測試:

  • terminal.x64-release-perfcompare (近期建構):這會在 Intel NUC (x64) 上執行 fuchsia.git 的效能測試。這是 terminal.x64-release 建構工具的 Perfcompare 版本 (即執行與建構工具相同的效能測試組合)。

  • terminal.vim3-release-perfcompare (近期版本):這會在 VIM3 (ARM64) 上執行 fuchsia.git 的效能測試。這是 terminal.vim3-release 建構工具的 Perfcompare 版本。請注意,terminal.vim3-release 預設不會由 CQ 執行,因此它可能破壞了或比其他建構工具更高。

適用於整合.git CLs

integration.git CL 尚不支援 Perfcompare。

具體來說,如果 CL 在 Jiri 資訊清單檔案或 jiri.lock 檔案中變更依附元件,或使用 patches.json,則目前不支援 CL。這包括變更預先建構套件 (例如工具鍊滾動 CL) 的 CL。

在這類情況下,Perfcompare 並不知道該如何查看 CL 前後的原始碼和預先建構的二進位檔,因此在這些情況下會產生錯誤結果。這項作業會產生效能沒有任何變化,即使 CL 會改變效能也一樣。

輸出內容範例

以下是在簡易測試 CL 上執行 Perfcompare 輸出的一部分:

Summary counts:
  2939 test cases in total
  2938 test cases had no significant difference (no_sig_diff)
  1 test case got faster
  0 test cases got slower
  0 test cases added
  0 test cases removed

Results from test cases with differences:

Test case                                 Improve/regress?  Factor change  Mean before         Mean after
----------------------------------------  ----------------  -------------  ------------------  -----------------
fuchsia.microbenchmarks: ExampleNoOpLoop  faster            0.143-0.145    405.36 +/- 0.39 ns  58.49 +/- 0.30 ns

Results from all test cases:

Test case                                      Improve/regress?  Factor change  Mean before        Mean after
---------------------------------------------  ----------------  -------------  -----------------  -----------------
...
fuchsia.microbenchmarks: Syscall/ManyArgs      no_sig_diff       0.986-1.008    92.94 +/- 0.66 ns  92.65 +/- 0.40 ns
fuchsia.microbenchmarks: Syscall/Null          no_sig_diff       0.993-1.007    84.33 +/- 0.40 ns  84.31 +/- 0.19 ns
fuchsia.microbenchmarks: Thread/CreateAndJoin  no_sig_diff       0.950-1.034    34229 +/- 711 ns   33935 +/- 739 ns
fuchsia.microbenchmarks: TicksGet              no_sig_diff       0.981-1.022    19.77 +/- 0.19 ns  19.81 +/- 0.21 ns
...

測試 CL 堆疊與個別 CL 的差異

Perfcompare 建構工具會評估個別 CL 的成效影響,而「而非」CLs 堆疊的效能影響。

例如,假設您有 P1、P2、P3、P4、P5 的一系列 CL1,而 P1 是最早的 (也就是說,所有其他 CL 都依附於此)。如果您在 P3 上執行 Perfcompare,則「with CL」版本會包含 P1+P2+P3,而「不使用 CL」版本則僅包含 P1+P2。

  • 這樣做可評估尚未實現的測試案例受到的影響。您可以建立一個用來新增效能測試的 CL,以及變更軟體受測試軟體的後續追蹤 CL。若是針對第二個 CL 執行 Perfcompare,表示 CL 會如何影響新測試。
  • 如要評估修補程式堆疊的整體成效,做法之一是將變更壓縮到單一 Git 修訂版本 (例如使用 git merge --squash),然後將該修訂版本上傳至 Gerrit,然後對此執行效能比較。

「有 CL」和「不含 CL」版本

Perfcompare 建構工具會依序套用下列步驟,產生「使用 CL」和「不含 CL」版本:

  1. 請查看 Fuchsia 當前的 integration.git 小點修訂版本。
  2. 將此 CL 系列套用至結帳程序,最多包含接受測試的 CL。這會使用 git rebase,也就是 jiri patch
  3. 建立 Fuchsia。這樣即可建構「使用 CL」版本。
  4. 從結帳程序中取消套用最頂端的 CL (如有套用,先將先前的 CL 留在 CL 系列中)。方法是在套用 CL 系列的 Git 存放區中執行 git checkout HEAD^
  5. 再次建構 Fuchsia,執行漸進式建構作業。這樣即可建構「不含 CL」的版本。

步驟 1-3 與非 Perfcompare Fuchsia 試用建構工具相同。

限制

  • 如上所述,目前尚不支援使用 patches.json 或變更 Jiri 資訊清單檔案中的依附元件的 CL。

如何在本機執行效能比較

Perfcompare 建構工具會使用 perfcompare.py 比較效能結果。您可以使用 perfcompare.py 在本機執行效能測試 (也就是不使用 Fuchsia Infra),並比較結果。請參閱說明文件

如何下載原始成效結果

您可以下載 Perfcompare 建構工具執行作業產生的原始效能測試結果。如要修改 perfcompare.py 執行的分析,這就非常實用。步驟如下:

  1. 從 Perfcompare 建構的輸出屬性中找出 cas_instanceperfcompare_dataset_digest 欄位的值。這些資料可在建構作業的建構頁面上找到 (可從 Gerrit 程式碼審查的「Checks」分頁存取)。一般值的範例如下:

    • cas_instance="projects/chromium-swarm/instances/default_instance"
    • perfcompare_dataset_digest="3ff389154e02490f29e379564f7e70b3df66f74c3116ed50172cceec1e9d9888/165"

    如要從非 Perfcompare 版本下載結果資料,要使用的欄位名稱是 perf_dataset_digest,而非 perfcompare_dataset_digest

  2. 執行下列指令 (使用 Fuchsia 結帳頁面中的預先建構 cas 工具) 來下載資料集:

    ./prebuilt/tools/cas/cas download -cas-instance $CAS_INSTANCE -digest $DIGEST -dir $DEST_DIR
    
  3. 在已下載的資料集上執行 perfcompare.py

    python3 src/testing/perfcompare/perfcompare.py compare_perf $DEST_DIR/without_cl/ $DEST_DIR/with_cl/
    

請注意,RBE-CAS 系統只能保留資料約 2 至 3 個月,如果最近未執行該版本,下載指令就會失敗。(RBE-CAS 的目前存留時間 (TTL) 目前預設為 90 天)。