Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
datadog-pgoを使用してCPUパフォーマンスを最大化する
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
moko-poi
February 26, 2025
410
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
datadog-pgoを使用してCPUパフォーマンスを最大化する
Japan Datadog User Group Meetup#7
https://datadog-jp.connpass.com/event/343144/
moko-poi
February 26, 2025
More Decks by moko-poi
See All by moko-poi
【OpsJAWS】DB系アップデートとAuroraサービスの紹介【re:Invent 2024 振り返り】
mokopoi
3
400
【Community LT】SRE Kaigi 2025 – More SRE!
mokopoi
3
170
FargateのCPU性能の違い
mokopoi
5
1.7k
サーバーレスで負荷試験!Step Functions + Lambdaを使ったk6の分散実行
mokopoi
6
2.9k
【2024年度 サイバーエージェント 新卒研修】システム運用の基本と戦略
mokopoi
81
59k
Featured
See All Featured
Information Architects: The Missing Link in Design Systems
soysaucechin
0
970
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
200
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Between Models and Reality
mayunak
4
330
A better future with KSS
kneath
240
18k
Accessibility Awareness
sabderemane
1
140
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Statistics for Hackers
jakevdp
799
230k
RailsConf 2023
tenderlove
30
1.5k
Abbi's Birthday
coloredviolet
2
8k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
290
Transcript
datadog-pgoを使用して CPUパフォーマンスを最大化する
自己紹介 @moko_poi SRE SRE Kaigi 2025 / OpsJAWS 2
PGO(Profile-Guided Optimization)とは 実行時のプロファイル情報を活用して、プログラムのパフォーマンスを最適化す る手法 コンパイル時にインライン化(Inlining)などで最適化 CPU使用率の削減 3
GolangでのPGOサポート Go 1.21以降、PGOが公式にサポート 1. pprof などを使用して、アプリケーションの実行時のプロファイルを収集 2. pgo フラグを使用して、プロファイルを活用したビルドを実行 go
build -pgo=./default.pgo -o optimized_binary ./main.go default.pgo ファイル(プロファイル情報)を使用して最適化されたバイナリを生成 4
プロファイルとは アプリケーション実行時の動作情報 例:CPUプロファイル、メモリプロファイルなど runtime/pprof や net/http/pprof を活用 5
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
プロファイル取得の難しさ 開発・テスト環境では本番の負荷や利用パターンを再現しづらい 正確なプロファイル取得には本番データが必要 ユーザーの使い方やアクセス集中により、CPUやメモリの負荷が変動し、ホット スポットが変化する 7
手動でプロファイルを取得するには、 環境設定やタイミングの調整が必要で、現実的に難しい場合がある... → Datadog Continuous Profiler 8
Continuous Profilerとは 本番環境でアプリケーションの CPU、メモリ、I/O の使用状況をリアルタイムに分 析できるプロファイリングツール 手動でのプロファイル取得の手間を削減し、本番環境の負荷を正確に把握できる 9
PGOとDatadog Continuous Profilerが組み合わせられれば... 10
datadog-pgo Datadog Continuous Profilerを活用して PGO を Go アプリケーションに統合するツール CPU使用率を最大14%削減できる 流れ
1. DatadogからCPU プロファイルを取得 2. default.pgo ファイルとして Go のビルドプロセ スに組み込む 3. アプリケーションの実行パフォーマンスを最適 化 https://github.com/DataDog/datadog-pgo 11
実際に使ってみる 12
1. 事前準備 Datadog APMとContinuous Profilerの効果を検証するために、以下のリポジトリを参考にして Goアプリケーションとインフラを構築しました。 https://github.com/DataDog/apm-tutorial-golang 13
Notes API の動作 メモの一覧取得 curl localhost:8080/notes メモの作成 curl -X POST
'localhost:8080/notes?desc=hello' インフラ 環境: AWS ECS Fargate タスクサイズ:1 vCPU, 2GB メモリ 14
2. APMの導入とContinuous Profilerの有効化 GolangでDatadog APMを導入する方法は 2通り あります。 1. 手動インスツルメンテーション コードに直接トレースを埋め込む方法
2. 自動インスツルメンテーション(Orchestrion) 設定のみで自動的にトレースが有効化される方法 今回は、チュートリアルに従い手動で導入しました。 15
APMの導入 Datadog APMを手動で導入するには、 dd-trace-go を使用します。 import ( ... "github.com/DataDog/dd-trace-go/ddtrace/tracer" )
func main() { // Datadog APM の初期化 tracer.Start() defer tracer.Stop() ... } 16
contribを利用したトレースの自動適用 Datadogの contrib ライブラリを利用すると、対応しているライブラリやフレームワークで は カスタムスパンを挟まなくても、自動で計測 できます。 contrib ライブラリ 対応フレームワーク/ライブラリ
net/http Go 標準の HTTP サーバー gorm.io/gorm GORM(GoのORM) gin-gonic/gin Gin(GoのWebフレームワーク) jmoiron/sqlx sqlx(拡張されたSQLライブラリ) 17
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
3. 負荷シナリオの作成 本シナリオは ramping-vus(段階的な仮想ユーザー増加) を採用し、以下のような負荷をシ ミュレートします。 時間 仮想ユーザー数 (VUs) 説明
0分 → 1分 0 → 5 徐々に負荷を増加(5 VUs まで) 1分 → 4分 5 → 10 負荷を継続的に増加(最大10 VUs) 4分 → 5分 10 → 0 負荷を減少(クリーンアップ) 19
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
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
5. 検証結果 22
before 23
after 24
改善効果 指標 Before (実行前) After (最適化後) 改善幅 CPU 使用率 22.8%
(228mcores) 17.1% (171mcores) 3.7% 削減 最適化後、CPU 使用率が 22.8% → 17.1% へ低減(約 3.7% 削減) 25
まとめ 大規模サービスでは、PGOの導入によりタスク数の削減やインスタンスタイプの ダウンサイジングが可能で、リソースの有効活用が期待できる すでに Datadog Continuous Profiler を導入している場合は、追加コストなく簡単に 適用できるため、積極的に活用すべき 26
Reference https://go.dev/doc/pgo https://www.datadoghq.com/ja/blog/datadog-pgo-go/ https://docs.datadoghq.com/profiler/guide/save-cpu-in-production-with-go-pgo/ https://github.com/DataDog/datadog-pgo?tab=readme-ov-file https://docs.datadoghq.com/tracing/guide/tutorial-enable-go-aws-ecs-fargate/ https://docs.datadoghq.com/ja/profiler/enabling/go/ 27