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

CI/CD に PGO を組み込んだ話 / How to enable PGO in CI/CD

CI/CD に PGO を組み込んだ話 / How to enable PGO in CI/CD

layerx.go #1 の登壇資料です。
日時: 2024/07/4 (木) 19:00 〜 21:00
URL: https://layerx.connpass.com/event/319314/

Shota Iwamatsu

July 04, 2024
Tweet

More Decks by Shota Iwamatsu

Other Decks in Programming

Transcript

  1. 関数のインライン展開 コンパイラ最適化の1つ。 関数呼び出しを関数本体に置き換える。 func main() { a := 1 b

    := 2 c := a + b // 関数呼び出しが関数本体に置き換えられた。 fmt.Println(c) } func sum(a, b int) int { return a + b }
  2. Go で PGO を適用する方法 Go 1.21 で正式リリースされた。 main パッケージに default.pgo

    という名前で CPU プロファイルを配置すれば、自動的に適用される。 go build -pgo=/tmp/foo.pprof で任意のファイルを指定することも可能。 プロファイルは pprof のフォーマットに則っている必要がある。 公式ドキュメント曰く 2~14% のパフォーマンス向上が見込める。
  3. Datadog Continuous Profiler Datadog がライブラリを提供している。 既に Datadog を利用している場合は簡単に導入できる。 import (

    "gopkg.in/DataDog/dd-trace-go.v1/profiler" ) func main() { err := profiler.Start( profiler.WithService("<SERVICE_NAME>"), profiler.WithEnv("<ENVIRONMENT>"), profiler.WithVersion("<APPLICATION_VERSION>"), // ... ) if err != nil { log.Fatal(err) } defer profiler.Stop() // ... }
  4. datadog-pgo を使う Datadog が提供している、プロファイルを DL する CLI ツール。 直近72時間で CPU

    使用量が大きいプロファイルを5個選出し、マージしてくれる。 時間と個数はコマンドライン引数で調整可能。 go build の実行前に datadog-pgo を実行するだけで、CI/CD に PGO を組み込める。 export DD_API_KEY=xxx export DD_APP_KEY=xxx go run github.com/DataDog/datadog-pgo@latest 'service:foo env:prod' ./cmd/foo/default.pgo # datadog-pgo により default.pgo が作成されているので、ビルド時に PGO が適用される。 go build ./cmd/foo/...
  5. CPU 使用率が平均13.5%減少した! メトリクスの計算式: ((CPU 使用率 / 1週間前の CPU 使用率) -1)

    * 100 PGO 適用後3日間について、上記メトリクスの平均値が-13.5%だった。