Node.js empfahl "max-old-space-size"

95

Ich habe einige Probleme zu verstehen, wie sich Node.js basierend auf dem Parameter verhält max-old-space-size.

In meinem Fall t2.smallführe ich beispielsweise zwei AWS-Instanzen aus (2 GB RAM).

Ich weiß nicht warum, aber ich habe eingestellt max-old-space-size=4096(4 GB). Was macht der Knoten in diesem Fall? Könnte diese Konfiguration zu einem möglichen Speicherzuordnungsfehler führen?

Wie bestimme ich den korrekten Wert max-old-space-sizebasierend auf den Serverressourcen?

Meine Anwendung erhöht ständig die Speichernutzung und ich versuche, alles über Knoteninternale zu verstehen.

Borjante
quelle
8
Ich füge jetzt einen Kommentar hinzu, da ich sehe, dass dies sehr leise wird. Es dauerte eine ganze Woche, bis mir klar wurde, dass meine NodeJS-App keinen Speicherverlust aufwies, der Garbage Collector jedoch nie aktiv wurde. Beachten Sie dies auf Systemen mit wenig Speicher wie t2.micro- oder t2.small-Instanzen. Der Server stürzt wegen nicht verfügbarem RAM ab.
Borjante
Gab es eine Möglichkeit, den Müllsammler zum Einschalten zu bringen?
ZG101
@ Borjante, warum lief der Müllsammler nicht?
göttlicher
2
Die konfigurierte maximale Größe des alten Speicherplatzes hatte eine höhere Grenze als die Gesamtmenge an RAM, über die der Computer verfügte.
Borjante

Antworten:

129

"Alter Speicherplatz" ist der größte und am besten konfigurierbare Abschnitt des von V8 verwalteten (auch als Müll gesammelten) Heaps (dh wo sich die JavaScript-Objekte befinden), und das --max-old-space-sizeFlag steuert seine maximale Größe. Wenn sich der Speicherverbrauch dem Limit nähert, wird V8 mehr Zeit für die Speicherbereinigung aufwenden, um nicht verwendeten Speicher freizugeben.

Wenn der Heap-Speicherverbrauch (dh Live-Objekte, die der GC nicht freigeben kann) den Grenzwert überschreitet, stürzt V8 Ihren Prozess ab (mangels Alternative), sodass Sie ihn nicht zu niedrig einstellen möchten. Wenn Sie es zu hoch einstellen, kann die zusätzliche Heap-Nutzung, die V8 zulässt, dazu führen, dass Ihrem Gesamtsystem der Speicher ausgeht (und zufällige Prozesse entweder ausgetauscht oder abgebrochen werden, da keine Alternative vorhanden ist).

Zusammenfassend würde ich auf einem Computer mit 2 GB Speicher wahrscheinlich --max-old-space-sizeetwa 1,5 GB einstellen , um Speicher für andere Zwecke zu belassen und ein Austauschen zu vermeiden.

jmrk
quelle
4
Genau das hatte ich mir erhofft, um eine Antwort zu erhalten, die den Randfall beschreibt, in dem entweder dem System oder dem Knoten der Speicher ausgeht.
Borjante
2
@jmrk: Scheint, Sie haben vollkommen recht, aber wenn ich 2 GB RAM und 4 GB Swap verwende und "--max-old-space-size" auf 4 GB setze, verbraucht der Knotenprozess den gesamten RAM-Speicher und bleibt bei 1,9 GB. Die Frage ist hier "Warum ist Swap zu vermeiden?" (Node Version 8.11.1)
Manish Trivedi
1
Die Flagge sollte alles andere überschreiben. Bitte überprüfen Sie die Tippfehler.
jmrk
2
Von d8 --help:--max-old-space-size (max size of the old space (in Mbytes))
jmrk
12

2020 Update

Diese Optionen werden jetzt offiziell nach Knoten dokumentiert . Für einen 2-GB-Computer sollten Sie wahrscheinlich Folgendes verwenden:

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

So bestimmen Sie die zu verwendende Menge : Sie können den verfügbaren Speicher auf einem Linux-Computer mithilfe von anzeigen free -m. Beachten Sie, dass Sie den freeund den buffers/cacheSpeicher zusammen verwenden können, da buffers/cacheer weggeworfen werden kann (diese Puffer und der Cache sind eine gute Möglichkeit, ansonsten nicht verwendeten Speicher zu verwenden).

Beachten Sie die offizielle Dokumentation fürmax-old-space-size auch Erwähnungen:

Stellen Sie auf einem Computer mit 2 GB Speicher 1536 (1,5 GB) ein.

Daher der obige Wert. Bedenken Sie, dass sich die für das Basisbetriebssystem benötigte Speichermenge nicht wesentlich ändert, sodass Sie auf einem 4-GB-Computer usw. problemlos 3.5 ausführen können.

Mikemaccana
quelle
1
Über den Link, den Sie in den Dokumenten von Node.js freigegeben haben, heißt es: "Auf einem Computer mit 2 GB Speicher sollten Sie diesen Wert auf 1536 (1,5 GB) einstellen"
Idan Dagan,
1
Danke @IdanDagan Ich werde das der Antwort hinzufügen.
Mikemaccana
11

Dieser Fehler tritt auf, wenn der für die ausführende Anwendung zugewiesene Speicher kleiner als der erforderliche Speicher ist. Standardmäßig beträgt das Speicherlimit in Node.js 512 MB. Um diesen Betrag zu erhöhen, müssen Sie das Argument für das Speicherlimit festlegen —-max-old-space-size. Dies hilft, ein Problem mit dem Speicherlimit zu vermeiden.

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

S. V.
quelle
und es sollte mehr als RAM-Speicher zugewiesen sein
HD ..
Ich bin mir nicht sicher, ob das mehr stimmt. Sicherlich kann ich auf einem System, auf das ich Zugriff auf den laufenden Knoten 10.20.1 habe, (mit node --v8-options) sehen, dass der gemeldete Standardwert 4096 ist und ohne Einstellung max-old-space-sizeder Testsuite, die ich verwende, problemlos bis zu 1,5 GB zugewiesen werden. Der verlinkte mittlere Artikel stammt aus dem Jahr 2016, daher ist es wahrscheinlich, dass sich die Dinge seit seiner Veröffentlichung weiterentwickelt haben.
JaySeeAre
1
Es ist schwierig, dies zu bestätigen. Ich kann in den Dokumenten für V8 oder Node nichts Explizites finden. Ein anderes System, das ich habe, meldet den Standard für v10, 12 und 14. als 0. FWIW Ich habe einige neuere Blogger gefunden, die den maximalen Speicher als 1,5 GB angeben ( tejom.github.io/general/nodejs/v8/debugging/2017/). 01/16 /… ) und dass v12 ein dynamisches Maximum basierend auf dem System hat ( idginsiderpro.com/article/3257673/… ).
JaySeeAre
3
node -e "console.log(`node heap limit = ${require('v8').getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)"-> v12.18.0 und v14.3.0 -> 2096 MB, v10.20.1 -> 1432 MB
JaySeeAre
@ JaySeeAre, danke für diesen Befehl, um das anzuzeigen heap_size_limit. Für eine normale UNIX-Shell muss anders angegeben werden:node -e 'console.log(`node heap limit = ${require("v8").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)'
Sam Watkins
-6

Wenn Sie nur möchten, dass es von dem Projekt aus funktioniert, an dem Sie arbeiten, gehen Sie folgendermaßen vor:

  1. In Ihrem Projekt cd to node_module / @ angle cd node_module / @ angle

  2. Führen Sie nun den folgenden Befehl export export NODE_OPTIONS = - max-old-space-size = 8192 aus

satish suryawanshi
quelle
14
Warum sollte man in das Verzeichnis @angular gehen müssen, um eine Umgebungsvariable festzulegen?
mgamsjager