मैं नोड.जेएस के लिए सही "अधिकतम-पुराने-अंतरिक्ष-आकार" का निर्धारण कैसे करूं?


99

मुझे यह समझने में थोड़ी परेशानी हो रही है कि पैरामीटर के आधार पर Node.js कैसे कार्य करता है max-old-space-size

मेरे मामले में, उदाहरण के लिए, मैं दो t2.smallAWS इंस्टेंस (2GB RAM) चला रहा हूं ।

यकीन नहीं क्यों, लेकिन मैंने सेट max-old-space-size=4096(4 जीबी) किया। इस मामले में नोड क्या करता है? क्या यह कॉन्फ़िगरेशन संभव मेमोरी आवंटन विफलता के कारण हो सकता है?

मैं max-old-space-sizeसर्वर संसाधनों के आधार पर सही मूल्य कैसे निर्धारित करूं ?

मेरा एप्लिकेशन मेमोरी उपयोग को लगातार बढ़ा रहा है और मैं नोड इंटर्न्स के बारे में सब कुछ समझने की कोशिश कर रहा हूं।


8
अब मैं एक टिप्पणी जोड़ रहा हूँ कि मैं देख रहा हूँ कि यह बहुत शांत हो रही है। मुझे यह महसूस करने में पूरा एक हफ्ता लग गया कि मेरे NodeJS ऐप में कोई मेमोरी लीक नहीं है, लेकिन कचरा इकट्ठा करने वाले ने कभी इसमें किक नहीं मारी। इसे कम मेमोरी वाले सिस्टम जैसे t2.micro या t2.small के उदाहरणों से अवगत कराएं। रैम उपलब्ध नहीं होने के कारण सर्वर क्रैश हो रहा है।
बोरजांटे

क्या कचरा इकट्ठा करने का एक तरीका है कि आप इसमें किक मारें?
ZG101

@ बोरजेंट कूड़ा उठाने वाला क्यों नहीं चल रहा था?
दिव्य

2
कॉन्फ़िगर अधिकतम-पुराने-अंतरिक्ष-आकार में रैम की कुल मात्रा की तुलना में एक उच्च सीमा थी जो मशीन के पास थी।
बोरजांटे

--optimize-for-sizeस्मृति उपयोग को कम करने की कोशिश कर रहा है।
कांस्टेंटिनोस

जवाबों:


135

"पुराना स्थान" V8 के प्रबंधित (उर्फ कचरा एकत्र) ढेर (यानी जहां जावास्क्रिप्ट ऑब्जेक्ट रहते हैं) का सबसे बड़ा और सबसे विन्यास खंड है, और --max-old-space-size ध्वज अपने अधिकतम आकार को नियंत्रित करता है। जैसे-जैसे मेमोरी की खपत सीमा होती है, अप्रयुक्त मेमोरी को मुक्त करने के प्रयास में V8 कचरा संग्रहण पर अधिक समय खर्च करेगा।

यदि मेमोरी मेमोरी (यानी जीवित वस्तुएं जो GC मुक्त नहीं हो सकती हैं) सीमा से अधिक हो जाती हैं, तो V8 आपकी प्रक्रिया (वैकल्पिक की कमी के लिए) को क्रैश कर देगा, इसलिए आप इसे बहुत कम सेट नहीं करना चाहते हैं। बेशक, यदि आप इसे बहुत अधिक सेट करते हैं, तो अतिरिक्त ढेर उपयोग जो V8 आपके समग्र सिस्टम को स्मृति से बाहर चलाने की अनुमति देगा (या तो वैकल्पिक की कमी के लिए या यादृच्छिक प्रक्रियाओं को स्वैप कर सकता है)।

सारांश में, 2GB मेमोरी वाली एक मशीन पर मैं शायद --max-old-space-size1.5GB के बारे में अन्य उपयोगों के लिए कुछ मेमोरी छोड़ने और स्वैपिंग से बचने के लिए सेट करूँगा ।


6
यह वही है जो मैं एक जवाब के लिए प्राप्त करने की उम्मीद कर रहा था, जो कि किनारे के मामले का वर्णन करता है जहां या तो सिस्टम या नोड मेमोरी से बाहर निकलता है।
बोरजांटे

2
@jmrk: लगता है कि आप पूरी तरह से सही हैं, लेकिन जब मैं 2GB रैम और 4GB स्वैप और "--max-old-space-size" का उपयोग 4GB करने के लिए करता हूं तो नोड प्रोसेस सभी RAM मेमोरी की खपत करता है और 1.9GB पर अटक जाता है। सवाल यहाँ है "क्यों स्वैप से बचने के लिए उपयोग किया जाता है ??" (नोड संस्करण 8.11.1)
मनीष त्रिवेदी

1
झंडे को और कुछ भी ओवरराइड करना चाहिए। कृपया टाइपोस के लिए डबल-चेक करें।
jmrk

2
से d8 --help:--max-old-space-size (max size of the old space (in Mbytes))
27:११

21

2020 अद्यतन

ये विकल्प अब नोड द्वारा आधिकारिक रूप से प्रलेखित हैं । 2GB मशीन के लिए, आपको संभवतः उपयोग करना चाहिए:

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

उपयोग करने के लिए राशि निर्धारित करने के लिए : आप एक लिनक्स मशीन का उपयोग करके उपलब्ध मेमोरी देख सकते हैं free -m। ध्यान दें कि आप freeऔर के buffers/cacheरूप में संयुक्त स्मृति का उपयोग कर सकते हैंbuffers/cache कि फेंक दिया जा सकता है (ये बफ़र्स और कैश अन्यथा अप्रयुक्त मेमोरी का उपयोग करने का एक अच्छा तरीका है)।

नोट के लिए आधिकारिक दस्तावेज काmax-old-space-size भी उल्लेख करें:

2GB मेमोरी वाली मशीन पर, इसे 1536 (1.5GB) पर सेट करने पर विचार करें

इसलिए ऊपर मूल्य। इस बात पर विचार करें कि बेस ओएस के लिए आवश्यक मेमोरी की मात्रा में अधिक परिवर्तन नहीं होता है, इसलिए आप 4 जीबी मशीन आदि पर खुशी से 3.5 कर सकते हैं।


2
Node.js डॉक्स से आपके द्वारा साझा किए गए लिंक से, यह कहता है: "2GB मेमोरी वाली मशीन पर, इसे 1536 (1.5GB) पर सेट करने पर विचार करें"
इदं डेगन

1
धन्यवाद @IdanDagan मैं इसका उत्तर दूंगा।
मिकमेकाना

11

यह त्रुटि तब होती है जब निष्पादन एप्लिकेशन के लिए आवंटित मेमोरी आवश्यक मेमोरी से कम होती है। डिफ़ॉल्ट रूप से, Node.js में मेमोरी सीमा 512 एमबी है। इस राशि को बढ़ाने के लिए, आपको स्मृति सीमा तर्क सेट करने की आवश्यकता है —-max-old-space-size। यह एक मेमोरी लिमिट इश्यू से बचने में मदद करेगा।

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


और यह आवंटित की जाने वाली राम मेमोरी से अधिक होनी चाहिए
HD ..

मुझे यकीन नहीं है कि यह किसी भी अधिक सच है। निश्चित रूप से एक सिस्टम पर मेरे पास रनिंग नोड 10.20.1 तक पहुंच है, मैं देख सकता हूं (साथ node --v8-options) कि रिपोर्ट की गई डिफ़ॉल्ट 4096 है और max-old-space-sizeपरीक्षण सूट को सेट किए बिना मैं चल रहा हूं 1.5 जीबी तक बिना किसी परेशानी के आवंटित किया गया है। जुड़ा हुआ मध्यम लेख 2016 से है, इसलिए यह संभावना है कि यह लिखे जाने के बाद से चीजें आगे बढ़ी हैं।
JaySeeAre

1
उस पर राज्याभिषेक करना मुश्किल है; मुझे V8 या नोड के लिए डॉक्स में कुछ भी स्पष्ट नहीं मिल रहा है। एक और प्रणाली है जो मेरे पास v10, 12 और 14. के लिए डिफ़ॉल्ट रिपोर्ट करती है। 0. एफडब्ल्यूआईडब्ल्यू के रूप में मैंने हाल ही के कुछ ब्लॉगर्स को अधिकतम मेमोरी 1.5Gb ( tejom.github.io/general/nodejs/v8/debugging/2017/) के रूप में मिला है। 01/16 /… ) और उस v12 में सिस्टम के आधार पर एक गतिशील अधिकतम है ( idginsiderpro.com/article/3257673/… )।
JaySeeAre

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

2
@JaySeeAre, उस आदेश को दिखाने के लिए धन्यवाद heap_size_limit। एक सामान्य UNIX शेल के लिए, इसे अलग तरीके से उद्धृत करने की आवश्यकता है:node -e 'console.log(`node heap limit = ${require("v8").getHeapStatistics().heap_size_limit / (1024 * 1024)} Mb`)'
सैम वाटकिन्स

-9

यदि आप केवल उस परियोजना से काम करना चाहते हैं जिस पर आप काम कर रहे हैं, तो दो चरणों का पालन करें:

  1. अपने प्रोजेक्ट में cd से नोड_मॉडल / @ कोणीय सीडी नोड_मॉडल / @ कोणीय

  2. अब नीचे कमांड निर्यात करें NODE_OPTIONS = - अधिकतम-पुराने-स्थान-आकार = 8192 चलाएं


18
पर्यावरण संस्करण सेट करने के लिए @angular निर्देशिका में जाने की आवश्यकता क्यों होगी?
mgamsjager
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.