メモリ

このドキュメントでは、メモリ関連の問題をデバッグする方法について学ぶことができます。

プロセスのメモリが不足する

Node.js (JavaScript) はガベージコレクション言語であるため、リテイナーによってメモリリークが発生する可能性があります。Node.js アプリケーションは通常、マルチテナントで、ビジネスクリティカルであり、長時間実行されるため、メモリリークを見つけるためのアクセスしやすく効率的な方法を提供することが不可欠です。

また、メモリを微調整して特定の結果を得ることもできます。詳細については、メモリの理解とチューニング をご覧ください。

症状

ユーザーは、メモリ使用量が継続的に増加し続け(速い場合も遅い場合もあり、数日あるいは数週間にわたる)、その後プロセスがクラッシュし、プロセスマネージャーによって再起動されるのを観測します。プロセスは以前よりも遅く実行されている可能性があり、再起動によって一部のリクエストが失敗します(ロードバランサーが502を返す)。

副作用

  • メモリ枯渇によりプロセスが再起動し、リクエストが破棄される
  • GC アクティビティの増加により CPU 使用率が高まり、応答時間が遅くなる
    • GC がイベントループをブロックし、遅延を引き起こす
  • メモリスワップの増加がプロセスを遅くする(GC アクティビティ)
  • ヒープスナップショットを取得するための利用可能なメモリが不足する可能性がある

プロセスのメモリ利用が非効率である

症状

アプリケーションが予期せぬ量のメモリを使用している、および/またはガベージコレクタのアクティビティが活発になっているのが観測されます。

副作用

  • ページフォールト数の増加
  • GC アクティビティと CPU 使用率の上昇

デバッグ

ほとんどのメモリ問題は、特定の種類のオブジェクトがどれだけのスペースを占有しているか、そしてどの変数がそれらのガベージコレクションを妨げているかを特定することで解決できます。また、プログラムの割り当てパターンを時系列で把握することも役立ちます。