node.jsの正しい「max-old-space-size」を決定するにはどうすればよいですか?


99

パラメータに基づいてNode.jsがどのように動作するかを理解するのに問題がありますmax-old-space-size

たとえば、私の場合、2つのt2.smallAWSインスタンス(2GBのRAM)を実行しています。

理由はmax-old-space-size=4096わかりませんが、設定しました(4GB)。この場合、ノードは何をしますか?この構成により、メモリ割り当てが失敗する可能性がありますか?

max-old-space-sizeサーバーリソースに基づいての正しい値を決定するにはどうすればよいですか?

私のアプリケーションは絶えずメモリ使用量を増やしており、ノード内部に関するすべてを理解しようとしています。


8
これでビューがかなり静かになっていることがわかったので、コメントを追加します。NodeJSアプリにメモリリークがないが、ガベージコレクターが起動しないことに気付くのに、丸1週間かかりました。t2.microやt2.smallインスタンスなどのメモリが少ないシステムではこれに注意してください。RAMが使用できないため、サーバーがクラッシュします。
ボルジャンテ2018年

ガベージコレクターを起動させる方法はありましたか?
ZG1 0119

@Borjanteなぜガベージコレクターが実行されなかったのですか?
神聖な

2
構成されたmax-old-space-sizeには、マシンに搭載されているRAMの合計量よりも高い制限がありました。
ボルジャンテ

--optimize-for-sizeメモリ使用量を減らすことを試みる価値があります。
コンスタンチノス

回答:


135

「古いスペース」は、V8のマネージド(ガベージコレクション)ヒープ(つまり、JavaScriptオブジェクトが存在する場所)の最大かつ最も構成可能なセクションであり、--max-old-space-sizeフラグはその最大サイズを制御します。メモリ消費量が制限に近づくと、V8は未使用のメモリを解放するためにガベージコレクションにより多くの時間を費やします。

ヒープメモリの消費量(つまり、GCが解放できないライブオブジェクト)が制限を超えると、V8はプロセスをクラッシュさせます(代替手段がないため)。したがって、設定を低くしすぎないようにします。もちろん、設定が高すぎると、V8で許可される追加のヒープ使用量により、システム全体のメモリが不足する可能性があります(代替手段がないため、ランダムプロセスをスワップまたは強制終了します)。

要約すると、2GBのメモリを搭載したマシンで--max-old-space-sizeは、他の用途のためにメモリを残し、スワッピングを回避するために、おそらく約1.5GBに設定します。


6
それはまさに私が答えを得るために望んでいたことであり、システムまたはノードのいずれかがメモリを使い果たしたエッジケースを説明しています。
ボルジャンテ2018年

2
@jmrk:あなたは完全に正しいようですが、2GBのRAMと4GBのスワップを使用して「--max-old-space-size」を4GBに設定すると、ノードプロセスはすべてのRAMメモリを消費し、1.9GBでスタックします。質問はここにあります「なぜスワップは使用を避けるのですか??」(ノードバージョン8.11.1)
Manish Trivedi 2018年

1
フラグは他のものをオーバーライドする必要があります。タイプミスがないか再確認してください。
jmrk

2
From d8 --help--max-old-space-size (max size of the old space (in Mbytes))
jmrk

21

2020年の更新

これらのオプションは現在、ノードによって公式に文書化されています。2GBのマシンの場合、おそらく次のものを使用する必要があります。

NODE_OPTIONS=--max-old-space-size=1536

使用量を決定するにはを使用して、Linuxマシンで使用可能なメモリを確認できますfree -m。破棄できるように、freebuffers/cacheメモリを組み合わせて使用できることに注意してくださいbuffers/cache(これらのバッファとキャッシュは、他の方法では未使用のメモリを使用するための優れた方法です)。

言及のため公式文書にmax-old-space-size注意してください:

2GBのメモリを搭載したマシンでは、これを1536(1.5GB)に設定することを検討してください。

したがって、上記の値。ベースOSに必要なメモリの量はそれほど変わらないので、4GBのマシンなどで3.5を問題なく実行できることを考慮してください。


2
Node.jsドキュメントから共有したリンクから、「2GBのメモリを搭載したマシンでは、これを1536(1.5GB)に設定することを検討してください」
IdanDagan20年

1
@IdanDaganに感謝します。それを答えに追加します。
mikemaccana

11

このエラーは、実行中のアプリケーションに割り当てられたメモリが必要なメモリより少ない場合に発生します。デフォルトでは、Node.jsのメモリ制限は512MBです。この量を増やすには、メモリ制限引数を設定する必要があります—-max-old-space-size。これは、メモリ制限の問題を回避するのに役立ちます。

node --max-old-space-size=1024 index.js #increase to 1gb
node --max-old-space-size=2048 index.js #increase to 2gb
node --max-old-space-size=3072 index.js #increase to 3gb
node --max-old-space-size=4096 index.js #increase to 4gb
node --max-old-space-size=5120 index.js #increase to 5gb
node --max-old-space-size=6144 index.js #increase to 6gb
node --max-old-space-size=7168 index.js #increase to 7gb
node --max-old-space-size=8192 index.js #increase to 8gb

https://medium.com/@vuongtran/how-to-solve-process-out-of-memory-in-node-js-5f0de8f8464c


そしてそれは割り当てられたRAMメモリ以上でなければなりません
HD ..

これがもう本当かどうかはわかりません。確かに、実行中のノード10.20.1にアクセスできる1つのシステムではnode --v8-options、報告されたデフォルトが4096であり、max-old-space-size実行中のテストスイートを設定せずに最大1.5Gbが問題なく割り当てられていることがわかります。リンクされている中程度の記事は2016年のものであるため、執筆以来状況が進んでいる可能性があります。
JaySeeAre

1
その裏付けを見つけるのは難しいです。V8またはNodeのドキュメントに明示的なものが見つかりません。私が持っている別のシステムは、v10、12、14のデフォルトを0として報告しています。FWIW最近のブロガーが最大メモリを1.5Gbと述べているのを見つけました(tejom.github.io/general/nodejs/v8/debugging/2017/ 01/16 /…)そしてそのv12はシステムに基づいた動的最大値を持っています(idginsiderpro.com/article/3257673/…)。
JaySeeAre

4
node -e "console.log(`node heap limit = ${require('v8').getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)"- > v12.18.0とv14.3.0 - > 2096Mb、v10.20.1 - > 1432Mb
JaySeeAre

2
@JaySeeAre 、heap_size_limit。を表示するコマンドをありがとう。通常のUNIXシェルでは、それは違っ引用符で囲む必要があります:node -e 'console.log(`node heap limit = ${require("v8").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)'
サム・ワトキンス

-9

作業中のプロジェクトからそれを機能させたいだけの場合は、次の2つの手順に従います。

  1. プロジェクトで、cd to node_module / @ angular cd node_module / @ angular

  2. 次に、以下のコマンドを実行しますexport NODE_OPTIONS = -max-old-space-size = 8192


18
環境変数を設定するために@angularディレクトリに移動する必要があるのはなぜですか?
mgamsjager
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.