3

数か月間、実稼働 Node.js (v12) アプリで ENOMEM エラーが発生しています。

私のヒープは常に 100MB の範囲にあり、時間が経っても増加しないため、この問題の診断は特に困難でした。したがって、ノードのメモリ リークが発生する可能性はほとんどありません。

ただし、VIRT メモリ使用量 (top cmd で報告) が 15 ~ 20GB に達することがあり、そのときにノードが「spawn: enomem」エラーをスローし始めます。

私が見る限り、ヒープが100MBで安定しているにもかかわらず、何かがノードに大量の仮想メモリを予約させています。また、ノードデビューツールではヒープの検査しかできないため、それが何であるかを診断できません。

私はこの問題に 100 時間近く費やしてきたので、洞察や助けをいただければ幸いです。

私は試した:

  • 手動設定 --max-old-space-size
  • サーバーの RAM を増やす
  • サーバーに SWAP を追加し、ドッカーがその SWAP を使用できるようにする
  • Chrome 開発ツールを使用したノード ヒープの検査
  • Docker コンテナのメモリ制限を設定する
  • 別のプロセス マネージャーへの移行 (supervisord ではなく pm2)
  • すべてのパッケージをアップグレードし、ノードの最新の LTS バージョンを使用する
  • ノード ENOMEM のすべての Google の結果を読んで理解する
  • 特にヒープと GC に関して、ノードがメモリ プールを管理する方法を理解する。
  • 仮想メモリ、予約メモリ、スワップメモリ​​、共有メモリの Linux カーネルの概念に飛び込みます。

ご協力いただきありがとうございます !

4

1 に答える 1