問題タブ [enomem]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - 仮想メモリの使用量が多いために発生する Node.js の ENOMEM
数か月間、実稼働 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 カーネルの概念に飛び込みます。
ご協力いただきありがとうございます !
node.js - 共有ホスティング サーバーで Next.js アプリを起動すると ENOMEM エラーが発生する
TL;DR : spawn ENOMEM
Next.js アプリをビルドして共有ホスティング サーバーで実行しようとすると、エラーが発生しました。共有ホスティング サーバーには、900 MB を超える RAM と 70 以上のプロセスが利用可能でした。エラーがキャッチされたとき、ログは RSS サイズが 50814976 であることを示しました。
エラーが単にメモリ不足が原因なのか、設定や構成が正しくないために発生したのかはよくわかりません。アドバイスをお願いできますか?
==========詳細は以下============
私は Node.js を使用して Next.js アプリを構築しています。これはカスタム サーバー (私のエントリ ポイント: server.js ) を使用して構築されています。localhost:3000 のローカル環境でアプリを実行できます。次に、ネットワーク上で問題がないかどうかを確認するために展開してみます。
Node.js 環境をサポートするように最適化されたA2 Hosting の DRIVE Web Shared Hosting Planに加入しました。プランで提供されるのは、1GB の物理メモリと 75 の利用可能なプロセスです。
私のアプリケーションは、cPanelのSetup Node.js App機能によって作成され、SSH 経由で git を使用してプロジェクトをサーバーに複製しました。NPM パッケージも、コマンドを使用してサーバーにインストールされましたnpm install
。ノードのバージョンはv.12.9.1
で、npm のバージョンは でした6.14.8
。
私の npm スクリプトは、カスタム サーバーを実行するように定義されています。私のpackage.jsonファイルで定義されたnpmスクリプトは次のとおりです。
次に、コマンドを使用して.nextnpm run build
フォルダーに本番アプリケーションを作成しましたが、すぐにエラーが発生しました。spawn ENOMEM
私はそれがメモリ使用量に関連する問題であることをグーグルで調べました。メモリが不足しているときにこのエラーが発生したと言う人もいましたが、これを回避するための回避策は、運用フォルダーをローカルに構築してサーバーにアップロードすることでした. というわけで、手順をコピーしました。
ただし、コマンドを実行したときの結果はイライラしましたnpm run start
。エラーENOMEM
はまだここにあり、コマンドを入力してから 1 秒もかからずに表示されました。
npm キャッシュのクリーニングと npm モジュールの再インストールも機能していないようです。
--max-old-space-size
コマンドにオプションを追加してメモリ制限を増やしてみましたNODE_ENV=production node --max-old-space-size=1024 server.js
; 残念ながら、これは機能していないようで、ENOMEM
まだポップアップしています。
console.log(process.memoryUsage())
エラーがキャッチされたときの使用法を表示するために追加しましたが、これが結果でした:
RSS の合計サイズが制限をはるかに下回りました。それとも、メモリ消費量を検査する方法を間違えたのでしょうか?
どうすればENOMEM
問題を解決できますか? エラーは正確に何によって引き起こされますか?利用可能な RAM が next.js アプリの要件を満たしていないという理由だけでしょうか?
間違った設定を適用したのか、いくつかの重要な設定を見落としたのか、このエラーを引き起こすコードを書き間違えたのかはわかりません。その下で何が起こっているのかを知りたい。十分な理解がないまま衝動的に計画をアップグレードするのは、初心者の開発者である私にとって良くありません。予算を有効に活用するのは私の責任です。
アドバイスをお願いできますか?
ご清聴ありがとうございました。