OOM किलर कैसे तय करता है कि किस प्रक्रिया को पहले मारना है?


92

यह उत्तर कर्नेल द्वारा किए गए कार्यों की व्याख्या करता है जब एक OOM स्थिति का मूल्य के आधार पर सामना किया जाता है sysctl vm.overcommit_memory

जब overcommit_memory0 या 1 पर सेट किया overcommitजाता है , तो सक्षम किया जाता है, और कार्यक्रमों को वास्तव में उपलब्ध की तुलना में अधिक मेमोरी आवंटित करने की अनुमति दी जाती है।

अब क्या होता है जब हम इस स्थिति में स्मृति से बाहर भागते हैं? OOM किलर कैसे तय करता है कि किस प्रक्रिया को पहले मारना है?


1
मेरा मानना ​​है कि मान 1 1 2 - 0 नहीं और 1.
fpmurphy

यहाँ से serverfault.com/questions/606185/… , 0 और 1 सही मान हैं।
रुई एफ रिबेरो


Kernel.org/doc/Documentation/vm/overcommit-accounting के अनुसार 0, 1, और 2 सभी मान्य मूल्य हैं।
डेरेक लुईस

जवाबों:


109

यदि मेमोरी को प्रक्रियाओं द्वारा आसानी से उपयोग किया जाता है, तो इस हद तक जो संभवतः सिस्टम की स्थिरता को खतरे में डाल सकता है, तो ओओएम हत्यारा तस्वीर में आता है।

ध्यान दें: जब तक कि कर्नेल को चलाने का प्रयास नहीं किया जाता है, तब तक शेष प्रक्रिया के सुचारू संचालन के लिए पर्याप्त मेमोरी मुक्त होने तक ओओएम किलर का कार्य करना है।

OOM किलर को मारने के लिए सबसे अच्छी प्रक्रिया (तों) का चयन करना है । बेस्ट यहां उस प्रक्रिया को संदर्भित करता है जो हत्या पर अधिकतम मेमोरी को मुक्त कर देगा और सिस्टम के लिए कम से कम महत्वपूर्ण भी है।

प्राथमिक लक्ष्य कम से कम प्रक्रियाओं को मारना है जो नुकसान को कम करता है और साथ ही साथ मुक्त की गई मेमोरी की मात्रा को अधिकतम करता है।

इसे सुविधाजनक बनाने के लिए, कर्नेल oom_scoreप्रत्येक प्रक्रिया के लिए बनाए रखता है। आप डायरेक्टरी के तहत फाइल सिस्टम oom_scoreकी प्रत्येक प्रक्रिया को देख सकते हैं ।/procpid

$ cat /proc/10292/oom_score

oom_scoreकिसी भी प्रक्रिया का मूल्य जितना अधिक होता है, ऊम किलर द्वारा एक आउट-ऑफ-मेमोरी स्थिति में मारे जाने की संभावना अधिक होती है।

OOM_Scoreगणना कैसे की जाती है?

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

यदि इसके बजाय, OOM स्थिति किसी दिए गए cpuset / नियंत्रण समूह को दी गई मेमोरी को समाप्त करने के कारण होती है, तो "उपलब्ध मेमोरी" उस नियंत्रण समूह को आवंटित कुल राशि है। एक समान गणना की जाती है यदि मेमोरी पॉलिसी द्वारा लगाई गई सीमाएं पार हो गई हैं। प्रत्येक मामले में, प्रक्रिया का मेमोरी उपयोग इसके निवासी सेट (रैम पेजों की संख्या का उपयोग कर रहा है) और इसके स्वैप उपयोग का योग माना जाता है।

यह गणना परिणाम के रूप में प्रतिशत-दस-दस संख्या पैदा करती है; एक प्रक्रिया जो कि उपलब्ध मेमोरी के प्रत्येक बाइट का उपयोग कर रही है, उसका स्कोर 1000 होगा, जबकि बिना मेमोरी का उपयोग करने वाली प्रक्रिया को शून्य का स्कोर मिलेगा। इस स्कोर के लिए बहुत कम अनुमानी मोड़ हैं, लेकिन कोड अभी भी इस धारणा पर रूट-स्वामित्व वाली प्रक्रियाओं के स्कोर से एक छोटी राशि (30) घटाता है कि वे उपयोगकर्ता-स्वामित्व वाली प्रक्रियाओं की तुलना में थोड़ा अधिक मूल्यवान हैं।

एक अन्य ट्वीक जो लागू किया जाता है वह प्रत्येक प्रक्रिया के oom_score_adj चर में संग्रहीत मूल्य को जोड़ना है, जिसे इस खरीद के माध्यम से समायोजित किया जा सकता है। यह नॉब यूजर स्पेस में OOM किलर को प्रत्येक प्रक्रिया के आकर्षण के समायोजन की अनुमति देता है; इसे -1000 पर सेट करना OOM को पूरी तरह से अक्षम कर देगा, जबकि +1000 पर सेट करना संबंधित प्रक्रिया पर एक बड़े लक्ष्य को पेंट करने के बराबर है।

संदर्भ

http://www.queryhome.com/15491/whats-happening-kernel-starting-killer-choose-which-process https://serverfault.com/a/571326


3
क्या अच्छाई भी एक भूमिका नहीं निभाती है?
neverMind9
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.