遅いトレースやエンドポイントを調査する

本番環境においてアプリケーションのパフォーマンスに問題がある場合、分散型トレーシングとプロファイリングによるコードスタックトレースのベンチマークを統合することで、パフォーマンスのボトルネックを特定する強力な方法となります。APM 分散型トレーシングと Continuous Profiler の両方が有効になっているアプリケーションプロセスは、自動的にリンクされます。

Code Hotspots タブでスパン情報からプロファイリングデータに直接移動し、パフォーマンス問題に関連する特定のコード行を見つけることができます。同様に、低速でリソースを消費するエンドポイントも、プロファイリング UI で直接デバッグできます。

遅いトレースのコードのホットスポットを特定する

Code Hotspots tab shows profiling information for a APM trace span

前提条件

Linux と macOS で Node.js サービスのプロファイリングを有効にすると、Code Hotspots の識別がデフォルトで有効になります。Windows ではこの機能は利用できません。

dd-trace-js のバージョン 5.0.0 以降、4.24.0 以降または 3.45.0 以降が必要です。

The new timeline feature is enabled by default in dd-trace-js 5.11.0+, 4.35.0+, and 3.56.0+.

スパン実行の内訳

各トレースのビューから、選択したスパンの範囲内のプロファイリングデータが Code Hotspots タブに表示されます。

左側の値は、選択されたスパンの間にそのメソッド呼び出しに費やされた時間を表します。ランタイムと言語によって、カテゴリーは異なります。

  • CPU は、CPU タスクの実行にかかった時間を示します。Node.js experimental CPU プロファイラーで収集されたプロファイルにのみ表示されます。
  • Uncategorized は、CPU 実行以外のスパン実行に要した時間を表示します。

Click the plus icon + to expand the stack trace to that method in reverse order. Hover over the value to see the percentage of time explained by category.

Span execution timeline view

Code Hotspots tab has a timeline view that breakdown execution over time and threads

Timeline ビューは、スパンの期間における時間ベースのパターンと作業分布を表示します。

スパンの Timeline ビューでは、次のことが可能です。

  • 時間のかかるメソッドを分離する。
  • スレッド間の複雑な相互作用を整理する。
  • Surface runtime activity that impacted the request.

ランタイムや言語によって、レーンは異なります。

Node.js でこの機能を有効にする方法については、前提条件を参照してください。

JavaScript のスレッドには 1 つのレーンがあります。

上のレーンはガベージコレクターのランタイムアクティビティで、リクエストに余分なレイテンシーを追加する可能性があります。

プロファイルをトレースから閲覧する

Opening a view of the profile in a flame graph

For each type from the breakdown, click Open in Profiling to see the same data opened up in a new page. From there, you can change the visualization to a flame graph. Click the Focus On selector to define the scope of the data:

  • Span & Children は、選択したスパンと同じサービス内のすべての子孫スパンにプロファイリングデータをスコープします。
  • Span only は、プロファイリングデータをあらかじめ選択されたスパンにのみスコープします。
  • Span time period は、スパンがアクティブだった期間中のすべてのスレッドにプロファイリングデータをスコープします。
  • Full profile は、データのスコープを以前に選択されたスパンを実行したサービスプロセス全体の 60 秒に設定します。

コードのパフォーマンスを API エンドポイントごとに分解する

前提条件

Linux と macOS で Node.js サービスのプロファイリングを有効にすると、エンドポイントプロファイリングがデフォルトで有効になります。Windows ではこの機能は利用できません。

dd-trace-js のバージョン 5.0.0 以降、4.24.0 以降または 3.45.0 以降が必要です。

エンドポイントプロファイリング

エンドポイントプロファイリングは、Web サービスの任意のエンドポイントでフレームグラフをスコープし、遅いエンドポイント、レイテンシーが多いエンドポイント、エンドユーザーエクスペリエンスが悪い原因となっているエンドポイントを見つけることができます。これらのエンドポイントは、デバッグが難しく、なぜ遅いのかを理解するのが困難な場合があります。遅い原因は、エンドポイントが多くの CPU サイクルを消費するなど、意図しない大量のリソースを消費している可能性があります。

エンドポイントプロファイリングを利用すると、以下のことが可能になります。

  • エンドポイント全体のレスポンスタイムを遅くしているボトルネックとなるメソッドを特定する。
  • CPU、メモリ、例外などの貴重なリソースを消費する上位のエンドポイントを切り分ける。これは、一般的にパフォーマンスを向上させるためにサービスを最適化しようとしている場合に特に役立ちます。
  • サードパーティのコードやランタイムライブラリが、エンドポイントの速度低下やリソース消費の重さの原因になっているかどうかを把握する。
Troubleshooting a slow endpoint by using endpoint aggregation

Surface code that impacted your production latency

In the APM Service page, use the information in the Profiling tab to correlate a latency or throughput change to a code performance change.

この例では、レイテンシーが、以下のコードによって引き起こされる/GET train でのロック競合の増加とどのようにリンクしているかがわかります。

Thread.sleep(DELAY_BY.minus(elapsed).toMillis());

Track endpoints that consume the most resources

CPU やウォールタイムなどの貴重なリソースを消費している上位のエンドポイントを追跡することは価値があります。このリストは、エンドポイントが回帰していないか、あるいは新たに導入したエンドポイントが大幅にリソースを消費してサービス全体の速度を低下させていないかどうかを確認するのに役立ちます。

The following image shows that GET /store_history is periodically impacting this service by consuming 20% of its CPU and 50% of its allocated memory:

Graphing top endpoints in terms of resource consumption

リクエストごとの平均リソース消費量の追跡

Per endpoint call を選択すると、トラフィックが時間の経過とともに変化しても、動作の変化を確認できます。これは、プログレッシブロールアウトのサニティチェックや日々のトラフィックパターンの分析に役立ちます。

The following example shows that CPU per request increased for /GET train:

参考資料