Upgrade to Pro — share decks privately, control downloads, hide ads and more …

実運用で考える PGO

実運用で考える PGO

38tter(株式会社ナレッジワーク)

20205/9/1開催「golang.tokyo #40」での登壇資料です
https://golangtokyo.connpass.com/event/365231/

=セッション概要=
Go 1.21 で正式にリリースされたプロファイルに基づく最適化(PGO) についてご紹介し、実運用での応用例を考えます。

More Decks by KNOWLEDGE WORK / 株式会社ナレッジワーク

Other Decks in Technology

Transcript

  1. © Knowledge Work Inc. 2 • 宮⽥聖也 (38tter) • ソフトウェアエンジニア@ナレッジワーク

    • Golang, Ruby が好き • 趣味:🍺🍺🍺, ⚽ (󰧹, 󰎼), 🎸, 📷 ⾃⼰紹介
  2. © Knowledge Work Inc. PGO - Profile Guided Optimization 3

    3 プロファイルに基づく最適化 • 実⾏時にどのようにコードが実⾏されるかをコンパイラに 伝える コンパイラはそれを基に最適化 • Go 1.21 から正式に導⼊
  3. © Knowledge Work Inc. そもそもコンパイラ最適化とは 4 4 • インライン展開 •

    エスケープ解析 • ゼロサイズ最適化 • ゼロクリア最適化 • キャスト最適化 , … etc.
  4. © Knowledge Work Inc. 仮説 6 6 • よくある Web

    サービスの バックエンド開発 • RDB への CRUD 処理がメイン • I/O バウンドな処理が多い • コンパイラ最適化がどこまで有効? • 効率化の程度はアプリケーションの特性による のでは??
  5. © Knowledge Work Inc. 検証の流れ: Go アプリケーション + プロファイラ +

    負荷測定ツール 7 7 1. プロファイルなしでビルドしたアプリケーションを 起動 a. Cloud Run 2. 負荷テストし、プロファイル収集 a. k6 b. Cloud Profiler 3. プロファイルを使ってアプリケーションをビルド 4. 再び負荷テスト 5. メトリクスを⽐較 a. CPU 使⽤率、リクエスト処理時間
  6. © Knowledge Work Inc. 検証: Google Run + Cloud Profiler

    8 8 Cloud Run で Go アプリケーションを起動 • runtime は Go 1.25 • 最⼤インスタンス数を固定 auto scale しないように... • 性質の異なる処理を⾏うエンドポイント CPU バウンド I/O バウンド Cloud Profiler でプロファイル収集 • CPU バウンドな処理のみ叩く • I/O バウンドな処理のみ叩く プロファイルを使って再ビルドし、最適化の影響を⾒る • CPU 使⽤率、リクエスト処理時間
  7. © Knowledge Work Inc. 検証: CPU バウンドな処理 10 10 •

    素数判定アルゴリズムの実⾏ • エンドポイントを公開 • 負荷測定を⾏う 100 RPS を 1 分間
  8. © Knowledge Work Inc. 検証: CPU バウンドな処理 13 13 CPU

    使⽤率, リクエスト時間ともに約 10 % 削減 プロファイラなし, 100 RPS, 1 min プロファイラあり, 100 RPS, 1 min
  9. © Knowledge Work Inc. 検証: I/O バウンドな処理 14 14 •

    I/O がボトルネックになる処理 • エンドポイントを公開 • 外部ストレージ上のテキストファイルの読み込み • Cloud Storage 上の 10 MB のファイル • 負荷測定を⾏う 5 RPS を 1 分間
  10. © Knowledge Work Inc. 検証: I/O バウンドな処理 15 15 ストレージとの通信の

    ハンドラの処理は CPU 時間の⼀部 GC 外部ストレージ との通信
  11. © Knowledge Work Inc. 検証: I/O バウンドな処理 16 16 プロファイラなし,

    5 RPS, 1 min プロファイラあり, 5 RPS, 1 min CPU 使⽤率, リクエスト時間ともに 10 - 20 % 程度悪化
  12. © Knowledge Work Inc. まとめ 17 17 • Go はビルド時にプロファイラを指定することで、コンパイラ最適化が可能

    main パッケージディレクトリに default.pgo があると⾃動的に PGO は有効 プロファイルの収集はアプリケーション実⾏時に⾏う(e. g. Cloud Profiler) • PGO がアプリケーションの処理の効率化に寄与するかどうかはボトルネックとなる処理による CPU 時間を圧迫するのか、I/O 処理が⽀配的なのか...