ओओएम-किलर सिर्फ उस प्रक्रिया को नहीं मार सकता है जो बहुत अधिक मांगता है?


12

यह यहाँ बताया गया है कि OOM-Killer को इसके माध्यम से कॉन्फ़िगर किया जा सकता है overcommit_memoryऔर:

  • 2 = कोई ओवरकम नहीं है। बहुत अधिक पूछने पर आवंटन विफल हो जाते हैं।
  • 0, 1 = ओवरकॉम्मिट (वह या हमेशा)। मारने के कुछ प्रक्रिया (ते) कुछ heuristics जब बहुत अधिक स्मृति वास्तव में पहुँचा जा सकता है पर आधारित है।

अब, मैं पूरी तरह से गलत समझ सकता हूं, लेकिन उस प्रक्रिया को मारने के लिए कोई विकल्प नहीं है (या यह डिफ़ॉल्ट क्यों नहीं है) जो वास्तव में आवंटित स्मृति को एक्सेस करने की कोशिश करता है?


क्या होगा अगर एक महत्वपूर्ण प्रणाली प्रक्रिया बहुत अधिक मेमोरी के लिए पूछती है?
लॉरेंस

पहली जगह में - यह यह कर सकता है। लेकिन, उस प्रश्न के साथ सबसे बड़ी समस्या यह है कि सभी संभावना में अगर कोई प्रक्रिया मेमोरी के लिए कह रही है तो उसे नए तरीके से निष्पादित किया जा रहा है - या, दूसरे शब्दों में, यह एक नई प्रक्रिया है जो बहुत ही वर्तमान प्रसंस्करण में शामिल है। क्या आप इसके बजाय OOM ने आपके नॉट-ओपन-फॉर-थ्री-डे इम क्लाइंट को सिस्टम मेमोरी को बर्बाद करने की अनुमति दी या आप इस वर्ष YouTube को वास्तव में कुछ समय के लिए लोड करेंगे? linuxatemyram.com
mikeserv

3
यह वही है जो no overcommitविकल्प अनिवार्य रूप से करता है। यदि कोई प्रक्रिया बहुत अधिक मेमोरी मांगती है, तो वह विफल हो जाती है। यदि यह त्रुटि की जाँच करता है, तो यह आमतौर पर खुद को मार देगा; यदि ऐसा नहीं होता है, तो संभवत: यह एक सेगमेंटेशन त्रुटि प्राप्त करेगा, जब यह अशक्त सूचक को malloc()वापस करने की कोशिश करता है , और यह दुर्घटनाग्रस्त हो जाएगा।
बमर

ध्यान दें कि 2 वास्तव में no overcommitमोड है, उद्धृत स्रोतों के अनुसार (जैसे कि kernel.org/doc/Documentation/vm/overcommit-accounting )। मुझे लगता है कि मैं आपके प्रश्न को तदनुसार संपादित करूंगा।
hans_meine

जवाबों:


23

इस परिदृश्य पर विचार करें:

  • आपके पास 4GB मेमोरी फ्री है।
  • एक दोषपूर्ण प्रक्रिया 3.999GB आवंटित करती है।
  • आप भगोड़ा प्रक्रिया को मारने के लिए एक कार्य प्रबंधक खोलते हैं। कार्य प्रबंधक 0.002GB आवंटित करता है।

यदि वह प्रक्रिया जो मारी गई है, वह स्मृति का अनुरोध करने की अंतिम प्रक्रिया थी, तो आपका कार्य प्रबंधक मारा जाएगा।

या:

  • आपके पास 4GB मेमोरी फ्री है।
  • एक दोषपूर्ण प्रक्रिया 3.999GB आवंटित करती है।
  • आप भगोड़ा प्रक्रिया को मारने के लिए एक कार्य प्रबंधक खोलते हैं। X सर्वर कार्य प्रबंधक की विंडो को संभालने के लिए 0.002GB आवंटित करता है।

अब आपका एक्स सर्वर मारा गया। यह समस्या का कारण नहीं था; यह सिर्फ "गलत समय पर गलत जगह पर था"। यह अधिक स्मृति को आवंटित करने की पहली प्रक्रिया के रूप में हुआ जब कोई भी नहीं बचा था, लेकिन यह वह प्रक्रिया नहीं थी जिसके साथ शुरू करने के लिए सभी मेमोरी का उपयोग किया गया था।


अपने उदाहरण का विस्तार करने के लिए इसका मतलब है कि यदि कोई प्रक्रिया आपकी मेमोरी का 99.999% उपभोग कर रही है तो आप इसे कभी भी नहीं मार पाएंगे क्योंकि यह किसी भी चीज़ को मार सकता है, इसे मेमोरी की आवश्यकता होगी और इस प्रकार गलत प्रक्रिया से पहले ही खुद को मार दिया जा सकता है!
स्लेज

13
ध्यान रहे, यह लिनक्स दर्शन है, आवश्यक तथ्य नहीं है। विंडोज 3.0 ने ओओएम हैंडलिंग के लिए आवश्यक संवादों सहित पर्याप्त मेमोरी आरक्षित करके इसे हल किया।
एमएसलटर्स

@MSalters: यह वास्तव में उदाहरण के लिए लागू नहीं होता है, हालांकि; उदाहरण एक ऐसी प्रक्रिया के बारे में था जिसने लगभग सभी मेमोरी को आरक्षित कर दिया है , अर्थात। खुद को मारने के लिए पर्याप्त नहीं OOM को मार डाला। जाहिर है किसी भी OS पर OOM हैंडलिंग के लिए पर्याप्त मेमोरी आरक्षित होनी चाहिए। लेकिन OOM हैंडलिंग को लागू करने वाली प्रक्रिया अगली प्रक्रिया होगी जो मेमोरी को आरक्षित करने के लिए होती है, न कि किसी के दुर्व्यवहार के लिए। जब तक, निश्चित रूप से, आपका मतलब था कि विंडोज 3.0 में हमेशा रनिंग टास्क मैनेजर के लिए पर्याप्त मेमोरी आरक्षित थी, या यह कि ओओएम हैंडलर ने हमेशा उपयोगकर्ता को मारने की प्रक्रिया के लिए प्रेरित किया। (जो! = ​​आपत्तिजनक प्रक्रिया को मार रहा है)
अलेक्सी तोहारामो

3
@AleksiTorhamo: मेरा वास्तव में उत्तरार्द्ध था। विंडोज 3.0 में एक फुलब्लॉक टास्क मैनेजर नहीं था, इसमें प्रसिद्ध नीली स्क्रीनें थीं जिनकी मेमोरी को प्रचारित किया गया था।
MSalters
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.