Node.js VM の計測

Node.js 用 New Relic APM は、Node.js の仮想マシン(V8) から重要なメトリックの時系列データを収集します。このメトリクスは、Node.js VM の動作を把握したり、アプリケーションのパフォーマンスを向上に役に立つ情報を提供します。また、エージェントは CPU メトリクスも収集します。これは、ガベージコレクション(GC) メトリクスと一緒に分析するとより役立ちます。

要件と互換性

ガベージコレクション、メモリ、CPU に関連した Node.js VM のメトリックの時系列データの収集に、追加でネイティブモジュールが必要となります。Node v6.1.0 では、エージェントが process.cpuUsage() を使って収集するため、CPU メトリックの収集にネイティブモジュールは必要はありません。

ネイティブモジュールは以下の環境で利用できます。

  • New Relic Node.js バージョン 1.35.1 以上
  • Node v0.12, v0.12, v4 以上
  • NPM v2.0.0 以上

ネイティブモジュールは、デプロイするプラットフォーム上でコンパイルする必要があります(node-gyp パッケージをご覧ください)。ネイティブの Node モジュールをインストールするための前提条件は以下のとおりです。

プラットフォーム 前提条件
Unix/Linux Python (v2.7 推奨), make, C/C++ コンパイラー (GCC 等)
Mac OS Python (v2.7 推奨), Xcode
Windows Python 2.7, Visual C++ ビルド環境

Node.js エージェントのインストールに問題がある場合は、インストールのトラブルシューティング手順に従ってください。

ネイティブモジュールのインストール

ネイティブモジュールをインストールする手順は以下の通りです。

  1. サポート対象の Node.js のバージョンがインストールされていることを確認してください。推奨事項: 最新の LTS バージョン(現在 v6)を使用してください。 @newrelic/native-metrics モジュール(0.12)の最小サポートバージョンより低いバージョンは使用しないでください。
  2. 現在利用可能なメトリクスをすべて取得するには、(newrelic モジュール) 1.37.0 以上のバージョンのエージェントを実行していることを確認してください。
  3. ネイティブメトリクスモジュールをインストールするには、以下の方法を利用してください。

    • npm install @newrelic/native-metrics --save コマンドを実行します。

      もしくは

    • アプリの package.json ファイルにモジュールを追加します。
  4. アプリを再起動します。

Node.js エージェントは、ネイティブメトリクスモジュールがインストールされていることを自動的に検出し、使用し始めます。

Node.js VM データの表示

Node.js VM データを含むキュレーションされたチャートを表示するには、rpm.newrelic.com/apm にアクセスしてアプリを選択し、Monitoring > Node VMs を選択します。詳しくは、Node.js VMs 統計ページをご覧ください。

New Relic APM - Node VMs page 2.png
rpm.newrelic.com/apm > (選択したアプリ) > Monitoring > Node VMs: VMs ページには、各サーバーの詳細な VM のパフォーマンスデータが表示されます。

データは、以下のように New Relic Insights の メトリックエクスプローラーからも利用できます。

  1. From insights.newrelic.com から、Data Explorer > Metrics を選択し、監視したいアプリを選択します。
  2. 利用可能なメトリクスを選択します。
nodejs-gc-metric-explorer.png
Insights > Data Explorer > Metrics: Insights Data Explorer を使った、ガベージコレクションの平均処理時間の時系列チャートの例です。

計測の詳細

Node の全バージョンですべてのデータを収集できるわけではありません。通常に、最新の LTS バージョンの Node を使用している場合、最も多くのデータが得られます。
ガーベッジコレクションの処理時間
利用可能: エージェント v1.35.1 以上。Node v0.12, v4 以上。@newrelic/native-metrics v1.0.0 以上

Node プロセスが(V8 で利用可能なすべてのタイプの)ガベージコレクションに費した時間。時間は、GC/System/Pauses のように累積メトリックとして測定され、GC/<type> としてガベージコレクションのタイプ別に分類されます。

利用可能なガーベッジコレクションのタイプ:

GC タイプ 説明
Scavenge 最も一般的なガベージコレクションのアルゴリズムです。Node は通常、VM がアイドル状態になるたびに、ここで紹介するアルゴリズムのどれかをトリガーします。
MarkSweepCompact V8 の中でも最も重いタイプのガベージコレクションです。この実行頻度が多い場合は、プロセス中のオブジェクトの数を減らしたり、V8 のヒープの上限を増やしたりほうがよいでしょう。
IncrementalMarking アプリの一時停止を短縮するために、アプリケーションロジック中にガーベッジコレクションを挟み込み、段階的に実施するガベージコレクションです。Node.js v6 以降のみ。
ProcessWeakCallbacks ガベージコレクションが発生すると、V8 は解放されたオブジェクトに対して登録済みの弱参照のコールバックを呼び出します。最初の弱いコールバックの開始から、指定されたガベージコレクションの最後まで計測します。Node.js v6 以降のみ。
メモリー
利用可能: エージェント v1.36.0 以上。Node v0.8, v0.10, v0.12, v4 以上

エージェントは、メモリー使用量に関連する以下のメトリクスを収集します。

メトリック 説明
Memory/Physical Node プロセスが使用する物理メモリの総量(単位:MB)。process.memoryUsage().rss Node API を使って記録されます。
Memory/Heap/Max Javascript オブジェクトを格納するために V8 が割り当てたヒープの総量(単位:MB)。process.memoryUsage().heapTotal Node API を使って記録されます。
Memory/Heap/Used アプリが現在使用している V8 ヒープ量(単位:MB)。 process.memoryUsage().heapUsed Node API を使って記録されます。
Memory/Heap/Free 割り当てられているが使用されていない V8 メモリの量(単位:MB)。派生メトリック (ヒープの合計 – ヒープの使用量)です。
Memory/NonHeap/Used V8 ヒープ以外のメモリー容量(単位:MB)。派生メトリック(rss – 合計ヒープ量)です。このメトリックは、バッファやストリームなど V8 ヒープ以外のメモリリークの検出に役立ちます。
CPU

利用可能:

  • Node >= v6.1.0。エージェント v1.34.0 以上
  • Node v0.12 – v6.0.0。エージェント v1.35.2 及び @newrelic/native-metrics v1.0.0 以上。

Node v6.1.0 以降を使っている場合、CPU メトリクスは process.cpuUsage() Node API を使って で収集されます。古いバージョンを使っている場合は、ネイティブモジュールをインストールする必要があります。インストールについては、ネイティブモジュールのインストールをご覧ください。

エージェントは、CPU に関連する以下のメトリクスを収集します。

メトリック 説明
CPU/User Time CPU がユーザーコードの実行に費やした時間。単位: 秒。
CPU/User/Utilization ユーザーコード(CPU/User Time)の実行にかかった時間をウォーククロックタイム(実時間)と論理プロセッサ数で割った値。
Node ランタイムは常に1つのコアのみを使用します。よって、このメトリックが報告する最大値は100をコア数で割った値になります。
CPU/System Time Node プロセスに関連したシステムカーネル処理に費やした CPU 時間。
CPU/System/Utilization システムカーネルの消費時間(CPU/System Time)をウォールクロックタイム(実時間)と論理プロセッサの数で割った値。

Node ランタイムは常に1つのコアのみを使用します。よって、このメトリックが報告する最大値は100をコア数で割った値になります。

イベントループ
利用可能: エージェント v1.37.0 以上。@newrelic/native-metrics v2.1.0 以上。Node v0.12, v4 以上

Node のイベントループ用のパフォーマンスメトリクス。イベントループのメトリクスを収集するには、追加でネイティブモジュールをインストールする必要があります。インストールについては、ネイティブモジュールのインストールをご覧ください。
エージェントは、以下のイベントループのメトリクスを収集します。

メトリック 説明
Nodejs/EventLoop/CPU/Usage 各イベントループの tick でアクティブに実行されたCPU時間の合計。アプリケーションのコールバックの実行だけでなく、ランタイム自体も含まれます。秒単位でデータは報告されます。
異常に長いイベントループ tick は、途切れのない同期処理が実行されていることを示しており、最適化の検討対象の候補となるものです。(再帰されている process.nextTick コールなど)。

関連情報

関連情報は以下のとおりです。