Bugün RAID dosyaları dizinini yenilemek için dosya sistemi dizinleme betiğimi çalıştırdım ve 4 saat sonra aşağıdaki hata ile çöktü:
[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
Sunucu 16gb RAM ve 24gb SSD takas ile donatılmıştır. Komut dosyamın 36 gb belleği aştığından şüpheliyim. En azından aşmamalı
Komut dosyası, dosyaların meta verileriyle (değişiklik tarihleri, izinler, vb., büyük veri yok) Nesneler Dizisi olarak depolanan dosyaların dizinini oluşturur
İşte tam senaryo kodu: http://pastebin.com/mjaD76c3
Geçmişte bu komut dosyasıyla garip düğüm sorunları yaşadım, örneğin beni zorlayan şey. dizini birden çok dosyaya bölün, çünkü düğüm String gibi büyük dosyalar üzerinde çalışırken hata veriyordu. Büyük veri kümelerinde nodejs bellek yönetimini iyileştirmenin bir yolu var mı?
Yanlış hatırlamıyorsam, V8'de bellek kullanımı için, manuel olarak artırmazsanız, yaklaşık 1,7 GB'lık katı bir standart sınır vardır.
Ürünlerimizden birinde, dağıtım komut dosyamızda bu çözümü izledik:
node --max-old-space-size=4096 yourFile.js
Yeni bir alan komutu da olabilir, ancak burada okuduğum gibi: a-tour-of-v8-garbage-collection yeni alan yalnızca yeni oluşturulan kısa vadeli verileri toplar ve eski alan, sizin durumunuzda en iyi seçenek olması gereken tüm referanslı veri yapılarını içerir.
VSCode ile hata ayıklamaya çalışırken bu sorunla karşılaştım, bu nedenle hata ayıklama kurulumunuza bu argümanı nasıl ekleyebileceğinizi eklemek istedim.
Bunu launch.json
içindeki yapılandırmanızın runtimeArgs
özelliğine ekleyebilirsiniz.
Aşağıdaki örneğe bakınız.
{
"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"
]
}
]}
maksimum eski alan boyutunu ayarladıktan sonra bile bununla mücadele ediyordum.
O zaman karma betiğinden önce --max-old-space-size seçeneklerini koymam gerektiğini fark ettim.
ayrıca --max-old-space-size ve --max_old_space_size söz dizimlerinin her ikisini de belirtmek en iyisidir karma için betiğim:
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