產品新訊

提升 Android 效能:推出核心的 AutoFDO

4 分鐘閱讀
Yabin Cui
軟體工程師

我們是 Android LLVM 工具鍊團隊。我們的首要任務之一,就是透過 LLVM 生態系統的最佳化技術,提升 Android 效能。我們不斷尋找各種方法,讓 Android 變得更快、更順暢且更有效率。雖然我們的大部分最佳化工作都在使用者空間中進行,但核心仍是系統的核心。我們很高興在今天分享如何將自動回饋導向最佳化 (AutoFDO) 導入 Android 核心,為使用者帶來顯著的效能提升。

什麼是 AutoFDO?

在標準軟體建構期間,編譯器會根據靜態程式碼提示做出數千個小決定,例如是否要內嵌函式,以及條件式的哪個分支較有可能採用。雖然這些啟發式方法很有用,但無法準確預測實際使用手機時的程式碼執行情形。

AutoFDO 會使用實際執行模式引導編譯器,藉此改變這種情況。這些模式代表程式碼在實際使用期間最常見的指令執行路徑,是透過記錄 CPU 的分支記錄擷取而來。雖然這項資料可以從車隊裝置收集,但我們會在實驗室環境中使用代表性工作負載 (例如執行前 100 大熱門應用程式) 合成核心資料。我們會使用取樣剖析器擷取這項資料,找出程式碼中「熱」的部分 (經常使用) 和「冷」的部分。使用這些設定檔重建核心時,編譯器可以根據實際的 Android 工作負載,做出更明智的最佳化決策。

如要瞭解這項最佳化作業的影響,請參考以下重要事實:

  • 在 Android 上,核心約占 CPU 時間的 40%。
  • 我們已使用 AutoFDO 最佳化使用者空間中的原生執行檔和程式庫,將應用程式冷啟動時間縮短約 4%,開機時間則減少 1%。

實際效能提升

我們運用受控實驗室環境的設定檔,發現 Android 主要指標有顯著改善。這些設定檔是透過應用程式檢索和啟動收集而來,並在 6.1、6.6 和 6.12 核心的 Pixel 裝置上測量。

以下列出最顯著的改善項目。如要瞭解這些核心版本的 AutoFDO 設定檔詳細資料,請參閱 android16-6.12android15-6.6 核心的 Android 核心存放區。

boosting_2.png

這些並非只是理論上的數字,這代表使用者能享有更流暢的介面、更快的應用程式切換速度、更長的電池續航力,以及整體反應更靈敏的裝置。

運作方式:管道

我們的部署策略包含複雜的管道,可確保設定檔保持相關性,並維持穩定的效能。

boosting_3.png

步驟 1:收集個人資料

雖然我們依賴內部測試車隊來分析使用者空間二進位檔,但已改用受控實驗室環境進行通用核心映像檔 (GKI) 測試。將剖析作業與裝置發布週期分離,可彈性地立即更新,不受已部署核心版本的影響。最重要的是,測試結果證實,與實際機群的資料相比,這項實驗室資料帶來的效能提升幅度相當。

  • 工具和環境:我們使用最新的核心映像檔刷新測試裝置,並使用 simpleperf 擷取指令執行串流。這項程序會利用硬體功能記錄分支記錄,具體來說,就是使用 Pixel 裝置上的  ARM 嵌入式追蹤擴充功能 (ETE)ARM 追蹤緩衝區擴充功能 (TRBE)
  • 工作負載:我們使用 Android 應用程式相容性測試套件 (C-Suite) 中最熱門的 100 個應用程式,建構代表性工作負載。為取得最準確的資料,我們著重於:
    • 應用程式啟動盡量減少使用者最容易注意到的延遲
    • AI 驅動的應用程式檢索模擬持續演進的使用者互動
    • 全系統監控:不僅擷取前景應用程式活動,也擷取重要的背景工作負載和程序間通訊
  • 驗證:這個合成工作負載與內部機群收集的執行模式,相似度高達 85%
  • 目標資料:重複執行這些測試,我們就能擷取高真實度的執行模式,準確呈現實際使用者與最熱門應用程式的互動情形。此外,這個可擴充的架構可讓我們順暢整合其他工作負載和基準,擴大涵蓋範圍。

步驟 2:處理設定檔

我們會後續處理原始追蹤資料,確保資料乾淨、有效,且可供編譯器使用。

  • 匯總:我們會將多項測試執行作業和裝置的資料匯總到單一系統檢視畫面。
  • 轉換: 我們會轉換原始追蹤記錄,使其符合 AutoFDO 設定檔格式,並視需要濾除不需要的符號。
  • 設定檔修剪:我們會修剪設定檔,移除「冷」函式的資料,讓設定檔使用標準最佳化功能。這樣可防止很少使用的程式碼發生迴歸,並避免二進位大小不必要地增加。

步驟 3:測試設定檔

在部署前,系統會對設定檔進行嚴格驗證,確保設定檔能穩定提升成效,且不會造成穩定性風險。

  • 設定檔和二進位檔分析:我們會嚴格比較新設定檔的內容 (包括熱門函式、樣本計數和設定檔大小) 與先前版本。我們也會使用設定檔建構新的核心映像檔,並分析二進位檔,確保文字區段的變更符合預期。
  • 效能驗證:我們會對新的核心映像檔執行目標基準測試。這表示該模型維持了先前基準所建立的效能提升幅度。

持續更新

程式碼會隨著時間自然「漂移」,因此靜態設定檔最終會失去效用。為維持最佳效能,我們會持續執行管道,定期更新:

  • 定期重新整理:我們會在每次 GKI 發布前,重新整理 Android 核心 LTS 分支中的設定檔,確保每個建構版本都包含最新的設定檔資料。
  • 未來擴展:我們目前正在為 android16-6.12android15-6.6 分支版本提供這些更新,並將支援範圍擴展至較新的 GKI 版本,例如即將推出的 android17-6.18

確保穩定性

使用特性指引最佳化時,常見的問題是這項技術是否會造成穩定性風險。由於 AutoFDO 主要影響編譯器啟發式方法 (例如函式內嵌和程式碼版面配置),而非變更原始碼的邏輯,因此可保留核心的功能完整性。這項技術已大規模驗證多年,是 Android 平台程式庫、ChromeOS 和 Google 伺服器基礎架構的標準最佳化方式。

為進一步確保行為一致,我們採用「預設保守」策略。未在精確度高的設定檔中擷取的函式,會使用標準編譯器方法進行最佳化。這可確保核心中「冷」或很少執行的部分,行為與標準建構版本完全相同,避免效能回歸或在極端情況下發生非預期行為。

未來計畫

我們目前正在 android16-6.12 和 android15-6.6 分支版本中部署 AutoFDO。除了這次的初步推出,我們也看到幾種很有前景的途徑,可進一步提升這項技術:

  • 擴大觸及範圍:我們期待將 AutoFDO 設定檔部署至較新的 GKI 核心版本,以及目前 aarch64 支援以外的其他建構目標。
  • GKI 模組最佳化:目前最佳化作業的重點是主要核心二進位檔 (vmlinux)。將 AutoFDO 擴展至 GKI 模組,可為更多核心子系統帶來效能優勢。
  • 供應商模組支援:我們也希望支援使用驅動程式開發套件 (DDK) 建構的供應商模組 AutoFDO。我們的建構系統 (Kleaf) 和剖析工具 (simpleperf) 已支援這項功能,因此供應商可以將這些最佳化技術套用至特定硬體驅動程式。
  • 涵蓋範圍更廣的設定檔:可從更多關鍵使用者歷程 (CUJ) 收集設定檔,進而進行最佳化。

我們將 AutoFDO 導入 Android 核心,確保作業系統的基礎架構能根據您日常使用裝置的方式進行最佳化。

撰寫者:

繼續閱讀