Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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
480
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
430
【Community LT】SRE Kaigi 2025 – More SRE!
mokopoi
4
190
FargateのCPU性能の違い
mokopoi
7
2.1k
サーバーレスで負荷試験!Step Functions + Lambdaを使ったk6の分散実行
mokopoi
6
3k
【2024年度 サイバーエージェント 新卒研修】システム運用の基本と戦略
mokopoi
81
61k
Featured
See All Featured
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
530
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
Evolving SEO for Evolving Search Engines
ryanjones
0
290
Site-Speed That Sticks
csswizardry
13
1.5k
Unsuck your backbone
ammeep
672
58k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
540
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
We Are The Robots
honzajavorek
0
380
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
From π to Pie charts
rasagy
1
370
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