ヒーププロファイラの使用

ヒーププロファイラは V8 の上で動作し、時間経過に伴う割り当てをキャプチャします。このドキュメントでは、以下の方法を用いたメモリプロファイリングについて説明します。

  1. 割り当てタイムライン
  2. サンプリングヒーププロファイラ

ヒープスナップショットの使用ガイドで説明したヒープダンプとは異なり、リアルタイムプロファイリングを使用する目的は、一定期間にわたる割り当てを理解することです。

ヒーププロファイラ - 割り当てタイムライン

ヒーププロファイラはサンプリングヒーププロファイラに似ていますが、すべての割り当てを追跡する点が異なります。サンプリングヒーププロファイラよりもオーバーヘッドが大きいため、本番環境での使用は推奨されません。

プロファイラをプログラムで開始・停止するには @mmarchini/observe を使用できます。

方法

アプリケーションを起動します

node --inspect index.js

スクリプトには --inspect-brk の方が適しています。

Chrome で DevTools インスタンスに接続し、次に

  • Memory タブを選択します。
  • Allocation instrumentation timeline を選択します。
  • プロファイリングを開始します。

heap profiler tutorial step 1

ヒーププロファイリングが実行されたら、メモリの問題を特定するためにサンプルを実行することを強くお勧めします。例えば、Web アプリケーションのヒーププロファイリングを行う場合、Apache Benchmark を使用して負荷を生成できます。

$ ab -n 1000 -c 5 https://:3000

そして、負荷が完了したら停止ボタンを押します

heap profiler tutorial step 2

最後に、スナップショットデータを確認します

heap profiler tutorial step 3

メモリに関する用語の詳細については、役立つリンクのセクションを確認してください。

サンプリングヒーププロファイラ

サンプリングヒーププロファイラは、時間経過に伴うメモリ割り当てパターンと予約された領域を追跡します。サンプリングベースであるため、オーバーヘッドが十分に低く、本番システムで使用できます。

ヒーププロファイラをプログラムで開始・停止するには、モジュール heap-profiler を使用できます。

方法

アプリケーションを起動します

$ node --inspect index.js

スクリプトには --inspect-brk の方が適しています。

DevTools インスタンスに接続し、次に

  1. Memory タブを選択します。
  2. Allocation sampling を選択します。
  3. プロファイリングを開始します。

heap profiler tutorial 4

ある程度の負荷を生成し、プロファイラを停止します。すると、スタックトレースに基づいた割り当てのサマリーが生成されます。ヒープ割り当てが多い関数に注目できます。以下の例を参照してください。

heap profiler tutorial 5