2016-07-25 52 views
53

Heute habe ich mein Skript für Dateisystem Indizierung lief RAID-Dateien Index zu aktualisieren und es abgestürzt ist mit folgendem Fehler nach 4:Node.js Haufen aus dem Speicher

[md5:] 241613/241627 97.5% 
[md5:] 241614/241627 97.5% 
[md5:] 241625/241627 98.1% 
Creating missing list... (79570 files missing) 
Creating new files list... (241627 new files) 

<--- Last few GCs ---> 

11629672 ms: Mark-sweep 1174.6 (1426.5) -> 1172.4 (1418.3) MB, 659.9/0 ms [allocation failure] [GC in old space requested]. 
11630371 ms: Mark-sweep 1172.4 (1418.3) -> 1172.4 (1411.3) MB, 698.9/0 ms [allocation failure] [GC in old space requested]. 
11631105 ms: Mark-sweep 1172.4 (1411.3) -> 1172.4 (1389.3) MB, 733.5/0 ms [last resort gc]. 
11631778 ms: Mark-sweep 1172.4 (1389.3) -> 1172.4 (1368.3) MB, 673.6/0 ms [last resort gc]. 


<--- JS stacktrace ---> 

==== JS stack trace ========================================= 

Security context: 0x3d1d329c9e59 <JS Object> 
1: SparseJoinWithSeparatorJS(aka SparseJoinWithSeparatorJS) [native array.js:~84] [pc=0x3629ef689ad0] (this=0x3d1d32904189 <undefined>,w=0x2b690ce91071 <JS Array[241627]>,L=241627,M=0x3d1d329b4a11 <JS Function ConvertToString (SharedFunctionInfo 0x3d1d3294ef79)>,N=0x7c953bf4d49 <String[4]\: ,\n >) 
2: Join(aka Join) [native array.js:143] [pc=0x3629ef616696] (this=0x3d1d32904189 <undefin... 

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 
1: node::Abort() [/usr/bin/node] 
2: 0xe2c5fc [/usr/bin/node] 
3: v8::Utils::ReportApiFailure(char const*, char const*) [/usr/bin/node] 
4: v8::internal::V8::FatalProcessOutOfMemory(char const*, bool) [/usr/bin/node] 
5: v8::internal::Factory::NewRawTwoByteString(int, v8::internal::PretenureFlag) [/usr/bin/node] 
6: v8::internal::Runtime_SparseJoinWithSeparator(int, v8::internal::Object**, v8::internal::Isolate*) [/usr/bin/node] 
7: 0x3629ef50961b 

Server ist mit 16 GB RAM und 24 GB SSD-Swap. Ich bezweifle stark mein Skript überschritten 36 GB Speicher. Zumindest sollte es nicht

Script erstellt Index der Dateien als Array von Objekten mit Dateien Metadaten gespeichert (Änderungsdaten, Berechtigungen etc, keine großen Daten)

hier voll Script-Code: http://pastebin.com/mjaD76c3

Ich habe bereits seltsame Knotenprobleme in der Vergangenheit mit diesem Skript erlebt, was mich zB gezwungen hat. Teilen Sie den Index in mehrere Dateien auf, da der Knoten bei der Arbeit an so großen Dateien wie String störte. Gibt es eine Möglichkeit, Nodejs Speicherverwaltung mit riesigen Datensätzen zu verbessern?

Antwort

86

Wenn ich mich richtig erinnere, gibt es ein strenges Standardlimit für die Speichernutzung in V8 von etwa 1,7 GB, wenn Sie es nicht manuell erhöhen.

In einem unserer Produkte, die wir diese Lösung in unserem deploy Skript folgt:

node --max-old-space-size=4096 yourFile.js 

Es gibt auch einen neuen Raum Befehl sein würde, aber wie ich hier gelesen: a-tour-of-v8-garbage-collection der neue Raum sammelt nur die neu kurz- erstellt Termdaten und der alte Platz enthält alle referenzierten Datenstrukturen, die in Ihrem Fall die beste Option sein sollten.

+0

wie global eingestellt? – aufula

+0

Sie können nicht @aufula –

+0

Wo soll ich dies einstellen, wenn ich Express-Framework verwende? – Simer

8

Ich stieß auf dieses Problem beim Debuggen mit VSCode, also wollte nur hinzufügen, das ist, wie Sie das Argument zu Ihrem Debug-Setup hinzufügen können.

Sie können es zur runtimeArgs Eigenschaft Ihrer Konfiguration in launch.json hinzufügen.

Siehe Beispiel unten.

{ 
"version": "0.2.0", 
"configurations": [{ 
     "type": "node", 
     "request": "launch", 
     "name": "Launch Program", 
     "program": "${workspaceRoot}\\server.js" 
    }, 
    { 
     "type": "node", 
     "request": "launch", 
     "name": "Launch Training Script", 
     "program": "${workspaceRoot}\\training-script.js", 
     "runtimeArgs": [ 
      "--max-old-space-size=4096" 
     ] 
    } 
]} 
2

Ich habe mit diesem auch nach Einstellung - Max-Old-Space-Size gekämpft.

Dann erkannte ich, müssen Optionen - Max-alte-Raum-Größe vor dem Karma-Skript.

auch am besten, beide Syntaxen angeben --max-old-Raum-Größe und --max_old_space_size Karma mein Skript für:

node --max-old-space-size=8192 --optimize-for-size --max-executable-size=8192 --max_old_space_size=8192 --optimize_for_size --max_executable_size=8192 node_modules/karma/bin/karma start --single-run --max_new_space_size=8192 --prod --aot 

Referenz https://github.com/angular/angular-cli/issues/1652

3

FWIW, zu finden und ein Speicher Schwein Fixierung mit etwas wie memwatch könnte helfen.

-2

Versuchen Sie diesen Befehl ausführen:

npm rebuild grpc 
+0

Das beantwortet die Frage nicht wirklich. Wenn Sie eine andere Frage haben, können Sie sie durch Klicken auf [Frage stellen] (https://stackoverflow.com/questions/ask) stellen. Sie können [Kopfgeld hinzufügen] (https://stackoverflow.com/help/privileges/set-bounties) hinzufügen, um mehr Aufmerksamkeit auf diese Frage zu lenken, sobald Sie genug [Reputation] haben (https://stackoverflow.com/help/ Whats-Reputation). - [Aus Bewertung] (/ review/low-quality-posts/18328757) – Rabbid76

1

Upgrade-Knoten auf die neueste Version. Ich war an Knoten 6.6 mit diesem Fehler und auf 8.9.4 aktualisiert und das Problem ging weg.