7

निष्पादित करने के लिए वीएम का उपयोग करते समय नोडजेएस मेमोरी लीक अविश्वसनीय कोड को सुरक्षित रूप से चलाने के लिए मैं नोडजेएस VM Module का उपयोग कर रहा हूं। मैंने एक बड़ी मेमोरी रिसाव देखी है जो प्रत्येक निष्पादन पर लगभग 10 एम मेमोरी लेती है और इसे जारी नहीं करती है। आखिरकार, मेरी नोड प्रक्रिया 500 एम + मेमोरी का उपयोग कर समाप्त होती है। कुछ खुदाई के बाद, मैंने समस्या को वीएम के निरंतर निर्माण के लिए खोजा। मेरे सिद्धांत का परीक्षण करने के लिए, मैंने उस कोड को टिप्पणी की जो वीएम बनाता है। निश्चित रूप से, स्मृति उपयोग नाटकीय रूप से गिरा दिया। मैंने फिर कोड को असम्बद्ध कर दिया और global.gc() को समस्या क्षेत्रों के आसपास रणनीतिक रूप से कॉल किया और एक्सपोज़-जीसी ध्वज के साथ नोड चलाया। इससे मेरी स्मृति उपयोग नाटकीय रूप से कम हो गई और कार्यक्षमता बरकरार रही।अविश्वसनीय कोड

क्या इसका उपयोग करने के बाद वीएम को साफ करने का कोई बेहतर तरीका है?

मेरा अगला दृष्टिकोण कैश है वीएम दिया असुरक्षित कोड युक्त और यह पुन: उपयोग अगर यह मैं फिर से (पृष्ठभूमि असुरक्षित कोड देखें: मैं दे रहा हूँ उन पाठ के ब्लॉक के लिए अपने स्वयं के पार्स समारोह लिखते हैं, इस प्रकार, असुरक्षित कोड को अक्सर निष्पादित किया जाता है या एक बार निष्पादित किया जाता है और फिर कभी नहीं देखा जाता है)।

कुछ संदर्भ कोड।

async.each(items,function(i,cb){ 
      // Initialize context... 
      var context = vm.createContext(init); 

      // Execute untrusted code 
      var captured = vm.runInContext(parse, context); 

      // This dramatically improves the usage, but isn't 
      // part of the standard API 
      // global.gc(); 

      // Return Result via a callback 
      cb(null,captured); 
    }); 
+1

इस https://github.com/joyent/node/issues/6552 –

+1

के लिए बस node.js github समस्या के लिए लिंक करें VM मॉड्यूल अविश्वसनीय कोड चलाने के लिए पर्याप्त नहीं है। अविश्वसनीय भाग –

+1

में 'जबकि (सत्य) {}' लिखने का प्रयास करें इस समस्या को अब यहां ट्रैक किया जा सकता है: https://github.com/nodejs/node/issues/3113/joyent repo का लिंक अब पुराना है । – Jeffrey

उत्तर

1

जब मैं यह अधिकार इस v5.9.0 में तय किया गया था देखते हैं, this PR देखते हैं। ऐसा लगता है कि उन मामलों में node कोर रखरखाव और न ही प्रोग्रामर दोनों बहुत कुछ कर सकते हैं - हमें v8 में अपस्ट्रीम फिक्स के लिए बहुत अधिक इंतजार करना है।

तो नहीं, आप इसके बारे में और कुछ नहीं कर सकते हैं। हालांकि इस बग को पकड़ना अच्छा था!

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