Node.js merekomendasikan "max-old-space-size"

95

Saya mengalami kesulitan untuk memahami bagaimana Node.js bertindak berdasarkan parameter max-old-space-size.

Dalam kasus saya, misalnya, saya menjalankan dua t2.smallinstans AWS (RAM 2GB).

Tidak yakin mengapa, tapi saya mengatur max-old-space-size=4096(4GB). Apa yang dilakukan node dalam kasus ini? Bisakah konfigurasi ini menyebabkan kemungkinan kegagalan alokasi memori?

Bagaimana cara menentukan nilai yang benar max-old-space-sizeberdasarkan sumber daya server?

Aplikasi saya terus meningkatkan penggunaan memori dan saya mencoba memahami segala sesuatu tentang internal node.

Borjante
sumber
8
Saya menambahkan komentar sekarang setelah saya melihat saya bahwa ini mendapatkan banyak tampilan. Saya membutuhkan waktu seminggu penuh untuk menyadari bahwa aplikasi NodeJS saya tidak mengalami kebocoran memori tetapi pengumpul sampah tidak pernah bekerja. Waspadai hal ini pada sistem dengan memori rendah seperti instance t2.micro atau t2.small. Server akan mogok karena RAM tidak tersedia.
Borjante
Adakah cara untuk membuat pemulung sampah menendang?
ZG101
@ Borjante mengapa pengumpul sampah tidak berjalan?
ilahi
2
Max-old-space-size yang dikonfigurasi memiliki batas yang lebih tinggi dari jumlah total RAM yang dimiliki mesin.
Borjante

Jawaban:

129

"Ruang lama" adalah bagian terbesar dan paling dapat dikonfigurasi dari heap yang dikelola (alias sampah-dikumpulkan) V8 (yaitu tempat objek JavaScript berada), dan --max-old-space-sizetanda mengontrol ukuran maksimumnya. Saat konsumsi memori mendekati batas, V8 akan menghabiskan lebih banyak waktu untuk pengumpulan sampah dalam upaya mengosongkan memori yang tidak digunakan.

Jika konsumsi memori heap (yaitu objek langsung yang tidak dapat dibebaskan oleh GC) melebihi batas, V8 akan menghentikan proses Anda (karena kurangnya alternatif), jadi Anda tidak ingin menyetelnya terlalu rendah. Tentu saja, jika Anda menyetelnya terlalu tinggi, penggunaan heap tambahan yang diizinkan oleh V8 dapat menyebabkan keseluruhan sistem Anda kehabisan memori (dan menukar atau mematikan proses acak, karena kurangnya alternatif).

Singkatnya, pada mesin dengan memori 2GB saya mungkin akan menyetel --max-old-space-sizesekitar 1,5GB untuk menyisakan beberapa memori untuk penggunaan lain dan menghindari pertukaran.

jmrk
sumber
4
Itulah tepatnya yang saya harapkan untuk mendapatkan jawaban, menggambarkan kasus tepi di mana sistem atau Node kehabisan memori.
Borjante
2
@jmrk: Sepertinya Anda benar, tetapi ketika saya menggunakan RAM 2GB dan swap 4GB dan setel "--max-old-space-size" ke 4GB maka proses node menghabiskan semua memori RAM dan macet di 1.9GB. Pertanyaannya adalah di sini "Mengapa swap dihindari untuk digunakan ??" (Node versi 8.11.1)
Manish Trivedi
1
Bendera harus menimpa yang lainnya. Harap periksa kembali jika ada kesalahan ketik.
jmrk
2
Dari d8 --help:--max-old-space-size (max size of the old space (in Mbytes))
jmrk
12

Pembaruan 2020

Opsi ini sekarang didokumentasikan secara resmi oleh node . Untuk mesin 2GB, Anda mungkin harus menggunakan:

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

Untuk menentukan jumlah yang akan digunakan : Anda dapat melihat memori yang tersedia di mesin Linux menggunakan free -m. Perhatikan bahwa Anda dapat menggunakan freedan buffers/cachememori yang digabungkan, karena buffers/cachedapat dibuang (buffer dan cache ini adalah cara yang bagus untuk menggunakan memori yang tidak digunakan).

Perhatikan dokumentasi resmi untukmax-old-space-size juga menyebutkan:

Pada mesin dengan memori 2GB, pertimbangkan untuk menyetelnya ke 1536 (1,5GB)

Karenanya nilai di atas. Pertimbangkan bahwa jumlah memori yang dibutuhkan untuk OS dasar tidak banyak berubah, jadi Anda dapat dengan senang hati melakukan 3.5 pada mesin 4GB dll.

mikemaccana
sumber
1
Dari tautan yang Anda bagikan dari dokumen Node.js, dikatakan: "Di mesin dengan memori 2 GB, pertimbangkan untuk menyetelnya ke 1536 (1.5 GB)"
Idan Dagan
1
Terima kasih @IdanDagan, saya akan menambahkan itu ke jawabannya.
mikemaccana
11

Kesalahan ini terjadi ketika memori yang dialokasikan untuk aplikasi yang mengeksekusi kurang dari memori yang dibutuhkan. Secara default, batas memori di Node.js adalah 512 MB. Untuk meningkatkan jumlah ini, Anda perlu mengatur argumen batas memori —-max-old-space-size. Ini akan membantu menghindari masalah batas memori.

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

S.V
sumber
dan itu harus lebih dari memori Ram yang dialokasikan
HD ..
Saya tidak yakin ini benar lagi. Tentu saja pada satu sistem saya memiliki akses untuk menjalankan node 10.20.1, saya dapat melihat (dengan node --v8-options) bahwa default yang dilaporkan adalah 4096 dan tanpa pengaturan max-old-space-sizerangkaian pengujian yang saya jalankan mendapatkan alokasi hingga 1,5Gb tanpa masalah. Artikel sedang yang ditautkan berasal dari tahun 2016 jadi kemungkinan hal-hal telah berpindah sejak ditulis.
JaySeeAre
1
Sulit untuk menemukan bukti yang menguatkan itu; Saya tidak dapat menemukan sesuatu yang eksplisit dalam dokumen untuk V8 atau Node. Sistem lain yang saya laporkan defaultnya untuk v10, 12 & 14. sebagai 0. FWIW Saya telah menemukan beberapa blogger yang lebih baru yang menyatakan memori maksimal sebagai 1.5Gb ( tejom.github.io/general/nodejs/v8/debugging/2017/ 01/16 /… ) dan v12 itu memiliki maks dinamis berdasarkan sistem ( idginsiderpro.com/article/3257673/… ).
JaySeeAre
3
node -e "console.log(`node heap limit = ${require('v8').getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)"-> v12.18.0 dan v14.3.0 -> 2096Mb, v10.20.1 -> 1432Mb
JaySeeAre
@JaySeeAre, terima kasih atas perintah untuk menampilkan heap_size_limit. Untuk shell UNIX normal, perlu dikutip secara berbeda:node -e 'console.log(`node heap limit = ${require("v8").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)'
Sam Watkins
-6

Jika Anda hanya ingin membuatnya bekerja dari proyek yang sedang Anda kerjakan, Ikuti dua langkah berikut:

  1. Dalam cd proyek Anda ke node_module / @ angular cd node_module / @ angular

  2. Sekarang jalankan perintah di bawah export NODE_OPTIONS = - max-old-space-size = 8192

satish suryawanshi
sumber
14
Mengapa harus pergi ke direktori @angular untuk menyetel lingkungan var?
mgamsjager