Speicherlimit in Node.js (und Chrome V8)

73

An vielen Stellen im Web werden Sie sehen:

Was ist das Speicherlimit für einen Knotenprozess?

und die Antwort:

Derzeit hat V8 standardmäßig ein Speicherlimit von 512 MB auf 32-Bit-Systemen und 1 GB auf 64-Bit-Systemen. Das Limit kann angehoben werden, indem --max-old-space-size auf maximal ~ 1 GB (32 Bit) und ~ 1,7 GB (64 Bit) festgelegt wird. Es wird jedoch empfohlen, den einzelnen Prozess in mehrere Worker aufzuteilen wenn Sie Speichergrenzen erreichen.

Kann jemand bestätigen, dass dies der Fall ist, da Node.js häufig aktualisiert wird?

Und was noch wichtiger ist: Wird dies in naher Zukunft der Fall sein?

Ich möchte JavaScript-Code schreiben, der möglicherweise mit 4 GB Javascript-Objekten umgehen muss (und Geschwindigkeit ist möglicherweise kein Problem).

Wenn ich es in Node nicht machen kann, werde ich es in Java (auf einem 64-Bit-Computer) machen, aber ich würde es lieber nicht tun.

Chacko
quelle
6
Was in aller Welt könnte 4 GB in JS-Objekten aufnehmen?
Dominic Barnes
39
@ Dominic-Barnes: Bilder. Filme. Verdammt, ist das wichtig? Eines Tages wird etwas passieren. Ein MMORPG zum Beispiel. Ich bin damit einverstanden, dass die Einschränkungen brutal sind, und es war ein schwerwiegender Programmiererfehler, 32-Bit-Ints für die Adressierung im ursprünglichen Entwurf von Version 8 zu verwenden.
Elf Sternberg
4
Sie sagten: "Wenn Sie 4 GB Daten haben möchten, können Sie dies nicht als JS-Objekte tun." Wenn diese Aussage wahr ist (und für eine Weile gelten wird), würde ich denken, dass nodejs alles Hype ist. Daher hoffe ich, dass Sie falsch liegen.
Chacko
5
Ich bewege mich leicht um 8 GB in NodeJS-Objekten, nur als Referenz. Ich denke, in den letzten Jahren hat sich viel geändert, seit diese Frage gestellt wurde.
3
Es gibt keine Speicherbeschränkung, solange Sie Ihre Daten streamen. Lese- und Schreib-Streams sind ein großartiges Entwurfsmuster, mit dem Sie das tun können, was Sie benötigen, ohne den V8-Speicher zu sprengen.
Wallace Sidhrée

Antworten:

23

Dies war für einige, die Node.js verwenden, ein großes Problem, und es gibt gute Nachrichten. Das neue Speicherlimit für V8 ist jetzt unbekannt (nicht getestet) für 64-Bit und wird auf 32-Bit-Adressraum in 32-Bit-Umgebungen angehoben.

Lesen Sie hier mehr: http://code.google.com/p/v8/issues/detail?id=847

Sampsa Suoninen
quelle
5
Ich muss immer noch (auch mit 64 Bit) angeben, dass ich mit der Option --max-old-space-size = 10000 (für 10 GB) mehr Speicher möchte. Andernfalls wird "FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory" angezeigt. bei ~ 1,7 GB Speicherauslastung im Task-Manager unter Windows.
Andreas Reiff
1
Ich benutze 8 GB + leicht in v7.8.0 - wünschte nur, mein Computer hätte mehr RAM
6

Ich führe jetzt einen Prozess unter Ubuntu Linux aus, der einen bestimmten Speicherverlust aufweist und der Knoten 0.6.0 8 GB überträgt. Denke, es wird gehandhabt :).

j03m
quelle
1

Sieht aus wie ein wahrer. Als ich versucht hatte, 50 Mb String im Puffer zuzuweisen, var buf = new Buffer(50*1024*1024);bekam ich einen schwerwiegenden Fehler FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory. Ich habe eine Speicherauslastung von ca. 457 MB im Prozessmonitor behoben.

Paul Rumkin
quelle
1

Node.js erzwingt absichtlich eine Microservice-Architektur.

Wenn Sie dies nicht gesehen haben, sollten Sie sich diesen Vortrag von Ryan Dahl ansehen . Dies war im Jahr 2011, als er Node.js der Welt vorstellte. Das gesamte Gespräch ist sehr interaktiv. Und am Ende versucht er, ein Konzept zu erklären, das sehr vertraut klingt:

Node ist ein Single-Threaded-System, das nur 1 Kern verwendet. Dies ist kein Problem, da Sie mehr davon starten können. Module teilen ihren Speicher nicht. In gewisser Weise gibt es eine absichtliche Grenze auf der Ebene des Betriebssystemprozesses. Um zu kommunizieren, müssen Sie einen Socket öffnen, Daten serialisieren und an diese senden. Dies ist eine gute Lösung. Programme, die heutzutage sehr umfangreich werden, wachsen tendenziell über eine Maschine hinaus. Sie müssen in der Lage sein, ein Programm auf mehrere Computer zu verteilen. Wenn dies auch auf einer einzelnen Maschinenebene erzwungen wird, wird ein Modell erzwungen, das das Wachstum unterstützt. - Ryan Dahl (2011)

Der Begriff "Microservice" wurde erst 2 Monate später in einer Werkstatt in Venedig geprägt. Aber wenn man jetzt zurückblickt, ist es offensichtlich, was er zu erklären versucht. Es gab einfach noch kein Wort dafür.

Und die meisten dieser Speicherbeschränkungen sind kein Problem, wenn wir uns die Zeit nehmen, unsere Anwendungen in kleinere Mikrodienste aufzuteilen.

Node.js hat alle Grundlagen für eine superschnelle rohe TCP- oder HTTP-Kommunikation, aber Ryan betont in diesem Video auch, dass Node.js selbst kein HTTP-Server ist. Es gibt jedoch Node.js Frameworks und Bibliotheken, die sich auf diese Dinge spezialisiert haben.

Sobald Sie diesen Punkt erreicht haben, ist es meines Erachtens an der Zeit, sich das NestJS-Framework anzusehen, das einige integrierte Microservice-Funktionen enthält.

bvdb
quelle
0

Der maximale Speicherlimitwert beträgt 3049 für 32-Bit-Benutzer

Wenn Sie Node.js mit os.arch() === 'ia32'true ausführen, können Sie maximal 3049 festlegen

unter meinen Tests mit Knoten v11.15.0 und Windows 10

  • Wenn Sie es auf 3050 einstellen, läuft es über und wird auf 1 gesetzt.
  • Wenn Sie es auf 4000 einstellen, entspricht es 51 (4000 - 3049).
Setzen Sie den Speicher für Node.js auf Max
node --max-old-space-size=3049
Setzen Sie den Speicher für Node.js mit TypeScript auf Max
node -r ts-node/register --max-old-space-size=3049

Siehe: https://github.com/TypeStrong/ts-node/issues/261#issuecomment-402093879

Huan
quelle