サービスに関する最新情報

Android のパフォーマンスを向上: カーネル向け AutoFDO の導入

所要時間: 4 分
Charles Munger さんのプロフィールを表示
Yabin Cui ソフトウェア エンジニア

私たちは Android LLVM ツールチェーン チームです。Google の最優先事項の一つは、LLVM エコシステムの最適化手法を通じて Android のパフォーマンスを向上させることです。Google は、Android をより高速で、よりスムーズに、より効率的にする方法を常に模索しています。最適化作業の多くはユーザースペースで行われますが、カーネルは依然としてシステムの中心です。本日は、Automatic Feedback-Directed Optimization(AutoFDO)を Android カーネルに導入し、ユーザーに大幅なパフォーマンス向上をもたらす方法についてご紹介します。

AutoFDO とは

標準的なソフトウェア ビルドでは、コンパイラは静的コードのヒントに基づいて、関数をインライン化するかどうか、条件分岐のどちらが選択される可能性が高いかなど、何千もの小さな決定を行います。これらのヒューリスティックは有用ですが、実際のスマートフォン使用時のコード実行を常に正確に予測できるわけではありません。

AutoFDO は、実際の実行パターンを使用してコンパイラをガイドすることで、この状況を変えます。これらのパターンは、実際の使用中にコードがたどる最も一般的な命令実行パスを表し、CPU の分岐履歴を記録することでキャプチャされます。このデータはフリート デバイスから収集できますが、カーネルについては、上位 100 の人気アプリの実行など、代表的なワークロードを使用してラボ環境で合成します。このデータを取得するためにサンプリング プロファイラを使用し、コードのどの部分が「ホット」(頻繁に使用される)で、どの部分が「コールド」かを特定します。これらのプロファイルを使用してカーネルを再ビルドすると、コンパイラは実際の Android ワークロードに合わせて、よりスマートな最適化の決定を行うことができます。

この最適化の影響を理解するために、次の重要な事実を考慮してください。

  • Android では、カーネルが CPU 時間の約 40% を占めています。
  • Google はすでに AutoFDO を使用して、ユーザースペースのネイティブ実行可能ファイルとライブラリを最適化しており、コールド アプリの起動を約 4% 改善し、起動時間を 1% 短縮しています。

実環境でのパフォーマンスの向上

管理されたラボ環境のプロファイルを利用することで、Android の主要な指標が大幅に改善されました。これらのプロファイルは、アプリのクロールと起動を使用して収集され、6.1、6.6、6.12 カーネルを搭載した Google Pixel デバイスで測定されました。

最も顕著な改善点は次のとおりです。これらのカーネル バージョンの AutoFDO プロファイルの詳細については、android16-6.12 カーネルと android15-6.6 カーネルのそれぞれの Android カーネル リポジトリをご覧ください。

boosting_2.png

これらは単なる理論上の数字ではありません。これにより、インターフェースの応答性が向上し、アプリの切り替えが高速化され、バッテリー駆動時間が延び、エンドユーザーにとってデバイス全体の応答性が向上します。

仕組み: パイプライン

Google のデプロイ戦略には、プロファイルの関連性を維持し、パフォーマンスを安定させるための高度なパイプラインが含まれています。

boosting_3.png

ステップ 1: プロファイルの収集

ユーザー空間バイナリのプロファイリングには内部テストフリートを使用していますが、汎用カーネル イメージ(GKI)については、管理されたラボ環境に移行しました。プロファイリングをデバイスのリリース サイクルから切り離すことで、デプロイされたカーネル バージョンに関係なく、柔軟かつ即時に更新できます。重要なのは、このラボベースのデータが、実際のフリートと同等のパフォーマンス向上をもたらすことがテストで確認されていることです。

  • ツールと環境: 最新のカーネル イメージをテストデバイスに書き込み、simpleperf を使用して命令実行ストリームをキャプチャします。このプロセスは、分岐履歴を記録するハードウェア機能に依存しており、具体的には、Google Pixel デバイスの  ARM Embedded Trace Extension(ETE)と ARM Trace Buffer Extension(TRBE)を利用しています。
  • ワークロード: Android アプリ互換性テストスイート(C-Suite)で最も人気のある上位 100 個のアプリを使用して、代表的なワークロードを構築します。最も正確なデータを取得するために、Google は以下の点に重点を置いています。
    • アプリの起動: ユーザーが最も認識しやすい遅延を最適化する
    • AI を活用したアプリ クローリング: 連続的で進化するユーザー インタラクションをシミュレート
    • システム全体のモニタリング: フォアグラウンド アプリのアクティビティだけでなく、重要なバックグラウンド ワークロードやプロセス間通信もキャプチャします。
  • 検証: この合成ワークロードは、Google の内部フリートから収集された実行パターンと 85% の類似性を示しています。
  • ターゲット データ: これらのテストを十分に繰り返すことで、最も人気のあるアプリケーションでの実際のユーザー インタラクションを正確に表す、忠実度の高い実行パターンをキャプチャします。さらに、この拡張可能なフレームワークにより、追加のワークロードとベンチマークをシームレスに統合して、カバレッジを拡大できます。

ステップ 2: プロファイルの処理

未加工のトレースデータを後処理して、クリーンで効果的、かつコンパイラで使用できる状態にします。

  • 集約: 複数のテスト実行とデバイスのデータを 1 つのシステムビューに統合します。
  • 変換: 未加工のトレースを AutoFDO プロファイル形式に変換し、必要に応じて不要なシンボルを除外します。
  • プロファイルのトリミング: プロファイルをトリミングして「コールド」関数のデータを削除し、標準の最適化を使用できるようにします。これにより、あまり使用されないコードの回帰を防ぎ、バイナリサイズが不必要に増加するのを回避できます。

ステップ 3: プロファイルのテスト

デプロイ前に、プロファイルは厳格な検証を受け、安定性のリスクなしに一貫したパフォーマンスの向上が実現されることが確認されます。

  • プロファイルとバイナリの分析: 新しいプロファイルの内容(ホット関数、サンプル数、プロファイル サイズなど)を以前のバージョンと厳密に比較します。また、このプロファイルを使用して新しいカーネル イメージをビルドし、バイナリを分析して、テキスト セクションの変更が想定どおりであることを確認します。
  • パフォーマンス検証: 新しいカーネル イメージでターゲットを絞ったベンチマークを実行します。これにより、以前のベースラインで確立されたパフォーマンスの改善が維持されていることを確認します。

継続的な更新

コードは時間の経過とともに自然に「ドリフト」するため、静的プロファイルは最終的に効果を失います。ピーク時のパフォーマンスを維持するため、パイプラインを継続的に実行して定期的な更新を推進しています。

  • 定期的な更新: 各 GKI リリースの前に Android カーネル LTS ブランチのプロファイルを更新し、すべてのビルドに最新のプロファイル データが含まれるようにします。
  • 今後の拡張: 現在、これらのアップデートは android16-6.12 ブランチと android15-6.6 ブランチに提供されています。今後は、近日リリース予定の android17-6.18 など、新しい GKI バージョンにもサポートを拡張する予定です。

安定性の確保

プロファイルに基づく最適化に関してよくある質問は、安定性のリスクが生じるかどうかです。AutoFDO は、ソースコードのロジックを変更するのではなく、関数のインライン化やコード レイアウトなどのコンパイラ ヒューリスティックに主に影響するため、カーネルの機能の整合性が維持されます。このテクノロジーはすでに大規模な環境で実証されており、Android プラットフォーム ライブラリ、ChromeOS、Google 独自のサーバー インフラストラクチャの標準的な最適化として長年使用されています。

一貫した動作をさらに保証するために、「デフォルトで保守的」な戦略を適用しています。高忠実度プロファイルでキャプチャされていない関数は、標準のコンパイラ メソッドを使用して最適化されます。これにより、カーネルの「コールド」部分(実行頻度の低い部分)が標準ビルドとまったく同じように動作し、パフォーマンスの低下や、まれなケースでの予期しない動作を防ぐことができます。

今後の展望

現在、android16-6.12 ブランチと android15-6.6 ブランチに AutoFDO をデプロイしています。この初期リリース以降も、この技術をさらに強化するための有望な手段がいくつかあります。

  • リーチの拡大: Google は、AutoFDO プロファイルを新しい GKI カーネル バージョンと、現在の aarch64 サポート以外の追加のビルド ターゲットにデプロイすることを楽しみにしています。
  • GKI モジュールの最適化: 現在、最適化はメインのカーネル バイナリ(vmlinux)に重点を置いています。AutoFDO を GKI モジュールに拡張することで、カーネル サブシステムのより多くの部分にパフォーマンス上のメリットをもたらすことができます。
  • ベンダー モジュールのサポート: Driver Development Kit(DDK)を使用してビルドされたベンダー モジュールについても、AutoFDO のサポートを検討しています。Google のビルドシステム(Kleaf)とプロファイリング ツール(simpleperf)ですでにサポートされているため、ベンダーはこれらの最適化手法を特定のハードウェア ドライバに適用できます。
  • プロファイル カバレッジの拡大: より幅広いクリティカル ユーザー ジャーニー(CUJ)からプロファイルを収集して最適化できる可能性があります。

AutoFDO を Android カーネルに導入することで、OS の基盤が、ユーザーのデバイスの日常的な使用方法に合わせて最適化されるようになります。

作成者:
続きを読む