Heute habe ich mein Skript für die Indizierung des Dateisystems ausgeführt, um den Index der RAID-Dateien zu aktualisieren, und nach 4 Stunden stürzte es mit folgendem Fehler ab:
[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
Der Server ist mit 16gb RAM und 24gb SSD Swap ausgestattet. Ich bezweifle stark, dass mein Skript 36gb Speicher überschritten hat. Zumindest sollte es das nicht.
Das Skript erstellt einen Index von Dateien, der als Array von Objekten mit den Metadaten der Dateien gespeichert wird (Änderungsdaten, Berechtigungen usw., keine großen Daten)
Hier ist der vollständige Skriptcode: http://pastebin.com/mjaD76c3
I've bereits experiend seltsame Knoten Probleme in der Vergangenheit mit diesem Skript, was mich gezwungen, z. B. Split-Index in mehrere Dateien als Knoten war glitching bei der Arbeit an solchen großen Dateien wie String. Gibt es eine Möglichkeit, die Speicherverwaltung von Nodejs bei großen Datensätzen zu verbessern?
Wenn ich mich richtig erinnere, gibt es eine strenge Standardgrenze für die Speichernutzung in V8 von etwa 1,7 GB, wenn Sie diese nicht manuell erhöhen.
Bei einem unserer Produkte haben wir diese Lösung in unserem Bereitstellungsskript befolgt:
node --max-old-space-size=4096 yourFile.js
Es gäbe auch einen neuen Space-Befehl, aber wie ich hier gelesen habe: a-tour-of-v8-garbage-collection sammelt der neue Bereich nur die neu erstellten Kurzzeitdaten und der alte Bereich enthält alle referenzierten Datenstrukturen, was in Ihrem Fall die beste Option sein sollte.
Ich bin auf dieses Problem gestoßen, als ich versucht habe, mit VSCode zu debuggen, also wollte ich nur hinzufügen, wie Sie das Argument zu Ihrem Debug-Setup hinzufügen können.
Sie können es der Eigenschaft "runtimeArgs" 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"
]
}
]}
Ich hatte damit zu kämpfen, auch nachdem ich --max-old-space-size eingestellt hatte.
Dann wurde mir klar, dass ich die Option --max-old-space-size vor das Karma-Skript setzen muss.
Auch am besten, um beide Syntaxen angeben --max-old-space-size und --max_old_space_size mein Skript für Karma :
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