Σήμερα έτρεξα το σενάριό μου για την ευρετηρίαση του συστήματος αρχείων για την ανανέωση του ευρετηρίου αρχείων RAID και μετά από 4 ώρες κατέρρευσε με το ακόλουθο σφάλμα:
[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
Ο διακομιστής είναι εξοπλισμένος με 16gb RAM και 24gb SSD swap. Πολύ αμφιβάλλω αν το σενάριό μου ξεπέρασε τα 36gb μνήμης. Τουλάχιστον δεν θα έπρεπε.
Το σενάριο δημιουργεί ευρετήριο αρχείων που αποθηκεύονται ως Array of Objects με μεταδεδομένα αρχείων (ημερομηνίες τροποποίησης, δικαιώματα, κ.λπ., όχι μεγάλα δεδομένα)
Εδώ είναι ο πλήρης κώδικας του σεναρίου: http://pastebin.com/mjaD76c3
I've ήδη experiend περίεργα ζητήματα κόμβου στο παρελθόν με αυτό το σενάριο, τι με ανάγκασε π.χ. να χωρίσω το ευρετήριο σε πολλαπλά αρχεία, καθώς ο κόμβος ήταν glitching όταν εργάζεται σε τόσο μεγάλα αρχεία όπως String. Υπάρχει κάποιος τρόπος να βελτιωθεί η διαχείριση της μνήμης του nodejs με τεράστια σύνολα δεδομένων;
Αν θυμάμαι καλά, υπάρχει ένα αυστηρό τυπικό όριο για τη χρήση μνήμης στο V8, περίπου 1,7 GB, αν δεν το αυξήσετε χειροκίνητα.
Σε ένα από τα προϊόντα μας ακολουθήσαμε αυτή τη λύση στο deploy script μας:
node --max-old-space-size=4096 yourFile.js
Θα υπήρχε επίσης μια νέα εντολή space, αλλά όπως διάβασα εδώ: a-tour-of-v8-garbage-collection ο νέος χώρος συλλέγει μόνο τα νεοδημιουργηθέντα βραχυπρόθεσμα δεδομένα και ο παλιός χώρος περιέχει όλες τις δομές δεδομένων που αναφέρονται, κάτι που θα πρέπει να είναι στην περίπτωσή σας η καλύτερη επιλογή.
Αντιμετώπισα αυτό το πρόβλημα όταν προσπαθούσα να κάνω αποσφαλμάτωση με το VSCode, οπότε ήθελα να προσθέσω ότι έτσι μπορείτε να προσθέσετε το επιχείρημα στη ρύθμιση αποσφαλμάτωσης.
Μπορείτε να το προσθέσετε στην ιδιότητα runtimeArgs
του config σας στο launch.json
.
Δείτε το παρακάτω παράδειγμα.
{
"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"
]
}
]}
πάλευα με αυτό ακόμα και μετά τη ρύθμιση --max-old-space-size.
Τότε συνειδητοποίησα ότι πρέπει να βάλω τις επιλογές --max-old-space-size πριν από το σενάριο karma.
Επίσης, το καλύτερο είναι να καθορίσετε και τις δύο συνταγές --max-old-space-size και --max_old_space_size το σενάριό μου για το 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
reference https://github.com/angular/angular-cli/issues/1652