数か月間、実稼働 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 カーネルの概念に飛び込みます。
ご協力いただきありがとうございます !