Node.js स्पॉन के बाद एनोमेम त्रुटि को पकड़ते हैं


84

मेरा Node.js स्क्रिप्ट स्पॉन का उपयोग करते समय फेंके गए ENOMEM (मेमोरी से बाहर) के कारण दुर्घटनाग्रस्त हो जाता है ।

त्रुटि:

child_process.js:935
  throw errnoException(process._errno, 'spawn');
        ^

Error: spawn ENOMEM
  at errnoException (child_process.js:988:11)
  at ChildProcess.spawn (child_process.js:935:11)
  at Object.exports.spawn (child_process.js:723:9)
  at module.exports ([...]/node_modules/zbarimg/index.js:19:23)

मैं पहले से ही श्रोताओं errorऔर exitघटना के लिए उपयोग कर रहा हूं , लेकिन इस त्रुटि के मामले में उनमें से अधिकांश को निकाल दिया गया।

मेरा कोड:

zbarimg = process.spawn('zbarimg', [photo, '-q']);
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... }); 

पूर्ण स्रोत कोड उपलब्ध है

क्या स्क्रिप्ट को दुर्घटनाग्रस्त होने से बचाने के लिए मैं कुछ भी कर सकता हूं? मैं फेंकी गई ENOMEM त्रुटि को कैसे पकड़ूं?

धन्यवाद!


क्या आपके पास एक उदाहरण छवि है जिसका उपयोग समस्या को दोहराने के लिए किया जा सकता है?
mscdex

यह तब होता है जब सर्वर मेमोरी से बाहर होता है और किसी विशेष छवि के साथ पुन: पेश नहीं किया जा सकता है। यह परीक्षण करने के लिए कठिन बनाता है: - /
tobi

आप errorहैंडलर के अंदर क्या कर रहे हैं ?
mscdex

1
क्या आपको इस समस्या का हल मिला?
sffc

2
मुझे लगता है कि यह fork()(अंतर्निहित syscall) उपयोग करने के साथ एक मौलिक दोष है । देखिए github.com/nodejs/node/issues/25382
ZachB

जवाबों:


204

मेरे पास एक ही समस्या थी और जैसा कि यह निकला, मेरे सिस्टम में कोई स्वैप स्थान सक्षम नहीं था । जाँच करें कि क्या यह कमांड चलाकर किया गया है free -m:

vagrant@vagrant-ubuntu-trusty-64:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2002        233       1769          0         24         91
-/+ buffers/cache:        116       1885
Swap:            0          0          0

नीचे की पंक्ति को देखकर हम देख सकते हैं कि हमारे पास कुल 0 बाइट्स स्वैप मेमोरी है। अच्छा नही। नोड को बहुत अधिक मेमोरी की भूख लग सकती है और अगर मेमोरी खत्म होने पर कोई स्वैप स्पेस उपलब्ध नहीं है, तो त्रुटियां होती हैं।

स्वैप फ़ाइल जोड़ने की विधि ऑपरेटिंग सिस्टम और वितरण के बीच भिन्न होती है, लेकिन यदि आप मेरे जैसे Ubuntu चला रहे हैं, तो आप स्वैप फ़ाइल जोड़ने पर इन निर्देशों का पालन कर सकते हैं :

  1. sudo fallocate -l 4G /swapfile एक 4 गीगाबाइट स्वैपैप बनाएं
  2. sudo chmod 600 /swapfile रूट तक पहुंच को प्रतिबंधित करके स्वैपफाइल को सुरक्षित करें
  3. sudo mkswap /swapfile फ़ाइल को स्वैप स्पेस के रूप में चिह्नित करें
  4. sudo swapon /swapfile स्वैप सक्षम करें
  5. echo "/swapfile none swap sw 0 0" | sudo tee -a /etc/fstabरीबूट्स पर स्वैप्टाइल बने रहें (टिप, बाम के लिए धन्यवाद !)

15
भविष्य में किसी के लिए भी एक नोट जो इस उत्तर को पढ़ रहा है। स्वैफाइल रिबूट पर स्थिर नहीं है। इसे लगातार
बनाये रखने के

बस मेरी बेवकूफ़ वीएम 2 और अधिक घूंट के राम ने मेरे उपरोक्त मुद्दे को हल किया।
थॉमसन कॉमर

2
क्या यह उत्पादन सर्वर पर एक अच्छा विचार है? मेरी समझ यह है कि जब ओएस स्वैप मेमोरी का उपयोग करना शुरू करता है, तो प्रदर्शन में तेजी से गिरावट आ सकती है, इसलिए अनुप्रयोगों की ज़रूरतों को संभालने के लिए पर्याप्त रैम के साथ अपने सर्वर को आकार देना बेहतर है, और मेमोरी लीक को आक्रामक रूप से शिकार करना है।
जोश

2
@ जोश, जब राम दो चीजों में से एक होगा, तब - या तो स्मृति को एक स्वैप के लिए मंच मिलेगा या अतिरिक्त मेमोरी के लिए कोई भी अनुरोध अप्रत्याशित परिणामों के साथ विफल हो जाएगा। हां, जब एक अदला-बदली का उपयोग किया जाता है तो प्रदर्शन कम हो सकता है लेकिन मैं किसी भी दिन दूसरे विकल्प पर ले जाऊंगा, विशेष रूप से उत्पादन में।
कैवोसुकल्तेजा

मैंने मेमोरी को डबल नहीं किया और आकार बदलने की आवश्यकता है? मैं यह कैसे करु?
जैक

5

यदि आप कभी भी एडब्ल्यूएस लैंबडा में इस समस्या में भाग लेते हैं, तो आपको फ़ंक्शन को आवंटित मेमोरी बढ़ाने पर विचार करना चाहिए।


2

आप इस आदेश के साथ मेमोरी नोड के उपयोग की मात्रा को बदलने का प्रयास कर सकते हैं: node ----max-old-space-size=1024 yourscript.js

-मैक्स-पुराने-अंतरिक्ष-आकार = 1024 मेमोरी के 1 गीगा आवंटित करेगा।

डिफ़ॉल्ट नोड द्वारा 512 एमबी रैम का उपयोग किया जाएगा, लेकिन आपके प्लेटफॉर्म के आधार पर आपको कम या ज्यादा आवंटित करने की आवश्यकता हो सकती है ताकि कचरा संग्रह आपको जरूरत पड़ने पर किक मार सके।

यदि आपके प्लेटफ़ॉर्म में 500 एमबी से कम रैम उपलब्ध है, तो स्मृति उपयोग को कम से कम - मैक्स-पुराने-स्थान-आकार = 256 पर सेट करने का प्रयास करें।


1

मैं एक ही समस्या है और कोशिश / पकड़ के साथ तय किया गया है:

try {
  zbarimg = process.spawn('zbarimg', [photo, '-q']);
} catch (err) {
  console.log(err);
}
zbarimg.on('error', function(err) { ... });
zbarimg.on('close', function(code) { ... }); 

0

मैंने केवल अपने नोड सर्वर को अक्षम और पुनः सक्षम करके समस्या को ठीक किया।


-6

आपको आउटपुट को प्रक्रिया से फ्लश करना होगा!

एक अजगर उदाहरण इस तरह दिखता है:

import sys
...
sys.stdout.flush()

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