InfoQ ホームページ ニュース Uberがプロファイルガイド最適化でパフォーマンス向上
Uberがプロファイルガイド最適化でパフォーマンス向上
2025年4月18日 読了時間 4 分
作者:
翻訳者
プロファイルガイド最適化(PGO)はランタイムデータを使用してコンパイラの判断を支援することで、アプリケーションのパフォーマンスを向上させる強力な技術として登場した。最近の実装例ではUberがGoogleと協力してGolangにPGOを統合し、自社サービス群全体で大幅なパフォーマンスの向上とリソースの節約を実現した。
PGOは従来の静的解析と比べて、実際のランタイム動作を利用してよりスマートなコンパイラ判断をする。典型的な実行時の実行プロファイルを収集することでPGOはホットコードパスを特定し、以下のような技術によって最適化する。
- 呼び出し頻度に基づくインテリジェントな関数インライン化
- コードとデータレイアウトの改善によるローカリティの向上
- レジスタ割り当てと命令スケジューリングの強化
- 実行パス最適化のための基本ブロック再配置
UberのGoプロファイリングインフラストラクチャ GoのためのUberプロファイリングインフラストラクチャ
UberにおけるPGO実装はいくつかの主要フェーズ:プロファイリング、分析、再コンパイルを包含している。最初にアプリケーションの典型的な実行時にランタイムプロファイリングデータが収集される。このデータは最適化の機会を特定するために分析され、最適化されたバイナリを生成するために再コンパイルプロセスで適用される。C++、Rust、Java、Swiftなどの言語は以前からPGOをサポートしてきたが、Goへの統合は比較的最近のことだ。UberはGoogleと協力してGoへのPGOサポートを導入し、バージョン1.20でPGO駆動のインライン化を導入、バージョン1.21で仮想関数呼び出しの最適化を追加した。
PGOを継続的な最適化フレームワークにシームレスに組み込むため、Uberは体系的なプロセスを確立した。
- 日次プロファイル収集:典型的プロファイルを作成するため、複数のインスタンスから継続的にプロファイリングデータを収集する。
- サービス別登録:設定システムはPGOのために特定サービスを登録し、ターゲットを絞った最適化を保証する。
- 継続的インテグレーション(CI)テスト:PGOソフトウェア開発キット(SDK)はCIテストを経て変更を検証し、安定性を維持する。
- デプロイメント:検証後、PGO最適化されたサービスが本番環境にデプロイされる。
- パフォーマンスモニタリング:パフォーマンスダッシュボードがサービスに対するPGOの影響を監視し、継続的な評価を可能にする。
PGOを実装中に直面した重要な課題はビルド時間の増加であり、一部のサービスでは最大8倍の遅延が発生した。これはコンパイル時にプロファイリングデータの解析に膨大な時間がかかることが主原因だった。この問題に対処するためUberは、実行時のプロファイリングデータを抽出し、コールグラフを構築し、コンパイル時に使用するためにこの情報をキャッシュするプロファイル前処理ツールを開発した。この前処理によりビルド時間が大幅に短縮され、開発者にとってPGOの統合が現実的なものとなった。
PGOのパフォーマンスへの影響は合成ベンチマークと実世界のサービス評価を用いて評価された。Goで広く使用されているJSONライブラリgo-jsonの場合、ベンチマークで以下の結果が示された:
- Goのgo-jsonライブラリでは命令トランスレーションルックサイドバッファ(iTLB)のミスを30%削減した。
- 最適化されたインライン化により4%のパフォーマンス向上。
- Uberのトップサービス全体で必要なCPUコアが24,000個減少し、大幅なコスト削減につながった。
他にもいくつかのテクノロジー企業がGoアプリケーションのパフォーマンスを向上させるためにプロファイルガイド最適化(PGO)を採用している。Cloudflare はGoベースのサービスにPGOを統合し、本番環境からCPUプロファイルを収集してコンパイラの最適化を導き、CPU使用量の削減とパフォーマンスの向上を実現している。同様にDatadogはGoアプリケーションを最適化するためにPGOを採用し、Goコンパイラの最適化判断に情報提供するためにプロファイリングデータを活用することで、本番環境で最大14%のCPU節約を達成している。Grafana Labs はオープンソースの継続的プロファイリングプラットフォームであるGrafana Pyroscopeと連携したPGOを採用し、Goアプリケーションを最適化している。この統合はリアルタイムのパフォーマンス分析を提供し、開発者が非効率を特定し、ピークパフォーマンスに対してコード実行を最適化できるようにしている。
要約すると、UberがGoプログラミング環境にプロファイルガイド最適化を統合したことで大幅なパフォーマンス改善がもたらされた。プロファイリングデータを体系的に収集し、ビルド時間を短縮するために前処理を行い、ターゲットとなるコンパイラ最適化を適用することで、Uberはサービスの効率性を向上させた。この取り組みはリソース利用の最適化におけるPGOの可能性を示すだけでなく、ソフトウェアパフォーマンスエンジニアリングにおけるコラボレーションとイノベーションのベネフィットをハイライトしている。
-
関連記事
-
関連スポンサーコンテンツ
特集コンテンツ一覧
InfoQ ニュースレター
毎週火曜日に前週のまとめコンテンツをお送りいたします。(日本語版は不定期リリース)25万人のシニアな開発者コミュニティーにぜひご参加ください。 サンプルを見る