問題タブ [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.

0 投票する
1 に答える
998 参照

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 カーネルの概念に飛び込みます。

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

0 投票する
0 に答える
339 参照

node.js - 共有ホスティング サーバーで Next.js アプリを起動すると ENOMEM エラーが発生する

TL;DR : spawn ENOMEMNext.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 アプリの要件を満たしていないという理由だけでしょうか?

間違った設定を適用したのか、いくつかの重要な設定を見落としたのか、このエラーを引き起こすコードを書き間違えたのかはわかりません。その下で何が起こっているのかを知りたい。十分な理解がないまま衝動的に計画をアップグレードするのは、初心者の開発者である私にとって良くありません。予算を有効に活用するのは私の責任です。

アドバイスをお願いできますか?

ご清聴ありがとうございました。