2010-01-22 21 views
11

नोट: मैं सवाल Memory management in memory intensive application के बारे में पता कर रहा हूँ, फिर भी उस सवाल का अनुप्रयोग जो लगातार स्मृति आवंटन बनाने के बारे में प्रतीत होता है, जबकि मेरे सवाल जानबूझकर के रूप में ज्यादा भौतिक स्मृति का उपभोग करने के लिए डिज़ाइन अनुप्रयोगों के बारे में है जैसा सुरक्षित हैमेमोरी मैनेजमेंट गहन अनुप्रयोगों

मेरे पास एक सर्वर अनुप्रयोग है जो कैशिंग और अन्य अनुकूलन (SQL सर्वर सोचने) को करने के लिए बड़ी मात्रा में स्मृति का उपयोग करता है। यह एप्लिकेशन एक समर्पित मशीन पर चलता है, और इसलिए सिस्टम पर अन्य अनुप्रयोगों को प्रभावित करने की चिंता किए बिना थ्रूपुट और प्रतिक्रिया समय को बढ़ाने और बढ़ाने के लिए जितना चाहें उतना मेमोरी उपभोग कर सकता है (और चाहिए)।

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

कुछ मान्यताओं:

  • आवेदन एक समर्पित मशीन पर चल रहा है
  • आवेदन की स्मृति आवश्यकताओं मशीन पर भौतिक स्मृति (से अधिक है कि है, अगर अतिरिक्त मेमोरी यह आवेदन के लिए उपलब्ध था प्रतिक्रिया समय या थ्रूपुट में सुधार करने के लिए हमेशा उस मेमोरी का उपयोग करने में सक्षम होंगे)
  • स्मृति प्रभावी ढंग से इस तरह से प्रबंधित की जाती है कि स्मृति विखंडन कोई मुद्दा नहीं है।
  • एप्लिकेशन जानता है कि स्मृति को सुरक्षित रूप से मुक्त किया जा सकता है, और कम से कम प्रदर्शन प्रभाव के लिए सबसे पहले स्मृति को मुक्त किया जाना चाहिए।
  • एक Windows मशीन पर अनुप्रयोग रन

मेरा प्रश्न है - कैसे मैं इस तरह के एक आवेदन में स्मृति आवंटन संभाल चाहिए? विशेष रूप से:

  • मैं कैसे अनुमान लगा सकता हूं कि स्मृति आवंटन विफल हो जाएगा या नहीं?
  • क्या यह सुनिश्चित करने के लिए कि कोर ओएस ऑपरेशंस उत्तरदायी रहे (और इस तरह से अनुप्रयोग प्रदर्शन पर प्रतिकूल प्रभाव नहीं डालते), और मैं यह कैसे पता लगा सकता हूं कि यह कितनी मेमोरी है?

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

मैं एक सी # डेवलपर हूं, हालांकि मेरी आशा यह है कि इस तरह के किसी भी ऐप के लिए बुनियादी अवधारणाएं भाषा के बावजूद समान हैं।

+0

बीटीडब्ल्यू - मैं आभासी बनाम भौतिक स्मृति की जटिलताओं के कारण जानबूझकर "स्मृति" शब्द के बारे में सोच रहा हूं। इसी कारण से मैंने 32 बिट बनाम 64 बिट का उल्लेख नहीं किया है। – Justin

उत्तर

1

लिनक्स में, स्मृति उपयोग प्रतिशत निम्न स्तरों में बांटा गया है।

0 - 30% - कोई स्वैपिंग 30 - 60% - स्वादिष्ट गंदे पृष्ठ केवल 60 - 90% - एलआरयू नीति के आधार पर साफ पृष्ठ स्वैप करें।

90% - ओओएम (स्मृति से बाहर) हत्यारा को आमंत्रित करें और अधिकतम मेमोरी लेने वाली प्रक्रिया को मार दें।

जांच इस - http://linux-mm.org/OOM_Killer

थिंक खिड़कियों में, समान नीति हो सकता है तो आप स्मृति आँकड़े की जाँच करें और सुनिश्चित करें कि आप कभी नहीं अधिकतम सीमा को पाने के कर सकते हैं।

अधिक मेमोरी लेने से रोकने का एक तरीका सोना है और मेमोरी क्लीनअप थ्रेड चलाने के लिए और अधिक समय देना है।

0

यह एक बहुत अच्छा सवाल है, और यह भी व्यक्तिपरक होने के लिए बाध्य है, क्योंकि सी # के मौलिक की प्रकृति यह है कि सभी स्मृति प्रबंधन रनटाइम द्वारा किया जाता है, यानी कचरा कलेक्टर। कचरा कलेक्टर एक गैर-निर्धारक इकाई है जो स्मृति को कितनी बार विभाजित करता है, इस पर निर्भर करता है कि जीसी पहले से जानना आसान होगा, ऐसा करना आसान नहीं है।

मेमोरी को व्यवस्थित ढंग से प्रबंधित करने के लिए थकाऊ लगता है लेकिन सामान्य ज्ञान लागू होता है, जैसे कि using खंड को ऑब्जेक्ट का निपटारा सुनिश्चित करने के लिए। OutOfMemory Exception को फंसाने के लिए आप एक ही हैंडलर में डाल सकते हैं, लेकिन यह एक अजीब तरीका है, क्योंकि यदि प्रोग्राम मेमोरी से बाहर हो गया है, तो क्या प्रोग्राम बस जब्त हो जाता है, और बम आउट हो जाता है, या जीसी के लिए धैर्यपूर्वक इंतजार करना चाहिए , फिर से यह तय करना मुश्किल है।

सिस्टम का भार जीसी के काम को प्रतिकूल रूप से प्रभावित कर सकता है, लगभग डेनियल ऑफ सर्विस के बिंदु पर, जहां सबकुछ बस बंद हो जाता है, मशीन के विनिर्देशों के बाद से, या उस की प्रकृति क्या है मशीन का काम अज्ञात है, मैं इसे पूरी तरह से जवाब नहीं दे सकता, लेकिन मुझे लगता है कि इसमें रैम का भार है ..

संक्षेप में, एक उत्कृष्ट सवाल है, मुझे लगता है कि आपको इसके बारे में चिंता नहीं करनी चाहिए और इसे .NET पर छोड़ना चाहिए स्मृति आवंटन/विखंडन को संभालने के लिए सीएलआर क्योंकि यह एक बहुत अच्छा काम करता है।

उम्मीद है कि यह मदद करता है, सर्वश्रेष्ठ संबंध, टॉम।

0

आपका प्रश्न मुझे पुरानी चर्चा "So what's wrong with 1975 programming ?" की याद दिलाता है। varnish-cache के आर्किटेक्ट का तर्क है कि ओएस को रास्ते से बाहर निकलने और स्वयं को सभी मेमोरी प्रबंधित करने के बजाय, आपको ओएस के साथ सहयोग करना चाहिए और यह समझना चाहिए कि आप स्मृति के साथ क्या करना चाहते हैं।

उदाहरण के लिए, डिस्क से डेटा पढ़ने की बजाय, आपको memory-mapped files का उपयोग करना चाहिए। यह ओएस को दुर्लभ होने पर डिस्क पर डेटा को लिखने के लिए अपने एलआरयू एल्गोरिदम लागू करने की अनुमति देता है। उसी समय, जब तक पर्याप्त स्मृति हो, तब तक आपका डेटा स्मृति में रहेगा। इस प्रकार, आपका आवेदन संभावित रूप से सभी स्मृति का उपयोग कर सकता है, बिना मारने के जोखिम के।

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