2012-11-29 3 views
48

अच्छा ... मैं वापस वर्ग में हूं। मैं इसे अपने जीवन के लिए नहीं समझ सकता।नोड.जेएस "फाटल त्रुटि: जेएस आवंटन विफल - स्मृति से बाहर प्रक्रिया" - एक स्टैक ट्रेस पाने के लिए संभव है?

मैं निम्न त्रुटि हो रही है:

FATAL ERROR: JS Allocation failed - process out of memory 

मैं दर्जनों की गणना कर सकता है (हाँ, दर्जनों) बातें मैं इस समस्या के मूल को पाने के लिए कोशिश की है की, लेकिन वास्तव में यह अब तक होगा बहुत ज्यादा।

  • मैं केवल यह मेरे उत्पादन सर्वर पर होने प्राप्त कर सकते हैं, और मेरे एप्लिकेशन विशाल और जटिल है, तो यह बहुत मुश्किल को अलग साबित हो रहा है
  • यह भी ढेर आकार हालांकि होता है: तो यहाँ प्रमुख बिंदु हैं & आरएसएस आकार दोनों < 200 एमबी है, जो एक समस्या नहीं दिया जाना चाहिए हैं कि मशीनों (अमेज़न बादल, CentOS, m1.large)

मेरे धारणा है कि 2 बिंदु के (क्योंकि है 8Gb रैम है), एक रिसाव शायद कारण नहीं है; बल्कि, ऐसा लगता है कि शायद एक सिंगल ऑब्जेक्ट है जो बहुत बड़ा है। निम्नलिखित धागे इस सिद्धांत का बैक अप लेते हैं :: In Node.js using JSON.stringify results in 'process out of memory' error

मुझे वास्तव में क्या चाहिए, यह पता लगाने का कोई तरीका है कि एप्लिकेशन क्रैश होने पर स्मृति की स्थिति क्या है, या संभवत: फाटाल त्रुटि तक पहुंचने वाला एक स्टैक ट्रेस है।

उपरोक्त मेरी धारणा के आधार पर, 10 मिनट पुराना हीप डंप अपर्याप्त है (क्योंकि वस्तु स्मृति में नहीं रहती थी)।

+0

बस यह सुनिश्चित करना कि मूल आधार शामिल हैं। क्या आप सुनिश्चित हैं कि प्रक्रिया 'ulimit' सेटिंग के साथ चल रही है जिससे यह सभी रैम का उपयोग कर सके? क्या आप जानते हैं कि ऐप में क्या चल रहा है जो एक ऑब्जेक्ट इतना बड़ा बना सकता है? ऐसा लगता है कि ऐप <200 एमबी रैम का उपयोग नहीं कर रहा है, तो एक भी घटना अचानक एक अतिरिक्त 7.8 जीबी समाप्त हो जाती है। –

+0

@ पीटर लियोन ulimit 1024 (डिफ़ॉल्ट) पर है। बीटीडब्ल्यू, सॉकेट/फाइलों के साथ नहीं करना चाहिए, रैम नहीं? वैसे भी, यह कहना मुश्किल है कि वस्तु को इतना बड़ा बना सकता है; यह इस समस्या के रहस्य का हिस्सा है। मैं अनुमान लगा रहा हूं कि एक (या अधिक) उपयोगकर्ताओं के पास उनके खाते में कुछ ऐसा है जो अद्वितीय है जिसे मैंने भविष्यवाणी नहीं की थी या ठीक से कैप नहीं किया था, लेकिन मैं यह अनुमान लगाने शुरू भी नहीं कर सकता कि कहां/क्या है। जैसा कि मैंने कहा, यह एक बहुत बड़ा आवेदन है। –

+1

ulimit खुले फाइलों, मेमोरी, सीपीयू, प्रक्रियाओं आदि सहित कई संसाधनों को नियंत्रित कर सकता है। विशेष रूप से 'ulimit -m' और' ulimit -d' देखें http://ss64.com/bash/ulimit.html। यह और यथार्थवादी लगता है कि स्मृति उपयोग 7 जीबी से 1 जीबी तक बढ़ रहा है। मुझे लगता है कि मेरी अगली पंक्ति जांच एप की सेवा करने का सबसे बड़ा अनुरोध होगा। क्या ग्राहक बड़े अपलोड स्ट्रीम कर रहे हैं? क्या कई समवर्ती ग्राहक कई अनुरोधों में भेज रहे हैं? कम से कम आप कोडबेस में उन सुरागों का पालन कर सकते हैं और अतिरिक्त लॉगिंग उपकरण जोड़ सकते हैं। –

उत्तर

19

मुझे Trevor Norris on this one for helping to modify node.js itself पर भारी प्रोप देना होगा जैसे कि यह त्रुटि होने पर यह स्वचालित रूप से एक हीप डंप उत्पन्न करेगी।

आखिरकार मेरे लिए इस समस्या को हल करने के लिए, और अधिक प्रचलित था। मैंने कुछ सरल कोड लिखा है जो प्रत्येक आने वाले एपीआई अनुरोध के लॉग फ़ाइल में एंडपॉइंट जोड़ता है। मैं ~ 10 डेटा पॉइंट्स (क्रैश) इकट्ठा करने का इंतजार कर रहा था और क्रैश से 60 सेकंड पहले चलाए गए एंडपॉइंट्स की तुलना करता था। मैंने पाया कि 9/10 मामलों में, एक ही अंतराल जो दुर्घटना से ठीक पहले मारा गया था।

वहां से, यह कोड में गहरी खुदाई करने की बात थी। मैंने सब कुछ नीचे दिखाया - मेरे मोंगो डीबी प्रश्नों से कम डेटा लौटा रहा है, किसी ऑब्जेक्ट से केवल कॉलबैक पर आवश्यक डेटा पास कर रहा है, आदि। अब हम किसी भी सर्वर पर एक भी क्रैश के बिना औसत से 6x लंबा हो गए हैं, जिससे मुझे अग्रणी आशा कि यह हल हो गया है ... अभी के लिए।

+11

मैंने एक एनपीएम पैकेज बनाया है जिसमें अब यह कार्यक्षमता है: https://npmjs.org/package/ofe –

+0

और फिर हीप डंप फ़ाइल खोलें: क्रोम देव उपकरण -> प्रोफाइल -> लोड – sscarduzio

4

क्या आप उस ऑब्जेक्ट पर एक रिकर्सन मुद्दा हो सकते हैं जिसे आप क्रमबद्ध कर रहे हैं, यह शुरू करने के लिए बस इतना बड़ा है, और रिकर्सन एक मुद्दा बनने से पहले स्मृति से बाहर हो जाता है?

मैंने इस कारण से safe-clone-deep एनपीएम मॉड्यूल बनाया ... मूल रूप से आप निम्न कार्य करना चाहेंगे।

var clone = require('safe-clone-deep'); 
... 
    return JSON.stringify(clone(originalObject)); 

यह आपको किसी भी वस्तु को क्लोन करने की अनुमति देगा जो तब सुरक्षित रूप से क्रमबद्ध होगा। साथ ही, यदि Error से प्राप्त वस्तुओं में से एक यह विरासत में name, message और stack गुणों को क्रमबद्ध करेगा, क्योंकि ये आमतौर पर क्रमबद्ध नहीं होते हैं।

+0

मैंने इस समस्या को अनंत रिकर्सन में मारा जहां मैंने एक ही ऑब्जेक्ट को अपने आप में रखा था। – ThisClark

49

सिर्फ इसलिए कि इस पल में गूगल पर शीर्ष जवाब है, मुझे लगता है मैं एक मामले मैं सिर्फ भर में भाग गया के लिए एक समाधान जोड़ा जाने लगा:

मैं EJS टेम्पलेट के साथ एक्सप्रेस का उपयोग करते हुए इस मुद्दे था - मुद्दा था कि मैं एक EJS ब्लॉक बंद करने में विफल रहा है, और फ़ाइल जे एस कोड था - कुछ इस तरह:

var url = '<%=getUrl("/some/url")' 
/* lots more javascript that ejs tries to parse in memory apparently */ 

यह स्पष्ट रूप से एक सुपर विशिष्ट मामला है, ओ पी के समाधान समय के बहुमत इस्तेमाल किया जाना चाहिए। हालांकि, ओपी का समाधान इस के लिए काम नहीं करेगा (ईजेएस स्टैक ट्रेस ofe द्वारा सामने नहीं आएगा)।

+7

आपने अभी मुझे बचाया है बहुत समय सर .. इसे जोड़ने के लिए धन्यवाद। मेरा मामला बिल्कुल ठीक था, बस अनजान ईजेएस टैग को ट्रैक करना पड़ा। –

+4

मेरे पास <% = user.username%> के बजाय <% = user.username => था ... यह मुझे खोजने के लिए कुछ दिन लगे-_- – zshift

+2

SailsJS + EJS – Bdwey

10

इस समस्या के लिए कोई एक समाधान है।
मैंने विभिन्न मामलों को पढ़ा, जिनमें से अधिकांश जेएस से संबंधित हैं, लेकिन मेरे मामले में, उदाहरण के लिए, केवल एक टूटा हुआ जेड टेम्पलेट लूप था जो कोड बग के कारण अनंत था।

मुझे लगता है कि सिर्फ एक वाक्यविन्यास त्रुटि है कि नोड अच्छी तरह से प्रबंधित नहीं करता है।
अपना कोड जांचें या समस्या को ढूंढने के लिए इसे पोस्ट करें।

1

मेरे मामले में मैंने [] का उपयोग करके एक सहयोगी सरणी (ऑब्जेक्ट) शुरू किया था। जैसे ही मैंने इसे शुरू किया {} समस्या दूर हो गई।

1

मेरे मामले में, एक फ़ाइल जिसे मैं विकास के दौरान डीबी के बीज के लिए उपयोग कर रहा था, रिसाव का कारण बन रहा था। कुछ कारणों से नोड को फ़ाइल के अंत में एक बहु-पंक्ति टिप्पणी पसंद नहीं आया। मैं इसके साथ कुछ भी गलत नहीं देख सकता, लेकिन उन्मूलन की प्रक्रिया का मतलब है कि मुझे पता है कि यह इस फ़ाइल का यह खंड है।

6

मेरे मामले में मैं टोपी उत्पादन तैनाती (Capistrano) के माध्यम से और संपत्ति के दौरान रेल 4.2.1 तैनाती की गई थी प्राप्त precompile:

रेक stdout: रेक निरस्त! ExecJS :: RuntimeError: गंभीर त्रुटि: निकासी आबंटन में विफल रहा है - स्मृति से बाहर प्रक्रिया (execjs): 1

मैं active_admin के माध्यम से एक दर्जन से अधिक डेटा के आयात को पहले समाप्त हो चुकी थी और इसे इस्तेमाल किया है करने के लिए सभी रैम

प्रकट होता है

समाधान: सर्वर को पुनः आरंभ और तैनाती के लिए पहली बार भाग गया ....

+1

के साथ एक ही जारी किया गया था क्या आप इसके लिए दीर्घकालिक समाधान? प्रत्येक तैनाती पर सर्वर को पुनरारंभ करना टिकाऊ नहीं है। धन्यवाद – Dennis

+1

एक सर्वर ने भी मेरे लिए इस समस्या को हल किया है। – Tintin81

+0

मैं वेबपैक के साथ कोणीय 4 सार्वभौमिक पर काम कर रहा था, मैं निर्माण करने की कोशिश कर रहा था, लेकिन इसे अमेज़ॅन ec2 सर्वर पर स्मृति त्रुटि से बाहर कर रहा था, सर्वर रीबूट ने मेरी समस्या को ठीक किया। –

1

अनेक मामलों का विश्लेषण, सबसे आम समस्या अनंत लूप का है। एक जटिल ऐप में हल करना मुश्किल होगा, जहां टेस्ट संचालित विकास आसान हो जाता है !!

0

साझा करना यहाँ क्या हो:

मैं, इस समस्या के साथ कुछ दिनों के लिए खो दिया जब तक मैंने पाया कि कुछ फ़ाइल में मैं एक स्थिर फ़ाइल, एक builded फ़ाइल से एक वर्ग का आयात किया गया था। यह निर्माण प्रक्रिया को कभी खत्म नहीं करता है। कुछ ऐसा:

import PropTypes from "../static/build/prop-types"; 

वास्तविक स्रोत को ठीक करने से सभी समस्या हल हो गई।

0

एडब्ल्यूएस उदाहरण पर एनपीएम 5.0.3 का उपयोग करके, हमें एनपीएम वैश्विक फ़ोल्डर पर मुद्दों की अनुमति थी, जो शायद हमारे साथ ऐसा होने का कारण बन गया है। हम भाग गए: sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share} अब यह ठीक काम करता है

संबंधित मुद्दे