The Monitor

Datadog Continuous Profiler で実環境でのコードパフォーマンスを分析

10 min read

Share article

Datadog Continuous Profiler で実環境でのコードパフォーマンスを分析
Kai Xin Tai

Kai Xin Tai

分散トレース、ランタイムメトリクス、ログ分析、Synthetic モニタリング、リアルユーザーモニタリングに加え、より迅速に、そして簡単にパフォーマンスの問題をトラブルシューティングできる新たなアプリケーションデベロッパー用ツールが完成しました。ここに、常時接続型の本番環境コードプロファイラー、Continuous Profiler をご紹介します。Profiler を使用すると、最小限の付帯コストで環境全体のパフォーマンスをコードレベルで分析できます。プロファイルにより、CPU やメモリーなどリソースを最も消費している関数 (またはコード行数) が明らかになるため、これらを最適化することでエンドユーザーレイテンシーおよびクラウドプロバイダーの両方のコストを削減できます。

Datadog で、以下を実現できるようになりました。

すべてのスタックトレースを一つの管理画面で可視化する

Continuous Profiler を使用すると、プログラムが本番環境でどのように実行されるか監視できるため、Java の OutOfMemoryError 例外やロック競合など、実際の条件下で発生するパフォーマンスの問題を効率的に診断して解決することができます。同時に、知らぬ間にアプリケーションに不要な付帯コストを追加しているコード行数を表面化できる可能性もあります。

Continuous Profiler は、分析対象が自分のコードか、サードパーティライブラリかにかかわらず、すべてのスタックトレースの典型的なサンプルを収集し、フレームグラフとして可視化します。各バーは関数を表し、プログラムの実行中に呼び出された順番で上から下へ垂直方向に並べられます。上記の Java プロファイルでは、各フレームの幅はリソースの消費量に相当し、色でパッケージを識別しています。

これらのスタックトレースを調査することで、関数がコールされるさまざまな方法を理解することができるうえ、どの関数がリソースを最も消費しているか把握できます。アプリケーションのスケールを拡大する際は、リソースを消費しているコードセクションを最適化することで、エンドユーザーレイテンシーとインフラストラクチャーコストを大幅に削減できます。使用しているプログラムの言語によっては、CPU、メモリー割り当て、ロック、I/O をはじめとするさまざまなプロファイルタイプを調査できます。

コードのボトルネックをすばやく見つける

本番環境のワークロードは複雑で、ボトルネックの発生箇所を特定するのは簡単ではありません。Datadog はプロファイルを集計し、全体的なリソース消費の把握、およびコード内のホットスポットの発見をサポートします。これにより、最大規模のパフォーマンス改善が見込まれる箇所を優先的に最適化することが可能となります。(上に示す通り) CPU の使用状況を調査している場合、右パネルのサマリーテーブルを使用して、CPU 時間または収集されたサンプル数の降順でソートされたパッケージ、メソッド、スレッドの一覧を確認することができます。また、フレームグラフにフィルターを適用して関連するコールスタックのみを表示させ、コード内の対象のセクションを最適化する方法を特定することも可能です。

プロファイルの集計は現在非公開ベータ版です。こちらからアクセス権限をリクエストできます。

タグを使用してプロファイルに的を絞る

サービスやバージョンなど、さまざまな要素でプロファイルにフィルターを設定し、検索対象を絞り込みます。
サービスやバージョンなど、さまざまな要素でプロファイルにフィルターを設定し、検索対象を絞り込みます。

Continuous Profiler は常時接続するよう設計されているため、サービス停止などの一刻を争う状況でも、ダウンタイム前および最中に保存されたプロファイルを取得して効率的に問題をデバッグできます。プロファイルの検索ビューではすべてのプロファイルが一つの管理画面で表示されるため、特定のホスト、サービス、バージョン、あるいはその組み合わせなど、タグを使ってプロファイルのさまざまな側面をすばやく詳細に解明できます。また、サイドバーのコントロールを使用すると、プロファイルを最大 CPU や最大メモリー消費量で絞り込めます。プロファイルをクリックすると、スタックトレースのフレームグラフが表示され、さらに詳細なビューをひと目で確認できます。

プロファイルと分散トレースの相関性を理解する

Continuous Profiler の開発時は、その他の Datadog プラットフォームと密に連携できることを特に考慮しました。分散トレースと APM はすべてのサービスにおける個別リクエストのパスを追跡し、ボトルネックを生み出している、またはエラーの原因となっているステップを特定します。APM で特に遅いリクエストを調査する場合、クリック 1 つで関連するプロファイルを分析し、そのリクエストのリソースのボトルネックを特定できます。同様に、プロファイル内でリソースを最も消費するリクエストを特定して APM で調査し、より大きな視野から見たリクエストの状況 (例 : 他にはどのようなサービスがこのリクエストでコールされたか) や、ビジネスにどのような影響を与えるか (例 : リソースを最も多く使用しているカスタマーは誰か) などを把握することができます。

パフォーマンスの改善に役立つ実用的な分析情報を得る

Datadog はコードの発見的分析を自動的に実施し、分析ビューの上部に主な問題個所のサマリーを表示します。下記の例では、行き詰まっているスレッド、非効率的なガベージコレクション、メモリーリークに対処することでパフォーマンスを最大限改善できることがわかります。さらに詳しい分析情報として、コードキャッシュ、クラスローディング、ヒープなどのカテゴリー別に内訳された完全なデータを見ることができます。

分析ビューでは、アプリケーションのパフォーマンス改善に集中して取り組む必要のある問題領域の一覧を確認できます。
分析ビューでは、アプリケーションのパフォーマンス改善に集中して取り組む必要のある問題領域の一覧を確認できます。

長期的なパフォーマンス傾向を追跡する

Continuous Profiler は、個々のマシンに繰り返しアクセスしなくても、すべてのホストから常時データを収集して長期的なパフォーマンスの傾向を監視できる非常に効果的な方法です。プロファイルのメトリクスタブでは、メソッドごとのトップ CPU 使用量、スレッドごとのトップメモリー割り当て、フェーズごとのガベージコレクションなど、主要メトリクスの概要を取得できます。

メトリクスタブでは、すべてのホストにおける主要メトリクスのグラフを見ることができます。
メトリクスタブでは、すべてのホストにおける主要メトリクスのグラフを見ることができます。

すべてのグラフに共通してプロファイル時間が表示されるため、発生している問題が新規のものか反復的かを確認し、適切なアクションを取ることができます。さまざまなメトリクスを相互に関連付けることで、アプリケーションのパフォーマンスに関するより包括的な見解が得られます。また、興味深い傾向を発見した場合は、カスタムダッシュボードにグラフを追加したり、メトリクスがクリティカルなしきい値を超えて増減した時にチームに通知するアラートを作成したりできます。

Datadog Continuous Profiler でコードのパフォーマンスを最適化

本番環境でプロファイリングを開始する

Continuous Profiler を APM および分散トレースログ管理リアルユーザーモニタリングネットワークパフォーマンスモニタリングSynthetic モニタリングと併用すれば、より一層可視性を高めることができるため、本番環境コードのパフォーマンスの改善やクラウドインフラストラクチャーコストの削減に役立ちます。Continuous Profiler は Java、Python、Go に対応しています (Node.js、Ruby、.NET に対応、PHP には近日対応予定)。Datadog のインフラストラクチャー監視をまだご使用でない場合は、14 日間のに今すぐご登録ください。

Related Articles

Making profiling visualizations accessible to engineers at all levels

Making profiling visualizations accessible to engineers at all levels

Investigate memory leaks and OOMs with Datadog's guided workflow

Investigate memory leaks and OOMs with Datadog's guided workflow

Trace your applications end to end with Datadog and OpenTelemetry

Trace your applications end to end with Datadog and OpenTelemetry

How to spot and fix memory leaks in Go

How to spot and fix memory leaks in Go

Start monitoring your metrics in minutes