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

datadog-pgoを使用してCPUパフォーマンスを最大化する

moko-poi
February 26, 2025
5

 datadog-pgoを使用してCPUパフォーマンスを最大化する

Japan Datadog User Group Meetup#7
https://datadog-jp.connpass.com/event/343144/

moko-poi

February 26, 2025
Tweet

Transcript

  1. net/http/pprof でプロファイルを取得 セットアップ import _ "net/http/pprof" /debug/pprof/ アクセスしてプロファイル取得 CPUプロファイルを取得(60秒間) curl

    -o profile.pprof http://localhost:8080/debug/pprof/profile?seconds=60 pprofで可視化(ブラウザ表示) go tool pprof -http=:8081 profile.pprof Frame Graphについてはこちらがおすすめ->https://deeeet.com/writing/2016/05/29/go-flame-graph/ 6
  2. datadog-pgo Datadog Continuous Profilerを活用して PGO を Go アプリケーションに統合するツール CPU使用率を最大14%削減できる 流れ

    1. DatadogからCPU プロファイルを取得 2. default.pgo ファイルとして Go のビルドプロセ スに組み込む 3. アプリケーションの実行パフォーマンスを最適 化 https://github.com/DataDog/datadog-pgo 11
  3. Notes API の動作 メモの一覧取得 curl localhost:8080/notes メモの作成 curl -X POST

    'localhost:8080/notes?desc=hello' インフラ 環境: AWS ECS Fargate タスクサイズ:1 vCPU, 2GB メモリ 14
  4. 2. APMの導入とContinuous Profilerの有効化 GolangでDatadog APMを導入する方法は 2通り あります。 1. 手動インスツルメンテーション コードに直接トレースを埋め込む方法

    2. 自動インスツルメンテーション(Orchestrion) 設定のみで自動的にトレースが有効化される方法 今回は、チュートリアルに従い手動で導入しました。 15
  5. Continuous Profilerの有効化 導入方法は、APMと同時に profiler.Start() を呼び出すだけです。 import ( "log" "gopkg.in/DataDog/dd-trace-go.v1/profiler" )

    func main() { // Continuous Profiler の開始 err := profiler.Start( // Datadog のサービス名を指定 profiler.WithService("notes"), // 収集するプロファイルの種類を指定(デフォルトはCPU & Heap ) profiler.WithProfileTypes( profiler.CPUProfile, // CPU 使用率 profiler.HeapProfile, // メモリヒープの使用量 // 以下はデフォルトでは無効になっているが、必要に応じて有効化可能 profiler.BlockProfile, // Goroutine のブロック時間 profiler.MutexProfile, // Mutex の競合状況 profiler.GoroutineProfile, // Goroutine の実行状態 ), ) if err != nil { log.Fatal(err) } defer profiler.Stop() // メイン処理 18
  6. 3. 負荷シナリオの作成 本シナリオは ramping-vus(段階的な仮想ユーザー増加) を採用し、以下のような負荷をシ ミュレートします。 時間 仮想ユーザー数 (VUs) 説明

    0分 → 1分 0 → 5 徐々に負荷を増加(5 VUs まで) 1分 → 4分 5 → 10 負荷を継続的に増加(最大10 VUs) 4分 → 5分 10 → 0 負荷を減少(クリーンアップ) 19
  7. k6 スクリプト import http from 'k6/http'; import { check }

    from 'k6'; export const options = { discardResponseBodies: true, // 応答ボディを破棄してメモリ消費を抑える scenarios: { contacts: { executor: 'ramping-vus', // 仮想ユーザー数を段階的に増加 startVUs: 0, // 初期VUs stages: [ { duration: '1m', target: 5 }, // 1 分かけて 5 VUs に増加 { duration: '3m', target: 10 }, // さらに 3 分間かけて 10 VUs に増加 { duration: '1m', target: 0 }, // 1 分で負荷をゼロに戻す ], gracefulRampDown: '0s', // VUs を即座に終了 }, }, }; const BASE_URL = ''; export default function () { // 新しいノートを作成 let res = http.post(`${BASE_URL}/notes?desc=MyNote`); check(res, { 'POST /notes status is 201': (r) => r.status === 201, }); // ノート一覧を取得 res = http.get(`${BASE_URL}/notes`); check(res, { 'GET /notes status is 200': (r) => r.status === 200, }); } 20
  8. 4. datadog-pgo の導入 ステップ 1: APIキーとアプリケーションキーを作成 ステップ 2: 環境変数を設定 export

    DD_API_KEY="<your_api_key>" export DD_APP_KEY="<your_app_key>" export DD_SITE="<your_site>" ステップ 3: default.pgo の生成 go run github.com/DataDog/datadog-pgo@latest "service:notes" ./cmd/notes/default.pgo ステップ 4: default.pgo の自動検出 21
  9. 改善効果 指標 Before (実行前) After (最適化後) 改善幅 CPU 使用率 22.8%

    (228mcores) 17.1% (171mcores) 3.7% 削減 最適化後、CPU 使用率が 22.8% → 17.1% へ低減(約 3.7% 削減) 25