Node.js yığın belleği tükendi

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ı?

Çözü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.

Yorumlar (8)

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"
        ]
    }
]}
Yorumlar (0)

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

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

Yorumlar (3)