Oggi ho eseguito il mio script per l'indicizzazione del filesystem per aggiornare l'indice dei file RAID e dopo 4 ore si è bloccato con il seguente errore:
[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
Il server è dotato di 16gb di RAM e 24gb di swap SSD. Dubito fortemente che il mio script abbia superato i 36gb di memoria. Almeno non dovrebbe
Lo script crea un indice di file memorizzati come array di oggetti con i metadati dei file (date di modifica, permessi, ecc, nessun grande dato)
Ecco il codice completo dello script: http://pastebin.com/mjaD76c3
Ho già sperimentato strani problemi di nodo in passato con questo script che mi ha costretto, ad esempio, a dividere l'indice in più file perché il nodo aveva dei problemi quando lavorava su file grandi come String. C'è un modo per migliorare la gestione della memoria di nodejs con enormi set di dati?
Se ricordo bene, c'è un limite standard rigoroso per l'uso della memoria in V8 di circa 1,7 GB, se non lo si aumenta manualmente.
In uno dei nostri prodotti abbiamo seguito questa soluzione nel nostro script di distribuzione:
node --max-old-space-size=4096 yourFile.js
Ci sarebbe anche un comando new space ma come ho letto qui: a-tour-of-v8-garbage-collection il nuovo spazio raccoglie solo i dati a breve termine appena creati e il vecchio spazio contiene tutte le strutture dati referenziate, che dovrebbe essere nel tuo caso l'opzione migliore.
Ho riscontrato questo problema quando ho provato a fare il debug con VSCode, quindi volevo solo aggiungere che questo è il modo in cui puoi aggiungere l'argomento alla tua configurazione di debug.
Puoi aggiungerlo alla proprietà runtimeArgs
della tua configurazione in launch.json
.
Vedi l'esempio qui sotto.
{
"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"
]
}
]}
Stavo lottando con questo anche dopo aver impostato --max-old-space-size.
Allora ho capito che devo mettere l'opzione --max-old-space-size prima dello script karma.
anche meglio specificare entrambe le sintassi --max-old-space-size e --max_old_space_size il mio script per 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
riferimento https://github.com/angular/angular-cli/issues/1652