हम्म, मैं पूरी तरह से overcommit और OOM हत्यारे के पक्ष में तर्क से आश्वस्त नहीं हूँ ... जब womble लिखते हैं,
"OOM किलर तभी कहर बरपाता है, जब आपने अपने सिस्टम को ओवरलोड कर दिया हो। इसे पर्याप्त स्वैप दें, और ऐसे एप्लिकेशन न चलाएं जो अचानक भारी मात्रा में रैम खाने का निर्णय लेते हैं, और आपको कोई समस्या नहीं होगी।"
वह एक ऐसे पर्यावरण परिदृश्य का वर्णन करने के बारे में है, जहां ओवरकमिट और ओओएम किलर को लागू नहीं किया जाता है, या 'वास्तव में' अधिनियम नहीं है (यदि सभी अनुप्रयोगों को आवश्यकतानुसार मेमोरी आवंटित की जाती है, और पर्याप्त वर्चुअल मेमोरी आवंटित की जानी थी, मेमोरी राइट्स बिना मेमोरी आवंटन का बारीकी से अनुसरण करेगा। त्रुटियों, तो हम वास्तव में एक overcommited प्रणाली के बारे में बात नहीं कर सकता, भले ही एक overcommit रणनीति सक्षम थे)। यह एक अंतर्निहित प्रवेश के बारे में है कि जब उनके हस्तक्षेप की आवश्यकता नहीं होती है, तो ओवरकमेट और ओओएम हत्यारा सबसे अच्छा काम करता है, जिसे किसी तरह इस रणनीति के अधिकांश समर्थकों द्वारा साझा किया जाता है, जहां तक मैं बता सकता हूं (और मैं मानता हूं कि मैं बहुत कुछ नहीं बता सकता ...)। Morover, विशिष्ट व्यवहार के साथ अनुप्रयोगों का जिक्र करते हुए जब मेमोरी का प्रचार करते हुए मुझे लगता है कि डिफॉल्ट होने के बजाय वितरण स्तर पर एक विशिष्ट हैंडलिंग को ट्यून किया जा सकता है,
JVM किस चिंता के लिए है, ठीक है, यह एक आभासी मशीन है, कुछ हद तक इसे स्टार्टअप पर जितने भी संसाधन चाहिए, उसे आवंटित करने की आवश्यकता है, इसलिए यह अपने अनुप्रयोगों के लिए अपना 'नकली' वातावरण बना सकता है, और अपने उपलब्ध संसाधन को मेजबान से अलग रख सकता है। पर्यावरण, जहाँ तक संभव हो। इस प्रकार, 'बाहरी' OOM स्थिति (ओवरकॉमिट / OOM किलर / जो भी हो) के परिणामस्वरूप थोड़ी देर के बाद, या इसके बाद भी ऐसी स्थिति के लिए पीड़ित होने के बजाय स्टार्टअप पर विफल होना बेहतर हो सकता है। आंतरिक OOM हैंडलिंग रणनीतियों (सामान्य तौर पर, एक वीएम को शुरुआत से ही कोई आवश्यक संसाधन प्राप्त करने चाहिए और मेजबान सिस्टम को अंत तक उन्हें 'अनदेखा' करना चाहिए, उसी तरह किसी भी भौतिक ग्राफिक्स के साथ साझा की गई राम की राशि कभी नहीं होती है - और नहीं हो सकती है - ओएस द्वारा छुआ)।
अपाचे के बारे में, मुझे संदेह है कि पूरे सर्वर को कभी-कभी मार दिया जाता है और फिर से चालू किया जाता है, एक एकल कनेक्शन के साथ-साथ एकल बच्चे को देने से बेहतर है, इसके (= बच्चे के / कनेक्शन की) शुरुआत से असफल (जैसे कि यह एक नया उदाहरण था) एक और उदाहरण के चलने के बाद निर्मित JVM)। मुझे लगता है कि सबसे अच्छा 'समाधान' एक विशिष्ट संदर्भ पर निर्भर हो सकता है। उदाहरण के लिए, एक ई-कॉमर्स सेवा पर विचार करना, कभी-कभी बेहतर हो सकता है, कभी-कभी, शॉपिंग चार्ट के कुछ कनेक्शन पूरी सेवा को खोने के बजाय बेतरतीब ढंग से विफल हो जाते हैं, उदाहरण के लिए, चल रहे ऑर्डर को अंतिम रूप देने के लिए, या (शायद बदतर) एक भुगतान प्रक्रिया, मामले के सभी परिणामों के साथ (शायद हानिरहित, लेकिन शायद हार्मफुल हो - और निश्चित रूप से, जब एक संभव हो,
उसी तरह, एक कार्य केंद्र पर प्रक्रिया जो सबसे अधिक संसाधनों का उपभोग करती है, और इसलिए ओओएम किलर के लिए पहली पसंद होने के लिए एक मेमोरी इंटेंसिव एप्लिकेशन हो सकता है, जैसे कि वीडियो ट्रांसकोडर, या एक रेंडरिंग सॉफ्टवेयर, केवल आवेदन की संभावना है। उपयोगकर्ता अछूता रहना चाहता है। यह विचार मुझे संकेत देता है कि OOM किलर डिफ़ॉल्ट नीति बहुत आक्रामक है। यह एक "सबसे खराब फिट" दृष्टिकोण का उपयोग करता है जो किसी न किसी फाइलसिस्टम के समान होता है (OOMK कोशिश करता है और जितनी अधिक हो सके उतनी मेमोरी मुक्त करता है, जबकि कम समय में किसी भी आगे के हस्तक्षेप को रोकने के लिए, मारे गए उपप्रकारों की संख्या को कम कर सकता है, जैसे कि साथ ही एक fs अधिक डिस्क स्थान आवंटित कर सकता है, तो वास्तव में एक निश्चित फ़ाइल के लिए आवश्यक है, किसी भी अन्य आवंटन को रोकने के लिए यदि फ़ाइल बढ़ी और इस प्रकार कुछ हद तक विखंडन को रोकती है)।
हालांकि, मुझे लगता है कि एक विपरीत नीति, जैसे कि 'सबसे अच्छा फिट' दृष्टिकोण, बेहतर हो सकता है, इसलिए एक निश्चित बिंदु पर आवश्यक सटीक मेमोरी को मुक्त करने के लिए, और 'बड़ी' प्रक्रियाओं से परेशान नहीं होना चाहिए, जो अच्छी तरह से बर्बाद हो सकता है। स्मृति, लेकिन यह भी नहीं पता हो सकता है, और कर्नेल यह नहीं जान सकता है कि (हम्म, मैं कल्पना कर सकता हूं कि पेज एक्सेस का पता लगाना गिनती और समय को इंगित कर सकता है यदि कोई प्रक्रिया मेमोरी आवंटित कर रही है तो उसे किसी और की आवश्यकता नहीं है, इसलिए यह अनुमान लगाने के लिए कि क्या एक प्रक्रिया है स्मृति को बर्बाद कर रहा है या सिर्फ एक बहुत का उपयोग कर रहा है, लेकिन एक्सेस देरी को एक मेमोरी और सीपीयू गहन अनुप्रयोग से बर्बाद होने वाली मेमोरी को अलग करने के लिए सीपीयू चक्रों पर भारित किया जाना चाहिए , लेकिन, जबकि संभावित रूप से गलत है, इस तरह के उत्तराधिकार में अत्यधिक ओवरहेड हो सकता है)।
इसके अलावा, यह सच नहीं हो सकता है कि कम संभव प्रक्रियाओं को मारना हमेशा एक अच्छा विकल्प है। उदाहरण के लिए, डेस्कटॉप वातावरण पर (एक नेटटॉप या सीमित संसाधनों के साथ एक नेटबुक के बारे में सोचें, नमूने के लिए) एक उपयोगकर्ता कई टैब के साथ एक ब्राउज़र चला रहा हो सकता है (इस प्रकार, मेमोरी की खपत - मान लें कि यह ओओएमके के लिए पहला विकल्प है) , प्लस कुछ अन्य एप्लिकेशन (गैर सहेजे गए डेटा के साथ एक शब्द प्रोसेसर, एक मेल क्लाइंट, एक पीडीएफ रीडर, एक मीडिया प्लेयर, ...), प्लस कुछ (सिस्टम) डेमॉन, और कुछ फ़ाइल प्रबंधक उदाहरण। अब, एक OOM त्रुटि होती है, और OOMK ब्राउज़र को मारने का विकल्प चुनता है, जबकि उपयोगकर्ता नेट पर कुछ 'महत्वपूर्ण' समझा जाता है ... उपयोगकर्ता निराश होगा। दूसरी ओर, कुछ फ़ाइल प्रबंधक को बंद करना '
वैसे भी, मुझे लगता है कि उपयोगकर्ता को स्वयं निर्णय लेने में सक्षम होना चाहिए कि क्या करना है। एक डेस्कटॉप (= इंटरएक्टिव) सिस्टम में, जो कि अपेक्षाकृत काफी आसान होना चाहिए, बशर्ते पर्याप्त संसाधन उपयोगकर्ता को किसी भी एप्लिकेशन को बंद करने के लिए कहने के लिए आरक्षित हों (लेकिन कुछ टैब को बंद करना भी पर्याप्त हो सकता है) और उसकी पसंद को संभालना (एक विकल्प हो सकता है) एक अतिरिक्त स्वैप फ़ाइल बनाने से युक्त है, अगर पर्याप्त जगह है)। सेवाओं के लिए (और सामान्य तौर पर), मैं दो और संभावित संवर्द्धन पर भी विचार करूँगा: एक OOM किलर इंटरवेन्ट्स को लॉग कर रहा है, साथ ही साथ प्रक्रियाएँ शुरू / असफलताओं को इस तरह से विफल किया जा सकता है कि विफलता को आसानी से डीबग किया जा सके (उदाहरण के लिए, एक एपीआई नई प्रक्रिया निर्माण या जारी करने की प्रक्रिया को सूचित करें - इस प्रकार, अपाचे जैसा सर्वर, उचित पैच के साथ, कुछ त्रुटियों के लिए एक बेहतर लॉगिंग प्रदान कर सकता है); यह ओवरकम / OOMK के प्रयास में होने से अनिर्णय से किया जा सकता है; दूसरे स्थान पर, लेकिन महत्व के लिए नहीं, OOMK एल्गोरिथ्म को ठीक करने के लिए एक तंत्र स्थापित किया जा सकता है - मुझे पता है कि यह संभव है, कुछ हद तक, प्रक्रिया के आधार पर एक प्रक्रिया पर एक विशिष्ट नीति को परिभाषित करने के लिए, लेकिन मैं एक लक्ष्य बनाऊंगा 'केंद्रीकृत' विन्यास तंत्र, प्रासंगिक प्रक्रियाओं की पहचान करने और उन्हें एक निश्चित डिग्री (महत्व के अनुसार सूचीबद्ध विशेषताओं) देने के लिए एक या एक से अधिक सूचियों के नाम (या आईडी) के आधार पर; इस तरह के एक तंत्र को (या कम से कम) भी स्तरित किया जाना चाहिए, ताकि एक शीर्ष-स्तरीय उपयोगकर्ता-परिभाषित सूची हो, एक प्रणाली- (वितरण-) परिभाषित सूची, और (निचले-स्तर) अनुप्रयोग-परिभाषित प्रविष्टियां (इसलिए उदाहरण के लिए, एक डीई फ़ाइल प्रबंधक किसी भी उदाहरण को सुरक्षित रूप से मारने के लिए ओओएमके को निर्देश दे सकता है,
Morover, एप्लिकेशन को रन-टाइम (स्मृति प्रबंधन उद्देश्यों के संबंध में और निष्पादन प्राथमिकता की परवाह किए बिना) को बढ़ाने या कम करने के लिए एक एपीआई प्रदान किया जा सकता है, ताकि, उदाहरण के लिए, एक वर्ड प्रोसेसर के साथ शुरू हो सके कम 'महत्व' लेकिन इसे बढ़ाएं क्योंकि किसी फ़ाइल में फ्लश करने से पहले कुछ डेटा को होल्ड किया जाता है, या एक लिखित ऑपरेशन किया जा रहा है, और कम महत्व फिर से एक बार ऐसे ऑपरेशन समाप्त हो जाता है (अनुरूपता से, एक फ़ाइल प्रबंधक तब बदल सकता है जब यह बस से पारित हो गया हो डेटा और वाइसवेरा से निपटने के लिए फ़ाइलों को अलग-अलग प्रक्रियाओं का उपयोग करने के बजाय, और अपाचे अलग-अलग बच्चों को अलग-अलग स्तर का महत्व दे सकते हैं, या sysadmins द्वारा तय की गई कुछ नीति के अनुसार बाल अवस्था को बदल सकते हैं और अपाचे के माध्यम से उजागर कर सकते हैं - या किसी भी तरह का सर्वर - सेटिंग्स)। बेशक, इस तरह के एपीआई का दुरुपयोग और दुरुपयोग किया जा सकता है, लेकिन मुझे लगता है कि कर्नेल की तुलना में एक मामूली चिंता है कि सिस्टम पर क्या हो रहा है और (या मेमोरी खपत / निर्माण का समय या समान रूप से) किसी भी प्रासंगिक जानकारी के बिना मेमोरी को फ्रीज करने के लिए प्रक्रियाओं को मार सकता है। मेरे लिए 'पर्याप्त रूप से प्रासंगिक या' मान्य करना) - केवल उपयोगकर्ता, व्यवस्थापक और कार्यक्रम लेखक ही यह निर्धारित कर सकते हैं कि क्या किसी कारण के लिए एक प्रक्रिया की 'फिर भी जरूरत' है, क्या कारण है, और / या यदि आवेदन राज्य में अग्रणी है मारे जाने पर नुकसान या अन्य नुकसान / परेशानियों के लिए; हालाँकि, कुछ धारणा अभी तक की जा सकती है, उदाहरण के लिए एक प्रक्रिया द्वारा अधिग्रहीत एक निश्चित प्रकार के संसाधनों की तलाश (फाइल डिस्क्रिप्टर, नेटवर्क सॉकेट्स इत्यादि) और लंबित संचालन के साथ यह बता सकता है कि क्या प्रक्रिया एक उच्चतर 'राज्य' की तुलना में होनी चाहिए एक सेट,
या, बस overcommitting से बचें और कर्नेल को बस वही करें जो एक कर्नेल को करना चाहिए, संसाधनों को आवंटित करना (लेकिन OOM किलर के रूप में उन्हें मनमाने ढंग से बचाव नहीं करना), प्रक्रियाओं को शेड्यूल करना, भुखमरी और गतिरोध (या उनसे बचाव करना) को रोकना, पूर्ण क्षतिपूर्ति सुनिश्चित करना और मेमोरी रिक्त स्थान अलग करना, और इसी तरह ...
मैं भी कुछ और शब्द खर्च करना चाहता हूँ। अन्य चर्चाओं से मैंने यह विचार किया है कि ओवरकमिट के बारे में मुख्य चिंताओं में से एक (दोनों एक कारण के रूप में यह चाहते हैं और संभावित परेशानियों के स्रोत के रूप में) कांटे से निपटने के होते हैं: ईमानदारी से, मुझे नहीं पता है कि वास्तव में प्रतिलिपि कैसे है- ऑन-राइट रणनीति को लागू किया गया है, लेकिन मुझे लगता है कि किसी भी आक्रामक (या आशावादी) नीति को स्वैप-समान रूप से स्थानीयता रणनीति द्वारा कम किया जा सकता है। अर्थात्, केवल एक कोड प्रक्रिया पृष्ठों और शेड्यूलिंग स्ट्रक्चर्स को क्लोन करने (और एडजस्ट करने) के बजाय, कुछ अन्य डेटा पेजों को वास्तविक लिखने से पहले कॉपी किया जा सकता है, उन पेजों के बीच चयन करना जिन्हें पेरेंट प्रक्रिया ने अधिक बार लिखने के लिए एक्सेस किया है (यानी, लेखन कार्यों के लिए एक काउंटर का उपयोग करना)।
सब कुछ, ज़ाहिर है, IMHO।