ループプロセススナップショットを使用してNode.jsのイベントループアクティビティを調べ、イベントループをブロックしているCPU時間が長い関数を特定できます。
Node.jsイベントループの待機時間
Node.js プロセスのイベントループは、着信接続をポーリングし、すべてのアプリケーションコードを実行する単一スレッドです。Node.js リクエストによって外部データベース、リモートサービス、またはファイルシステムが呼び出されると、イベントループはアプリケーションの制御フローを他のタスク(他の接続やコールバックを含む)に自動的に割り当てます。
CPU集約型オペレーションはイベントループをブロックするため、イベントループで受信リクエストの処理や既存のリクエストの完了ができなくなります。あるビジネストランザクションの CPU 集約型オペレーションによって、別のビジネストランザクションで遅延が発生する可能性があります。
Splunk AppDynamics でのプロセススナップショット
プロセススナップショットは、インストゥルメント化されたNode.jsノードにおけるCPUプロセスのインスタンスを表します。これにより、構成可能な時間範囲におけるNode.jsプロセスの、プロセス全体のフレームグラフが生成されます。
プロセススナップショットは、プロセススナップショットの期間中にすべてのビジネストランザクションで発生した Node.js イベントループを可視化します。プロセススナップショットは、待機時間の原因が別のビジネストランザクションに含まれる CPU 集約型オペレーションであるために、主なトラブルシューティング ツール(ビジネス トランザクション スナップショットなど)で結論が得られない場合に便利です。プロセススナップショットのリストを使用して、CPU 時間の長いプロセスを特定できます。CPU をブロックしているコードの関数を正確に特定するプロセススナップショットをリストから選択し、調査できます。
特定の Node.js ノードまたはティアに関して、ノードまたはティアダッシュボードの [Process Snapshots] タブからプロセススナップショットのリストを確認できます。プロセス スナップショット リストにフィルタを使用して、必要なスナップショットのみを表示することも可能です。実行時間、スナップショットがアーカイブ済みかどうか、リクエストの GUID により絞り込むことができます。ティアダッシュボードからリストにアクセスする場合は、ノードごとにフィルタを使用できます。
プロセススナップショットの生成方法と構成方法については、「Node.jsプロセススナップショットの管理」を参照してください。
プロセススナップショットとビジネス トランザクション スナップショットの作成方法については、「プロセススナップショットおよびビジネストランザクションスナップショット」を参照してください。
プロセススナップショットは、通常14日間有効です。アーカイブすると永久に閲覧可能になります。
プロセススナップショットには、以下のタブが含まれます。
- 概要
- Flame Graph
- Call Graph
- Allocation Call Graphs
- Hot Spots
概要
スナップショットの概要です。コンテンツは表示可能な情報により異なります。
通常、少なくとも実行時間合計、プロセスのティアとノード、タイムスタンプ、最も遅れているメソッドおよび要求GUIDが含まれます。
Flame Graph
プロセススナップショット期間中のCPUに対する各スタックフレームの頻度を可視化します。最底部のスタックに対するフレームの相対的な位置は、コールスタックの深さを表しています。
フレームグラフには、コールグラフと同じ情報が含まれていますが、他のメソッドより多くのCPUリソースを消費しているメソッドをすばやく特定できます。
フレームグラフの上端にあるスタックフレームに対応するメソッドは、メソッドの CPU リソースの消費頻度を表します。
長時間の CPU 実行を特定するには、フレームグラフの上端にある水平方向に長いセルを探します。
正常な Node.js プロセスでは、CPU をブロックするアクティビティが最小限です。これに対応して、正常な Node.js プロセスのフレームグラフには、上端に沿って水平方向の長さが最小限のセルが表示されます。「Flame Graph」を参照してください。
Call Graph
合計実行時間と、プロセスのコールスタックにある各メソッドの合計実行時間における割合を示します。メソッドの最後にある数字は、ソースコードの行番号です。一定時間以下のメソッドをフィルタリングしてグラフを単純化し、問題点を特定することができます。
[Time] および [Percentage] の列で、実行に最も時間がかかるコールを特定できます。
コールに関する詳細は、コールを選択して [Details] をクリックすると確認できます。
Allocation Call Graph
手動で収集されたプロセススナップショットでのみ利用可能です。詳細については、Node.jsプロセススナップショットの管理を参照してください。
プロセススナップショット中にプロセスのコールスタックにある各メソッドにより割り当てられたメモリ容量とその割合、および開放されなかったメモリ容量とその割合を示します。[Method Size] スライダーを使用して、割り当てコールグラフに表示するためにメソッド内に割り当てが必要なメモリ容量を構成できます。また、特定のメモリ容量を消費するメソッドをフィルタリングしてグラフを単純化し、問題点を絞り込むことができます。
[Size] および [Percentage] の列で、最も多くのメモリを消費しているコールを特定できます。
エージェントは、割り当てスナップショット開始前に行われた割り当てを報告することはできません。
スナップショットで報告される割り当ては、スナップショットの終了時にまだ参照されているメモリです。スナップショット期間中に割り当てられるメモリ容量からスナップショット期間中に開放されるメモリ量を引いた値となります。
コールに関する詳細は、コールを選択して [Details] をクリックすると確認できます。
Hot Spots
このタブには、最も高価なコールを先頭にして実行時間の順にコールが表示されます。下のパネルで単一コールの呼び出しに関する追跡情報を表示するには、上のパネルでコールを選択します。
右上の [Method Time] スライダーを使用して、コールがホットスポットと見なされる速度を構成します。