सवाल डिफ़ॉल्ट रूप से लिनक्स ओओएम हत्यारा बंद करें?


लिनक्स पर ओओएम हत्यारा हर बार विभिन्न अनुप्रयोगों के साथ विनाश करता है, और ऐसा लगता है कि इसे सुधारने के लिए कर्नेल विकास पक्ष पर वास्तव में बहुत कुछ नहीं किया गया है। एक नया स्थापित करते समय सबसे अच्छा अभ्यास के रूप में बेहतर नहीं होगा सर्वर, स्मृति को ओवरमेट करने पर डिफ़ॉल्ट को उलट करने के लिए, यानी, इसे बंद करें (vm.overcommit_memory=2) जब तक आप नहीं जानते कि आप इसे अपने विशेष उपयोग के लिए चाहते हैं? और उन मामलों का क्या उपयोग होगा जहां आप जानते हैं कि आप अधिक से अधिक चाहते हैं?

एक बोनस के रूप में, व्यवहार के मामले में vm.overcommit_memory=2 निर्भर करता है vm.overcommit_ratio और स्वैप स्पेस, बाद वाले दो का आकार बदलने के लिए अंगूठे का अच्छा नियम क्या होगा ताकि यह पूरा सेटअप उचित रूप से काम करता रहे?


36
2018-01-12 14:16


मूल




जवाब:


एक दिलचस्प सादृश्य (से http://lwn.net/Articles/104179/):

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


62
2017-10-25 19:36



मुझे बहुत मज़ा आया, इसे खोदने के लिए धन्यवाद। - Nick Bolton


ओओएम हत्यारा केवल तभी खराब हो जाता है जब आपने अपने सिस्टम को अधिभारित किया हो। इसे पर्याप्त स्वैप दें, और उन अनुप्रयोगों को न चलाएं जो अचानक भारी मात्रा में रैम खाने का फैसला करते हैं, और आपको कोई समस्या नहीं होगी।

विशेष रूप से अपने सवालों का जवाब देने के लिए:

  • मुझे नहीं लगता कि सामान्य मामले में ओवरकमिट बंद करना एक अच्छा विचार है; ठीक से निपटने के लिए बहुत कम आवेदन लिखे गए हैं brk(2) (और रैपर जो इसका उपयोग करते हैं, जैसे कि malloc(3)) एक त्रुटि लौट रहा है। जब मैंने अपनी पिछली नौकरी में इसका प्रयोग किया, तो यह ओओएम के परिणामों से निपटने के लिए केवल स्मृति त्रुटियों को संभालने में सक्षम सबकुछ पाने में परेशानी के रूप में समझा जाता था (जो, हमारे मामले में, ओओएम होने पर कभी-कभी सेवा को पुनरारंभ करने से कहीं ज्यादा बदतर था - हमें एक संपूर्ण क्लस्टर को रीबूट करना पड़ा, क्योंकि जीएफएस मल का एक ढेर ढेर है)।
  • आप किसी भी प्रक्रिया के लिए अतिसंवेदनशील होना चाहते हैं जो स्मृति को कम करता है। यहां दो सबसे आम अपराधी अपाचे और जेवीएम हैं, लेकिन बहुत से ऐप्स कुछ अधिक या कम डिग्री के लिए ऐसा करते हैं। वे सोच वे पराक्रम भविष्य में किसी बिंदु पर बहुत सारी मेमोरी की आवश्यकता है, इसलिए वे एक बड़ा हिस्सा सीधे पकड़ लेते हैं। एक ओवरकॉमिट-सक्षम सिस्टम पर, कर्नेल "मेह, जो भी हो, मुझे परेशान करते हैं जब आप वास्तव में उन पृष्ठों पर लिखना चाहते हैं" और कुछ भी बुरा नहीं होता है। एक ओवरकॉमिट-ऑफ सिस्टम पर, कर्नेल कहता है "नहीं, आपके पास उस स्मृति को नहीं मिल सकता है, अगर आप भविष्य में किसी भी समय इसे लिखने के लिए ऐसा करते हैं तो मैं बोनड हूं, इसलिए आपके लिए कोई स्मृति नहीं है!" और आवंटन विफल रहता है। जबसे कुछ भी तो नहीं वहाँ जाता है "ओह, ठीक है, क्या मेरे पास प्रक्रिया डेटा सेगमेंट की यह छोटी मात्रा हो सकती है?", फिर प्रक्रिया या तो (ए) स्मृति से बाहर की त्रुटि के साथ छोड़ती है, या (बी) से रिटर्न कोड की जांच नहीं करता है malloc, लगता है कि यह जाना ठीक है, और एक अवैध स्मृति स्थान पर लिखता है, जिसके कारण segfault होता है। शुक्र है, जेवीएम स्टार्टअप पर इसके सभी प्रीलॉक करता है (इसलिए आपका जेवीएम या तो तुरंत शुरू होता है या मर जाता है, जिसे आप आमतौर पर देखते हैं), लेकिन अपाचे प्रत्येक नए बच्चे के साथ यह मजेदार चीजें करता है, जिसके उत्पादन में रोमांचक प्रभाव हो सकते हैं (अप्रतिबंधित "कनेक्शन को संभालना नहीं "उत्तेजना के प्रकार)।
  • मैं 50% के डिफ़ॉल्ट से अधिक अपने overcommit_ratio सेट नहीं करना चाहता। फिर से, मेरे परीक्षण से, हालांकि इसे लगभग 80 या 90 के आसपास स्थापित किया जा सकता है ध्वनि एक अच्छा विचार की तरह, कर्नेल को असुविधाजनक समय पर स्मृति के बड़े हिस्से की आवश्यकता होती है, और उच्च ओवरकॉमिट अनुपात वाले पूर्णत: लोड सिस्टम में अपर्याप्त अतिरिक्त मेमोरी होने की संभावना होती है जब कर्नेल को इसकी आवश्यकता होती है (डर, महामारी, और ओप्स)। तो ओवरकमिट के साथ खेलना एक नया, और भी मजेदार विफलता मोड पेश करता है - जब आप स्मृति से बाहर निकलते हैं तो ओमड की प्रक्रिया को फिर से शुरू करने के बजाय, अब आपकी मशीन दुर्घटनाग्रस्त हो जाती है, जिससे मशीन पर सबकुछ निकल जाता है। बहुत बढ़िया!
  • एक ओवरकमिट-फ्री सिस्टम में स्वैप स्पेस इस बात पर निर्भर करता है कि आपके अनुप्रयोगों की कितनी मांग की गई है, लेकिन अप्रयुक्त स्मृति, साथ ही एक स्वस्थ सुरक्षा मार्जिन। एक विशिष्ट मामले में क्या आवश्यक है काम करना पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है।

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


31
2018-01-12 21:31



मैं नहीं चाहता कि मेरी बैकअप प्रक्रिया मारे जाए क्योंकि कोई मेरा वेब सर्वर कर रहा है। अपवाद ठीक हैं लेकिन डिफ़ॉल्ट सुरक्षा और स्थिरता होना चाहिए। ओओएम जैसे अनुकूलन मैन्युअल रूप से IMHO पर चालू किए जाने चाहिए। यह कोडिंग की तरह है, आप साफ कोड, और फिर अनुकूलित करें। ओवर-प्रतिबद्ध एक अच्छी सुविधा है, लेकिन डिफ़ॉल्ट नहीं होना चाहिए। - Aki
यदि आप अपनी बैकअप प्रक्रिया को मारना नहीं चाहते हैं क्योंकि कोई आपके वेब सर्वर को डीएसएस कर रहा है, तो अपने वेबसर्वर को इस तरह से कॉन्फ़िगर न करें कि एक DoS सिस्टम पर संसाधनों को अभिभूत कर सकता है। - womble♦
मेरे पास 8 जीबी रैम है और सिर्फ फ़ायरफ़ॉक्स चल रहा है और वर्चुअल मशीन कभी-कभी ओओएम हत्यारे को वीएम की हत्या में परिणाम देती है। अवास्तविक इंजन 4 को संकलित करना, प्रत्येक क्लैंग आमंत्रण में 1 ~ 1.5 जीबी मेमोरी लगती है और फिर, ओओएम हत्यारा हर बार और फिर मारता है। अब मैं आम तौर पर उस के साथ ठीक हूं, ओओएम हत्यारे के बिना वे शायद वैसे भी सीगफॉल्ट करेंगे। यह सिर्फ इतना है कि हर बार ओओएम हत्यारा एक प्रक्रिया को मारना चाहता है, खराब प्रक्रिया वास्तव में मारे जाने से पहले 10 मिनट तक मेरा सिस्टम फ्रीज हो जाता है। शायद बग? सबसे अधिक संभावना। क्या मुझे यह चाहिए? निश्चित रूप से नहीं। और यही कारण है कि कोई ओओएम हत्यारा को अक्षम करना चाहता है। - Shahbaz
यदि आप किसी बॉक्स पर ऐसा कर रहे हैं तो आपको अधिक रैम की आवश्यकता है, और ओवरकमिट अक्षम करने से केवल इससे भी बदतर हो जाएगा। - Ben Lutgens


हम्म, मैं अतिसंवेदनशील और ओओएम हत्यारा के पक्ष में तर्कों से पूरी तरह से आश्वस्त नहीं हूं ... जब गर्भ लिखते हैं,

"ओओएम हत्यारा केवल तभी खराब हो जाता है जब आपने अपने सिस्टम को अधिभारित कर दिया हो। इसे पर्याप्त स्वैप दें, और उन अनुप्रयोगों को न चलाएं जो अचानक भारी मात्रा में रैम खाने का फैसला करते हैं, और आपको कोई समस्या नहीं होगी।"

वह एक पर्यावरण परिदृश्य का वर्णन करने के बारे में है जहां ओवरकॉमिट और ओओएम हत्यारा लागू नहीं किया गया है, या 'वास्तव में' कार्य नहीं करता है (यदि सभी अनुप्रयोगों को आवश्यकतानुसार स्मृति आवंटित किया गया था, और पर्याप्त वर्चुअल मेमोरी आवंटित की गई थी, तो स्मृति लिखने के बिना स्मृति आवंटन का बारीकी से पालन करेंगे त्रुटियां, इसलिए हम वास्तव में एक अतिसंवेदनशील प्रणाली के बारे में बात नहीं कर पाएंगे, भले ही एक ओवरसीटिट रणनीति सक्षम की गई हो)। यह एक निहित प्रवेश के बारे में है कि ओवरकॉमिट और ओओएम हत्यारा सबसे अच्छा काम करता है जब उनके हस्तक्षेप की आवश्यकता नहीं होती है, जिसे किसी भी तरह से इस रणनीति के अधिकांश समर्थकों द्वारा साझा किया जाता है, जहां तक ​​मैं कह सकता हूं (और मैं मानता हूं कि मैं ज्यादा नहीं बता सकता ...)। मॉरोवर, स्मृति को पूर्ववत करते समय विशिष्ट व्यवहार वाले अनुप्रयोगों का जिक्र करते हुए मुझे लगता है कि एक विशिष्ट हैंडलिंग को वितरण स्तर पर ट्यून किया जा सकता है, बजाय डिफॉल्ट, सिस्टमवायर दृष्टिकोण हेरिस्टिक्स (व्यक्तिगत रूप से, मुझे विश्वास है कि हेइस्टिक एक बहुत अच्छा दृष्टिकोण नहीं है कर्नेल सामान के लिए)

JVM की चिंता के लिए, ठीक है, यह एक आभासी मशीन है, कुछ हद तक इसे सभी संसाधनों को आवंटित करने की आवश्यकता है ज़रूरत स्टार्टअप पर, इसलिए यह अपने अनुप्रयोगों के लिए 'नकली' वातावरण बना सकता है, और जहां तक ​​संभव हो, अपने उपलब्ध संसाधन को मेजबान पर्यावरण से अलग रखा जा सकता है। इस प्रकार, यह 'बाहरी' ओओएम स्थिति (ओवरकॉमिट / ओओएम किलर / जो भी हो) के परिणामस्वरूप थोड़ी देर के बाद स्टार्टअप पर असफल होने के लिए बेहतर हो सकता है, या फिर भी ऐसी स्थिति के लिए पीड़ित होना चाहिए जो स्वयं के साथ हस्तक्षेप कर रहा है आंतरिक ओओएम हैंडलिंग रणनीतियों (सामान्य रूप से, एक वीएम को शुरुआत से कोई आवश्यक संसाधन प्राप्त करना चाहिए और मेजबान प्रणाली को अंत तक उन्हें अनदेखा करना चाहिए, वैसे ही ग्राफिक्स कार्ड के साथ साझा किए गए भौतिक RAM की कोई भी मात्रा कभी नहीं होती - और नहीं हो सकती - ओएस द्वारा छुआ)।

अपाचे के बारे में, मुझे संदेह है कि पूरे सर्वर को कभी-कभी मार डाला और पुनरारंभ करना एक ही बच्चे के साथ एक ही कनेक्शन के साथ बेहतर होता है, (= बच्चे / कनेक्शन) से शुरू होता है (जैसे कि यह एक नया उदाहरण था थोड़ी देर के लिए चलाए गए जेवीएम ने एक और उदाहरण चलाया)। मुझे लगता है कि सबसे अच्छा 'समाधान' एक विशिष्ट संदर्भ पर निर्भर हो सकता है। उदाहरण के लिए, ई-कॉमर्स सेवा पर विचार करना, कभी-कभी, शॉपिंग चार्ट के लिए कुछ कनेक्शन पूरी तरह से खोने के बजाए यादृच्छिक रूप से असफल हो सकते हैं, जोखिम के साथ, उदाहरण के लिए, एक चालू आदेश अंतिम रूप में बाधा डालने के लिए, या (शायद बदतर) एक भुगतान प्रक्रिया, मामले के सभी परिणामों के साथ (शायद हानिरहित, लेकिन शायद हानिकारक - और निश्चित रूप से, जब समस्याएं उत्पन्न हुईं, तो यह बदतर हो जाएगा तो डीबगिंग उद्देश्यों के लिए एक अपरिवर्तनीय त्रुटि स्थिति)।

वैसे ही, वर्कस्टेशन पर जो प्रक्रिया सबसे अधिक संसाधनों का उपभोग करती है, और इसलिए ओओएम किलर के लिए पहली पसंद बनने के लिए तैयार किया जा सकता है, एक वीडियो ट्रांसकोडर, या एक प्रतिपादन सॉफ्टवेयर जैसे स्मृति गहन अनुप्रयोग हो सकता है, संभवतः एकमात्र एप्लिकेशन उपयोगकर्ता छेड़छाड़ करना चाहता है। यह विचार मुझे संकेत देते हैं कि ओओएम हत्यारा डिफ़ॉल्ट नीति बहुत आक्रामक है। यह एक "सबसे खराब फिट" दृष्टिकोण का उपयोग करता है जो कि किसी भी तरह के फाइल सिस्टम के समान होता है (ओओएमके कोशिश करता है और जितनी मेमोरी उतनी ही कम हो सकती है, जबकि कम समय में किसी और हस्तक्षेप को रोकने के लिए, मारे गए उपप्रोसेसेस की संख्या को कम करता है, अच्छी तरह से एक एफएस अधिक डिस्क स्थान आवंटित कर सकता है, फिर वास्तव में किसी निश्चित फ़ाइल के लिए आवश्यक होता है, अगर फ़ाइल बढ़ जाती है और इस तरह विखंडन को रोकती है, तो कुछ हद तक)।

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

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

वैसे भी, मुझे लगता है कि उपयोगकर्ता को क्या करना है इसके बारे में निर्णय लेने के लिए सक्षम होना चाहिए। डेस्कटॉप (= इंटरैक्टिव) सिस्टम में, जो अपेक्षाकृत काफी आसान होना चाहिए, बशर्ते पर्याप्त संसाधन आरक्षित हैं, उपयोगकर्ता को किसी भी एप्लिकेशन को बंद करने के लिए कहा जाता है (लेकिन कुछ टैब बंद करना पर्याप्त हो सकता है) और उसके choise को संभालें (एक विकल्प यदि पर्याप्त जगह है तो अतिरिक्त स्वैप फ़ाइल बनाने में शामिल है)। सेवाओं (और सामान्य रूप से) के लिए, मैं दो और संभावित संवर्द्धन पर भी विचार करता हूं: एक ओओएम किलर अंतराल को लॉग कर रहा है, साथ ही प्रक्रियाओं को विफल / विफल करने की प्रक्रियाएं इस तरह से विफलता को आसानी से डीबग किया जा सकता है (उदाहरण के लिए, एक एपीआई नई प्रक्रिया निर्माण या फोर्किंग जारी करने की प्रक्रिया को सूचित करें - इस प्रकार, एक उचित पैच के साथ अपाचे जैसे सर्वर, कुछ त्रुटियों के लिए बेहतर लॉगिंग प्रदान कर सकते हैं); प्रयास में होने वाले ओवरकमिट / ओओएमके से यह अनिवार्य रूप से किया जा सकता है; दूसरे स्थान पर, लेकिन महत्व के लिए नहीं, ओओएमके एल्गोरिदम को ठीक करने के लिए एक तंत्र स्थापित किया जा सकता है - मुझे पता है कि कुछ हद तक, प्रक्रिया के आधार पर प्रक्रिया पर एक विशिष्ट नीति को परिभाषित करना संभव है, लेकिन मैं इसका लक्ष्य रखूंगा प्रासंगिक प्रक्रियाओं की पहचान करने के लिए आवेदन नामों (या आईडी) की एक या अधिक सूचियों के आधार पर 'केंद्रीकृत' कॉन्फ़िगरेशन तंत्र और उन्हें एक निश्चित डिग्री (सूचीबद्ध विशेषताओं के अनुसार) दें; इस तरह के एक तंत्र को (या कम से कम कर सकता है) भी स्तरित किया जाना चाहिए, ताकि एक शीर्ष-स्तरीय उपयोगकर्ता परिभाषित सूची हो, एक प्रणाली- (वितरण-) परिभाषित सूची, और (नीचे-स्तर) अनुप्रयोग-परिभाषित प्रविष्टियां (इसलिए उदाहरण के लिए, एक डीई फ़ाइल प्रबंधक ओओएमके को सुरक्षित रूप से किसी भी उदाहरण को मारने का निर्देश दे सकता है, क्योंकि उपयोगकर्ता खोए गए फ़ाइल दृश्य तक पहुंचने के लिए इसे सुरक्षित रूप से फिर से खोल सकता है - जबकि किसी भी महत्वपूर्ण ऑपरेशन, जैसे कि चलती / प्रतिलिपि बनाना / डेटा बनाना, को सौंपा जा सकता है एक और 'विशेषाधिकार' प्रक्रिया)।

मॉरोवर, एक एपीआई प्रदान किया जा सकता है ताकि अनुप्रयोगों को रन-टाइम (स्मृति प्रबंधन उद्देश्यों के संबंध में और निष्पादन प्राथमिकता के संबंध में) के 'महत्व' स्तर को बढ़ाने या कम करने की अनुमति दी जा सके, ताकि, उदाहरण के लिए, एक वर्ड प्रोसेसर शुरू हो सकता है एक कम 'महत्व' लेकिन इसे बढ़ाएं क्योंकि फ़ाइल को फ़्लश करने से पहले कुछ डेटा पकड़ लिया जाता है, या एक लिखने का ऑपरेशन किया जा रहा है, और इस तरह के ऑपरेशन समाप्त होने के बाद फिर से कम महत्व (समान रूप से, फ़ाइल प्रबंधक केवल तब से स्तर बदल सकता है जब यह बस से निकलता है अलग प्रक्रियाओं का उपयोग करने के बजाय डेटा और उपाध्यक्ष से निपटने के लिए फाइलों को लाइट करना, और अपाचे अलग-अलग बच्चों को महत्व के विभिन्न स्तर दे सकता है, या सिसडमिन द्वारा तय की गई कुछ नीतियों के अनुसार बाल स्थिति बदल सकता है और अपाचे के माध्यम से उजागर किया जा सकता है - या किसी अन्य प्रकार के सर्वर - सेटिंग्स)। निस्संदेह, इस तरह की एक एपीआई दुर्व्यवहार / दुर्व्यवहार किया जा सकता है, लेकिन मुझे लगता है कि कर्नेल की तुलना में यह मामूली चिंता है कि प्रणाली पर क्या हो रहा है (और स्मृति खपत / सृजन के समय या किसी भी प्रासंगिक जानकारी के बिना किसी भी प्रासंगिक जानकारी के बिना मनमाने ढंग से स्मृति को मुक्त करने के लिए प्रक्रियाओं को मारना) समान रूप से मेरे लिए पर्याप्त प्रासंगिक या 'मान्य' नहीं हैं) - केवल उपयोगकर्ता, व्यवस्थापक और प्रोग्राम लेखक वास्तव में यह निर्धारित कर सकते हैं कि किसी कारण से किसी प्रक्रिया के लिए 'अभी भी आवश्यक' है, क्या कारण है, और / या यदि एप्लिकेशन में है एक राज्य जो डाटा हानि या अन्य नुकसान / परेशानियों की वजह से मारा जाता है; हालांकि, कुछ धारणा अभी तक की जा सकती है, उदाहरण के लिए एक प्रक्रिया द्वारा अधिग्रहित एक निश्चित प्रकार (फाइल डिस्क्रिप्टर, नेटवर्क सॉकेट इत्यादि) के संसाधनों की तलाश करना और लंबित परिचालन के साथ यह बता सकता है कि कोई प्रक्रिया उच्च 'राज्य' में होनी चाहिए या नहीं एक सेट, या यदि इसकी 'स्व-स्थापित' एक आवश्यकता से अधिक है और इसे कम किया जा सकता है (आक्रामक दृष्टिकोण, जब तक उपयोगकर्ता के choises द्वारा अधिग्रहित नहीं किया जाता है, जैसे किसी निश्चित राज्य को मजबूर करना, या पूछना - ऊपर वर्णित सूचियों के माध्यम से - सम्मान के लिए आवेदन के choises)।

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

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

सब कुछ, ज़ाहिर है, आईएमएचओ।


5
2018-03-22 21:22



"मोरओवर, एपीआई को रन-टाइम पर अपने 'महत्व' स्तर को बढ़ाने या कम करने की अनुमति देने के लिए प्रदान किया जा सकता है" महत्व है /proc/$PID/oom_adj। - Vi.
जेवीएम के बारे में, एक गॉचा है जो आपको कुछ मामलों में मेमोरी ओवरकमिट करना चाहता है: यदि आप अपने मूल जेवीएम से एक और जेवीएम बनाना चाहते हैं, तो यह फोर्क () को कॉल करेगा। एक फोर्क कॉल मूल प्रक्रिया (पहले) के रूप में उतनी ही स्मृति आवंटित करेगा, जब तक कि यह वास्तव में प्रक्रिया शुरू नहीं कर लेता है। तो कहें कि आपके पास 4 जीबी जेवीएम है और जब तक आप ओवरकम नहीं करते हैं, तब तक आपको एक नया 512 केबी जेवीएम बनाना है, आपको ऐसा करने के लिए 8 जीबी मेमोरी की आवश्यकता होगी ... - alci
@Vi। अब लगता है /proc/$PID/oom_score_adj - erm3nda


यदि आपकी याददाश्त प्रक्रियाओं द्वारा पूरी तरह से उस सीमा तक उपयोग की जाती है जो संभवतः सिस्टम की स्थिरता को धमकी दे सकती है, तो ओओएम हत्यारा तस्वीर में आता है। यह ओओएम किलर का कार्य प्रक्रियाओं को मारने का कार्य है जब तक कि बाकी प्रक्रिया की सुचारू कार्यप्रणाली के लिए पर्याप्त स्मृति मुक्त नहीं होती है।   ओओएम किलर को मारने के लिए "सर्वश्रेष्ठ" प्रक्रिया का चयन करना है। यहां "बेस्ट" उस प्रक्रिया को संदर्भित करता है जो हत्या पर अधिकतम स्मृति मुक्त कर देगा और सिस्टम के लिए भी कम से कम महत्वपूर्ण है। प्राथमिक लक्ष्य कम से कम प्रक्रियाओं को मारना है जो क्षति को कम करता है और साथ ही साथ स्मृति की मात्रा को अधिकतम करने के लिए अधिकतम करता है।   इसे सुविधाजनक बनाने के लिए, कर्नेल प्रत्येक प्रक्रिया के लिए oom_score बनाए रखता है। आप पीआईडी ​​निर्देशिका के तहत / proc फाइल सिस्टम में प्रत्येक प्रक्रिया के oom_score देख सकते हैं

# cat /proc/10292/oom_score

किसी भी प्रक्रिया के oom_score के उच्चतर मूल्य ओओएम किलर द्वारा स्मृति की स्थिति में मारने की संभावना अधिक है।

क्रेडिट: - लिनक्स कर्नेल ओओएम हत्यारा शुरू कर रहा है


0
2018-03-08 11:04