क्या ओओएम हत्यारे को पहले हस्तक्षेप करना संभव है?


34

मैं अपनी विकास प्रणाली को अधिकतम विश्वसनीयता के लिए मोड़ने की कोशिश करता हूं। मैंने स्वैप को अक्षम कर दिया है, क्योंकि GUI उपयोग के लिए यह मशीन को अप्रतिसादी रूप से इस तरह प्रस्तुत करता है कि अब उपयोग करने योग्य नहीं है। फिर भी, अगर एग्रेसिव अपीयरेंस मेमोरी को खा जाते हैं, तो कुछ मैकेनिज्म इस बात को तोड़ते दिखते हैं कि स्पीड के हिसाब से इसका सबसे ज्यादा फायदा हो सकता है। कोई हार्डड्राइव स्वैप ऑपरेशन नहीं है, लेकिन सिस्टम अप्रतिसादी हो रहा है। इसलिए मैं OOM किलर को स्मृति लाभ पर कोई विशेष प्रयास करने से पहले किक करना चाहता हूं। यदि उदाहरण के लिए 100 एमबी से कम मुफ्त भौतिक मेमोरी है, तो क्या ओओएम किलर को कॉन्फ़िगर करना संभव है?


2
मुझे लगता है कि असली मुद्दा यहाँ है, शुरू करने के लिए पर्याप्त राम नहीं है। जब तक कोई राम न हो आप स्वैप का उपयोग नहीं करेंगे। अदला-बदली बंद करके ... आप राम से बाहर निकलते हैं और इसे करने के लिए कोई पृष्ठ नहीं है। जिसके कारण बदसूरत चीजें होती हैं। आपका सिस्टम बुरी तरह से सेट किया गया लगता है, और कोई भी ट्विकिंग ठीक नहीं होगी।
जर्नीमैन गीक

8
मैं सहमत नहीं हूँ। विकास और 'बिजली के उपयोग' में अक्सर प्रयोगात्मक उपयोग शामिल होता है। उदाहरण के लिए, कमांड लाइन इमेज प्रोसेसिंग टूल का उपयोग करते समय, यह कल्पना नहीं की जाती है कि छवि के आकार के संबंध में यह कितनी मेमोरी है। इसलिए मैं इसे एक रन देता हूं। और मुझे उम्मीद नहीं है कि यह मेरी पूरी मशीन को बेकार कर देगा। एक एकल प्रयोग के लिए, मैं इसे सुरक्षित रखने के लिए अलिमेट का उपयोग कर सकता हूं, लेकिन कभी-कभी बहुत सारे ऑपरेशनों के साथ पूरे सिस्टम ऑपरेशन के लिए, एक प्रक्रिया का समावेश इतना उपयोगी नहीं होता है लेकिन पूरी मशीन के लिए निश्चित रूप से एक 'जीवन बीमा' होता है।
ड्रोनस

1
तथ्य यह है कि स्वैप का उपयोग करते समय आपका सिस्टम रुक जाता है। आपका कंप्यूटर स्वैप का उपयोग कर रहा है, इसकी मेमोरी समाप्त हो गई है। स्वैप धीमा हो रहा है क्योंकि डिस्क का उपयोग धीमा है। डिस्क की गति धीमी होने के कारण ??? नीचे सभी तरह की समस्याएं। यह नहीं है कि आप केवल राम पर कम हैं। इसका यह है कि आप किसी और चीज़ के कारण इसे मिटाने के लिए एक तरीके का उपयोग नहीं कर सकते हैं।
जर्नीमैन गीक

7
@JourneymanGeek, आप बाएँ क्षेत्र में बंद हैं। डिस्क रैम, पीरियड की तुलना में धीमे होते हैं, इसलिए भारी स्वैपिंग हमेशा सिस्टम को रोक देती है। बेशक वह स्मृति से बाहर है क्योंकि उसने एक कार्यक्रम चलाने की कोशिश की जिसमें बहुत सारी स्मृति का उपयोग होता है। सवाल यह है कि स्मृति से बाहर आने पर क्या करना है? डिस्क कैश के लिए कोई मेमोरी नहीं होने के कारण हॉग को मारें, या धीमा करें।
Psusi

2
@TomWijsman, Disk IO, मेमोरी IO की तुलना में परिमाण के धीमे होने के कई आदेश हैं, इसलिए डिस्क स्वैप का उपयोग करने का मतलब हमेशा बहुत धीमा होना है। कभी-कभी (विशेष रूप से पुराने दिनों में जहां राम महंगा था और इसलिए अधिकांश लोगों के पास बहुत कुछ नहीं था) जो कि आप जो कुछ भी करने की कोशिश कर रहे थे वह करने में सक्षम नहीं होने के लिए बेहतर है। इन दिनों डिस्क है अतः ज्यादा राम की तुलना में धीमी है, और राम सस्ते पर्याप्त है कि ज्यादातर लोगों को बहुत है, इसलिए दुर्लभ अवसर जहां वे गलती है कि का उपयोग करता है और अधिक राम की तुलना में वे कुछ चलाने पर, यह अक्सर बेहतर ले 1000 की तुलना में देने के लिए है कई बार ऐसा करने के लिए।
Psusi

जवाबों:


36

मैंने उस मुद्दे पर भी संघर्ष किया। मैं बस यही चाहता हूं कि मेरा सिस्टम उत्तरदायी रहे, चाहे कुछ भी हो, और मैं कुछ मिनट इंतजार करने के लिए प्रक्रियाओं को खोना पसंद करता हूं। ऐसा लगता है कि कर्नेल ऊम हत्यारे का उपयोग करके इसे प्राप्त करने का कोई तरीका नहीं है।

हालाँकि, उपयोगकर्ता स्थान में, हम जो चाहें कर सकते हैं। इसलिए मैंने अर्ली ओओएम डेमन ( https://github.com/rfjakob/earlyoom ) लिखा जो एक बार उपलब्ध रैम 10% से नीचे चला जाता है (आरएसएस द्वारा) सबसे बड़ी प्रक्रिया को मार देगा।

शुरुआती समय के बिना, http://www.unrealengine.com/html5/ कुछ समय शुरू करके मेरी मशीन (8GB RAM) को लॉक करना आसान हो गया है । अब, हाथ से बाहर निकलने से पहले दोषी ब्राउज़र टैब मारे जाते हैं।


3
इस खुजली को खरोंच करने के लिए धन्यवाद! अब तक का शुरुआती दौरा।
थॉमस फेरिस निकोलाइसेन

1
बस लगा कि एंड्रॉइड लंबे समय तक ऐसा ही करता है। मुझे यकीन नहीं है कि यह आपके लिए कस्टम कोड का उपयोग कर रहा है।
ड्रोन

1
मैं earlyoomअभी परीक्षण कर रहा हूं , यह पहले ट्रिगर परीक्षण में अच्छा करता है। मुझे आश्चर्य है कि इसे कर्नेल कॉन्फ़िगरेशन या सिस्टम टूल द्वारा लागू क्यों नहीं किया जा सकता है।
ड्रोनस

12

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

आप 2 के मान लिखकर मेमोरी ओवरकॉम्पिट को हटाने के लिए डिफ़ॉल्ट नीति को बदल सकते हैं /proc/sys/vm/overcommit_memory। डिफ़ॉल्ट मान /proc/sys/vm/overcommit_ratio50 है, इसलिए कर्नेल अनुप्रयोगों को 50% से अधिक रैम + स्वैप आवंटित करने की अनुमति नहीं देगा। यदि आपके पास कोई स्वैप नहीं है, तो कर्नेल आपके 50% से अधिक रैम को आवंटित करने की अनुमति नहीं देगा, जिससे कैश के लिए अन्य 50% मुक्त हो जाएंगे। यह थोड़ा अधिक हो सकता है, इसलिए आप यह कहने के लिए इस मूल्य को बढ़ाना चाहते हैं, 85% या तो, इसलिए आपके कैश में 15% छोड़कर, आपके राम के 85% तक आवेदन आवंटित हो सकते हैं।


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

3
@TomWijsman, यह सवाल स्पष्ट करता है कि वह लगातार कम मेमोरी की स्थिति में नहीं है; वह कभी-कभी एक कमांड चलाता है जो अप्रत्याशित रूप से बड़ी मात्रा में मेमोरी लेता है। जब आप बाहर निकलते हैं तो अधिक मेमोरी खरीदना एकमात्र उपाय नहीं है। अन्य संभावित समाधानों में आपके पास मौजूद मेमोरी का उपयोग करने के लिए बेहतर तरीके ढूंढना शामिल है, या बस जो कुछ भी करने की आवश्यकता नहीं है वह बहुत अधिक मेमोरी है। सवाल यह स्पष्ट करता है कि उत्तरार्द्ध बाहर जाने और अधिक राम खरीदने से अधिक स्वीकार्य है।
Psusi

प्रश्न में कौन सी रेखा यह स्पष्ट करती है? मैं इसमें दिए गए विपरीत को देखता हूं I disabled swap, because for GUI usage it mostly renders the machine unresponsive in such a way not useable anymore.। उन्होंने GUI का उल्लेख किया, जबकि आप मान रहे हैं कि वह एक कमांड चलाता है। अधिक मेमोरी खरीदना पहला समाधान है, कम मेमोरी का उपयोग करना स्वयं दूसरा समाधान है, स्थिर डिफॉल्ट्स के साथ फ़िडलिंग द्वारा आपके सिस्टम को अस्थिर करना अंतिम समाधान है। इस प्रश्न का उत्तर शाब्दिक रूप से नहीं दिया गया है, इसलिए मैं नहीं देखता कि आपकी क्या समस्या है जो आपको टिप्पणियों में हम दोनों को परेशान करना है।
रैंट

4
अरे, यह जवाब काफी अच्छा लग रहा था। दुर्भाग्य से, 'कमिट' वर्चुअल मेमोरी की मांग को संदर्भित करता है जो ऐसा लगता है, जो कि एप्लिकेशन प्रोग्रामर द्वारा काफी खराब अनुमान लगाया गया है। मेरी (कोई स्वैप) डेस्कटॉप चल रहा है के साथ उदाहरण के लिए, वहाँ के बारे में 400 की 2000MB शारीरिक इस्तेमाल किया स्मृति, लेकिन 1600mb 'के रूप में commit'ted है /proc/meminfos' Committed_ASराज्यों। कुछ अनुप्रयोगों के चलने के साथ, यह मान आसानी से भौतिक मेमोरी से अधिक हो जाता है, इसलिए इसके द्वारा व्यवहार्य सीमा निर्धारित करना कठिन है।
ड्रोनस

3
इस कोशिश से पहले अपना काम बचाओ! : PI में हर चीज (bash, window manager आदि) से तत्काल विफलताएं थीं।
jozxyqk

8

मेरे लिए vm.admin_reserve_kbytes = 262144 सेट करना बिल्कुल यही काम करता है। OOM किलर सिस्टम से पहले पूरी तरह से अनुत्तरदायी हो जाता है।


1
मुझे विचार पसंद है, लेकिन क्या इसका मतलब है कि आपके पास कभी भी भौतिक मेमोरी का 256MiB उपयोग नहीं हुआ है?
जेरेम पोइलर

1
256MiB का उपयोग कैश के लिए किया जाएगा। कैश वास्तव में महत्वपूर्ण हैं, यह सिर्फ तेजी से चलने के बारे में नहीं है, अगर कैश के लिए पर्याप्त मेमोरी नहीं है, तो सिस्टम बिल्कुल काम नहीं करेगा। हर चलने वाले प्रोग्राम का कोड मेमोरी से अनलोड किया जा सकता है क्योंकि यह mmaped है और डिस्क से वापस पढ़ा जा सकता है। कैश के बिना हर कार्य स्विच को डिस्क रीड की आवश्यकता होगी और सिस्टम पूरी तरह से अनुत्तरदायी हो जाएगा।
माइकल विगोवस्की

4

अन्य उत्तरों में अच्छे स्वचालित समाधान हैं, लेकिन मुझे लगता है SysRqकि चीजें हाथ से निकल जाने पर कुंजी को सक्षम करने में सहायक हो सकती हैं । SysRqकुंजी के साथ , आप मैन्युअल रूप से कर्नेल को संदेश भेजेंगे, और आप सुरक्षित रिबूट (जैसे SysRQ + REISUB) जैसी चीजें कर सकते हैं, भले ही उपयोगकर्ता स्थान पूरी तरह से जमी हो।

कर्नेल को अनुरोधों को सुनने, सेट करने kernel.sysrq = 1, या बस उन कार्यों को सक्षम करने की अनुमति देने के लिए जिनका उपयोग आप एक बिटमास्क ( यहां दस्तावेज किए गए ) के साथ कर सकते हैं। उदाहरण के लिए kernel.sysrq = 244ऊपर दिए गए सुरक्षित रिबूट के साथ-साथ OOM किलर के मैनुअल इनवोकेशन के लिए आवश्यक सभी कॉम्बो को सक्षम करेगा SysRq + F


-2

विश्वसनीयता कम स्मृति स्थितियों और एक OOM हत्यारे तक नहीं पहुंची है।

अपनी छोटी प्लेलिस्ट पर एक कोठरी में पार्टी को व्यवस्थित करना और "मेरी कोठरी की सफाई" करना गलत है ।

क्या ओओएम हत्यारे को पहले हस्तक्षेप करना संभव है?

ऐसा करने से अनपेक्षित साइड परिणाम होंगे, क्योंकि आपके पास मारे गए लोगों पर कोई नियंत्रण नहीं है।

मैं अपनी विकास प्रणाली को अधिकतम विश्वसनीयता के लिए मोड़ने की कोशिश करता हूं।

अधिकतम विश्वसनीयता में आपके सिस्टम का परीक्षण करना और इन परीक्षणों के आधार पर आपके सिस्टम में सुधार करना शामिल है ।

बस यादृच्छिक बातें tweaking तुम कहीं भी नहीं मिलेगा ...

मैंने स्वैप को अक्षम कर दिया है, क्योंकि GUI उपयोग के लिए यह मशीन को अप्रतिसादी रूप से इस तरह प्रस्तुत करता है कि अब उपयोग करने योग्य नहीं है। फिर भी, अगर एग्रेसिव अपीयरेंस मेमोरी को खा जाते हैं, तो कुछ मैकेनिज्म इस बात को तोड़ते दिखते हैं कि स्पीड के हिसाब से इसका सबसे ज्यादा फायदा हो सकता है।

कम स्मृति स्थितियों के कारण, स्वैप को अक्षम करने से व्यवहार में सुधार नहीं होगा , यह विपरीत करता है

इस स्थिति में विश्वसनीयता बढ़ाने के लिए, अधिक मेमोरी जोड़ें जैसे कि आपका सिस्टम अधिक उत्तरदायी है और उपयोगकर्ता की मंशा के बिना कोई यादृच्छिक प्रक्रिया नहीं हो रही है। आपको कम स्मृति स्थितियों और इस तरह के तंत्र का सहारा नहीं लेना चाहिए, विशेष रूप से विकास के माहौल में नहीं ...

कोई हार्डड्राइव स्वैप ऑपरेशन नहीं है, लेकिन सिस्टम अप्रतिसादी हो रहा है।

कम स्मृति की स्थिति वास्तव में गैर जिम्मेदाराना परिणाम है, चाहे आप एक स्वैप है या नहीं।

इसलिए मैं OOM किलर को स्मृति लाभ पर कोई विशेष प्रयास करने से पहले किक करना चाहता हूं।

विशेष प्रयास जो अच्छे से अधिक नुकसान करेंगे, जैसा कि मैंने ऊपर बताया। इसके बजाय, आप उन प्रक्रियाओं को मार सकते हैं जिनकी आपको स्वयं आवश्यकता नहीं है, लेकिन मुझे लगता है कि आप ऐसा नहीं कर सकते हैं ताकि OOM उन प्रक्रियाओं को मार सके जिनकी आपको आवश्यकता है।

यदि उदाहरण के लिए 100 एमबी से कम मुफ्त भौतिक मेमोरी है, तो क्या ओओएम किलर को कॉन्फ़िगर करना संभव है?

हो सकता है, लेकिन आपको निवेश पर अधिक लाभ मिलता है यदि आप कुछ अतिरिक्त मेमोरी खरीदते हैं जो इन दिनों वास्तव में बहुत अधिक खर्च नहीं करता है। विचार करें कि यदि आप कम स्मृति स्थितियों पर काम करना जारी रखते हैं तो आप लंबे समय तक अपने आप को पैर में मार सकते हैं। OOM एक बेलीफ की तरह है, यह आपकी सहायता नहीं करता है, यह ओएस को सहायता करता है ...


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

7
क्योंकि उस एप्लिकेशन को मारना जो आपके पास अधिक मेमोरी का उपयोग करने की कोशिश कर रहा है, पूरे सिस्टम को अपने घुटनों पर लाने के लिए बेहतर है। एक आदर्श दुनिया में आपके पास असीमित स्मृति होती है और कभी भी बाहर नहीं निकलती है, लेकिन वास्तव में, कभी-कभी आप दुर्घटना से बाहर निकलते हैं और इसे "पर्याप्त मेमोरी नहीं" कहा जाता है, क्योंकि सिस्टम एक पड़ाव में पीसता है।
Psusi

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

6
@TomWijsman भी लगभग-मृत लूप हैं क्योंकि एल्गोरिदम हैं जो औसत मामले में रैखिक व्यवहार करते हैं लेकिन सबसे खराब स्थिति में घातीय हैं, इनपुट डेटा पर निर्भर करता है। और अगर माउस झटकेदार है और क्लिक के साथ-साथ कीबोर्ड इनपुट एक मिनट विलंबता दिखाता है, तो मैं एक किल संकेत नहीं भेज सकता। मैं आमतौर पर एक टेक्स्ट मोड टर्मिनल में बदल जाता हूं और लॉगिन के लिए केवल एक killआंख बंद करके जारी करने के लिए आगे बढ़ने के लिए मिनटों का इंतजार करता हूं ।
ड्रोनस

7
मुझे उन अनुप्रयोगों को मारने में कोई समस्या नहीं है जो या तो मृत हो जाएंगे। 2GB भौतिक + 2GB स्वैप वाली प्रणाली पर विचार करें। एक एप्लिकेशन जो भौतिक मेमोरी को जल्दी से चलाता है वह आसानी से स्वैप भी खा सकता है। मिनटों से लेकर घंटों तक सिस्टम को अनुत्तरित करने के बाद यह बस बाद में मर जाएगा। तो क्यों जीयूआई ऑपरेशन परतदार होने से पहले इसे जल्दी नहीं मारना चाहिए? बहुत सारी प्रक्रियाएं अपने सभी काम 10mb के साथ करती हैं, कुछ 1gb लेती हैं, और कुछ को 10gb की आवश्यकता होती है, यही जीवन है।
ड्रोनस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.