Node.js, "max-old-space-size" önerdi


95

Node.js'nin parametreye göre nasıl davrandığını anlamakta biraz sorun yaşıyorum max-old-space-size.

Benim durumumda, örneğin, iki t2.smallAWS örneği (2GB RAM) çalıştırıyorum.

Neden olduğundan emin değilim, ama max-old-space-size=4096(4GB) ayarladım . Bu durumda düğüm ne yapar? Bu konfigürasyon olası bir bellek ayırma hatasına yol açabilir mi?

max-old-space-sizeSunucu kaynaklarına göre doğru değeri nasıl belirleyebilirim ?

Uygulamam sürekli olarak bellek kullanımını artırıyor ve düğüm iç bileşenleri hakkında her şeyi anlamaya çalışıyorum.


8
Şimdi görüyorum ki bu görüşün çok sessizleştiğini görüyorum. NodeJS uygulamamda bellek sızıntısı olmadığını, ancak çöp toplayıcının hiçbir zaman devreye girmediğini fark etmem tam bir haftamı aldı. T2.micro veya t2.small örnekleri gibi düşük belleğe sahip sistemlerde bunun farkında olun. Mevcut olmayan RAM nedeniyle sunucu çökecek.
Borjante

Çöp toplayıcının devreye girmesini sağlamanın bir yolu var mıydı?
ZG101

@Borjante neden çöp toplayıcı çalışmıyordu?
ilahi

2
Yapılandırılan maksimum eski alan boyutu, makinenin sahip olduğu toplam RAM miktarından daha yüksek bir limite sahipti.
Borjante

Yanıtlar:


129

"Eski alan", V8'in yönetilen (çöpte toplanan) yığınının (yani JavaScript nesnelerinin yaşadığı) en büyük ve en yapılandırılabilir bölümüdür ve --max-old-space-sizebayrak maksimum boyutunu kontrol eder. Bellek tüketimi sınıra yaklaştıkça, V8 kullanılmayan belleği boşaltmak için çöp toplama için daha fazla zaman harcayacaktır.

Yığın bellek tüketimi (yani, GC'nin serbest bırakamayacağı canlı nesneler) sınırı aşarsa, V8 işleminizi çöker (alternatif olmaması nedeniyle), bu nedenle çok düşük ayarlamak istemezsiniz. Tabii ki, çok yükseğe ayarlarsanız, V8'in izin vereceği ek yığın kullanımı, genel sisteminizin belleğinin bitmesine (ve alternatif olmaması nedeniyle rastgele işlemleri değiştirmesine veya sonlandırmasına) neden olabilir.

Özetle, 2 GB belleğe sahip bir makinede, --max-old-space-sizediğer kullanımlar için biraz bellek bırakmak ve takas etmekten kaçınmak için muhtemelen yaklaşık 1,5 GB'a ayarlardım .


4
Sistemin veya Düğümün belleğin yetersiz kaldığı uç durumu açıklayarak, bir cevap almayı umduğum şey tam olarak buydu.
Borjante

2
@jmrk: Tamamen haklısınız gibi görünüyor, ancak 2GB RAM ve 4GB takas kullandığımda ve "--max-old-space-size" değerini 4GB olarak ayarladığımda düğüm işlemi tüm RAM belleğini tüketiyor ve 1.9GB'de kalıyor. Soru burada "Neden takas kullanmaktan kaçınıyor?" (Düğüm sürümü 8.11.1)
Manish Trivedi

1
Bayrak diğer her şeyi geçersiz kılmalıdır. Lütfen yazım hatalarını tekrar kontrol edin.
jmrk

2
Gönderen d8 --help:--max-old-space-size (max size of the old space (in Mbytes))
jmrk

11

2020 Güncellemesi

Bu seçenekler artık resmi olarak düğüm tarafından belgelenmiştir . 2 GB'lık bir makine için muhtemelen şunları kullanmalısınız:

NODE_OPTIONS=--max-old-space-size=1536

Kullanılacak miktarı belirlemek için : kullanarak bir Linux makinesinde kullanılabilir belleği görebilirsiniz free -m. Atılabileceği gibi freeve buffers/cachebelleği birlikte kullanabileceğinizi unutmayın buffers/cache(bu arabellekler ve önbellek, kullanılmayan belleği kullanmanın güzel bir yoludur).

Not resmi belgeler içinmax-old-space-size de bahseder:

2 GB belleğe sahip bir makinede, bunu 1536 (1,5 GB) olarak ayarlamayı düşünün.

Dolayısıyla yukarıdaki değer. Temel işletim sistemi için gereken bellek miktarının çok fazla değişmediğini göz önünde bulundurun, böylece 4 GB'lık bir makinede mutlu bir şekilde 3.5 yapabilirsiniz.


1
Node.js belgelerinden paylaştığınız bağlantıdan şunu yazıyor: "2 GB belleğe sahip bir makinede bunu 1536 (1,5 GB) olarak ayarlamayı düşünün"
Idan Dagan

1
Teşekkürler @IdanDagan bunu cevaba ekleyeceğim.
mikemaccana

11

Bu hata, yürütme uygulaması için ayrılan bellek gerekli bellekten daha az olduğunda oluşur. Varsayılan olarak, Node.js'deki bellek sınırı 512 MB'dir. Bu miktarı artırmak için bellek sınırı argümanını ayarlamanız gerekir —-max-old-space-size. Hafıza sınırı sorununu önlemeye yardımcı olacaktır.

node --max-old-space-size=1024 index.js #increase to 1gb
node --max-old-space-size=2048 index.js #increase to 2gb
node --max-old-space-size=3072 index.js #increase to 3gb
node --max-old-space-size=4096 index.js #increase to 4gb
node --max-old-space-size=5120 index.js #increase to 5gb
node --max-old-space-size=6144 index.js #increase to 6gb
node --max-old-space-size=7168 index.js #increase to 7gb
node --max-old-space-size=8192 index.js #increase to 8gb

https://medium.com/@vuongtran/how-to-solve-process-out-of-memory-in-node-js-5f0de8f8464c


ve ayrılan Ram belleğinden daha fazla olmalıdır
HD ..

Bunun artık doğru olduğundan emin değilim. Kesinlikle bir sistemde 10.20.1 çalıştıran düğüme erişimim var, node --v8-optionsrapor edilen varsayılanın 4096 olduğunu ve max-old-space-sizeçalıştırdığım test paketini ayarlamadan 1,5 Gb'ye kadar sorunsuz bir şekilde ayrıldığını görebiliyorum. Bağlantılı ortam makalesi 2016'dan kalma, bu yüzden yazıldıktan sonra işler değişmiş olabilir.
JaySeeAre

1
Bunu doğrulamak zor; V8 veya Node belgelerinde açık bir şey bulamıyorum. Sahip olduğum başka bir sistem v10, 12 ve 14 için varsayılanı 0 olarak bildiriyor. FWIW Maksimum belleği 1.5 Gb olarak belirten birkaç yeni blogcu buldum ( tejom.github.io/general/nodejs/v8/debugging/2017/ 01/16 /… ) ve bu v12'nin sisteme ( idginsiderpro.com/article/3257673/… ) dayalı bir dinamik maksimum değeri vardır .
JaySeeAre

3
node -e "console.log(`node heap limit = ${require('v8').getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)"-> v12.18.0 ve v14.3.0 -> 2096Mb, v10.20.1 -> 1432Mb
JaySeeAre

@JaySeeAre, bu komutun heap_size_limit. Normal bir UNIX kabuğu için farklı şekilde alıntı yapılması gerekir:node -e 'console.log(`node heap limit = ${require("v8").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)'
Sam Watkins

-6

Sadece üzerinde çalıştığınız projeden çalışmasını sağlamak istiyorsanız, iki adımı izleyin:

  1. Projenizin cd'sinde node_module / @ angular cd node_module / @ angular

  2. Şimdi aşağıdaki komutu çalıştırın export NODE_OPTIONS = - max-old-space-size = 8192


14
Bir ortam değişkeni ayarlamak için neden @angular dizinine gitmeniz gerekiyor?
mgamsjager
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.