產品最新消息

提升 Android 效能:核心專用 AutoFDO 簡介

4 分鐘讀物
查看 Charles Munger 的個人資料
Yabin Cui 軟體工程師

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

什麼是 AutoFDO?

在標準軟體建構過程中,編譯器會根據靜態程式碼提示,做出數千項微小決策,例如是否內嵌函式,以及可能採用條件式的哪個分支。雖然這些經驗法則很有用,但並不一定能準確預測實際使用手機時的程式碼執行情況。

AutoFDO 則會使用實際執行模式來引導編譯器,這些模式代表程式碼在實際使用期間最常採用的指令執行路徑,系統會記錄 CPU 的分支記錄來擷取這些模式。雖然這類資料可從機群裝置收集,但對於核心,我們會在實驗室環境中使用代表性工作負載 (例如執行前 100 個最熱門的應用程式) 合成資料。我們使用取樣分析器擷取這項資料,找出程式碼中哪些部分是「熱」(經常使用),哪些是「冷」。使用這些設定檔重建核心時,編譯器就能根據實際的 Android 工作負載,做出更明智的最佳化決策。

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

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

實際效能優勢

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

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

boosting_2.png

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

運作方式:管道

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

boosting_3.png

步驟 1:收集設定檔

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

  • 工具和環境:我們使用最新的核心映像檔刷新測試裝置,並使用 simpleperf 擷取指令執行串流。這項程序仰賴硬體功能記錄分支歷程,特別是 Pixel 裝置上的  ARM Embedded Trace Extension (ETE) 和 ARM Trace Buffer Extension (TRBE)。
  • 工作負載:我們使用 Android 應用程式相容性測試套件 (C-Suite) 中前 100 名最熱門的應用程式,建構代表性的工作負載。為擷取最準確的資料,我們著重於:
    • 應用程式啟動:針對最明顯的使用者延遲進行最佳化
    • AI 輔助應用程式檢索:模擬連續、不斷變化的使用者互動
    • 系統全面監控:不只擷取前景應用程式活動,也擷取重要的背景工作負載和處理程序間通訊
  • 驗證:這項合成工作負載與從內部機群收集的執行模式有 85% 的相似度。
  • 目標資料:透過充分重複這些測試,我們能擷取高擬真度的執行模式,準確呈現使用者與最熱門應用程式的實際互動。此外,這個可擴充的架構能讓我們順暢整合其他工作負載和基準,擴大涵蓋範圍。

步驟 2:處理設定檔

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

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

步驟 3:測試設定檔

部署前,設定檔會經過嚴格驗證,確保能持續提升效能,且不會有穩定性風險。

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

持續更新

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

  • 定期更新:我們會在每次發布 GKI 前,更新 Android 核心 LTS 分支版本中的設定檔,確保每個版本都包含最新的設定檔資料。
  • 未來擴充:我們目前正在向 android16-6.12 和 android15-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 核心,確保 OS 的基礎架構能根據你每天使用裝置的方式進行最佳化。

繼續閱讀