आपकी टिप्पणी से, ऐसा लगता है कि सिस्टम सिर्फ स्वैप कर रहा है।
लिनक्स में एक OOM किलर है, जिसे तब लगाया जाता है जब सिस्टम ने मेमोरी को ओवरकम कर दिया है, और अब बाहर चला गया है।
लिनक्स बाय डिफॉल्ट मेमोरी ओवरकमिट करता है, जिसका मूल अर्थ है कि यह प्रोग्राम को वास्तव में सिस्टम की तुलना में अधिक मेमोरी देता है। यह इस धारणा पर करता है कि प्रोग्राम वास्तव में उन सभी मेमोरी का उपयोग नहीं करेंगे जो वे पूछते हैं। हालाँकि जब सिस्टम मेमोरी से बाहर चला जाता है, तो यह पहले से ही चल रही विभिन्न प्रक्रियाओं को बताता है कि उनके पास मेमोरी है, इसलिए यह इसे और अधिक अस्वीकार नहीं कर सकता है। इसके बजाय यह क्या करता है कि OOM हत्यारे को आमंत्रित करना है। ओओएम हत्यारा मूल रूप से एक प्रक्रिया पाता है जो कर्नेल को लगता है कि स्मृति की स्थिति को समाप्त कर देगा। आमतौर पर यह केवल स्मृति की सबसे अधिक मात्रा का उपयोग करने वाली प्रक्रिया है, लेकिन एल्गोरिथ्म वास्तव में इससे कहीं अधिक जटिल है।
जब से आपने (स्वचालित मोड) में overcommit_memory
सेट किया है 0
, कर्नेल मेमोरी ओवरकॉमिट कर रहा है। तो आपके समझाए गए व्यवहार से, ऐसा लगता है कि सिस्टम सिर्फ ज़ोर से स्वैप कर रहा है।
यहां से 2 विकल्प हैं।
स्वैप कम करें
आपका सिस्टम RAM से बाहर चल रहा है, और इसलिए कर्नेल चीजों को स्वैप करना शुरू कर देता है। यदि आपका सिस्टम स्वैप से बाहर चला जाता है, तो यह OOM किलर को आमंत्रित करता है। हालाँकि जब से आपने मुक्त स्वैप स्थान शेष रखा है, ऐसा नहीं होता है।
आपका मूल विचार, मैन्युअल रूप से एक प्रक्रिया को मारता है।
आप मैन्युअल रूप से एक प्रक्रिया को मार सकते हैं जब आपको लगता है कि सिस्टम बहुत अधिक स्वैप कर रहा है और कुछ को मरने की आवश्यकता है। यह कर्नेल SysRq ट्रिगर के माध्यम से किया जा सकता है।
कर्नेल के पास "मैजिक सिक्रक" है। यह कार्यक्षमता का एक सा है जो कर्नेल को कुछ प्रकार के आपातकालीन ऑपरेशन करने के लिए कहता है। यह "रीमाउंट ऑल वॉल्यूम रीड-ओनली", "सिंक ऑल फाइलसिस्टम", या "रिबूट नाउ" जैसी चीजें हो सकती हैं। इनमें से एक विकल्प OOM किलर को लागू करना भी है।
यदि आपके कर्नेल में जादू SysRq सक्षम (कर्नेल विकल्प CONFIG_MAGIC_SYSRQ
) है, तो आप इसे 2 तरीकों से कर सकते हैं।
- Alt+ SysRq+ f
बस कीबोर्ड पर इन 3 कुंजियों को दबाएं।
echo f > /proc/sysrq-trigger
यह कीबोर्ड विधि के समान सटीक कार्य करेगा, लेकिन प्रोग्राम के अनुसार ऐसा करता है।
आप स्वैप को पूरी तरह से अक्षम भी कर सकते हैं, और यह मैं अपने अधिकांश सिस्टम पर करता हूं, और इस सटीक कारण के लिए। इसमें स्वैप फायदेमंद है कि कर्नेल प्रीमेच्योर रूप से उन डेटा को स्वैप करेगा, जिनका उपयोग नहीं किया जा रहा है, जिससे आपके अधिक रैम को कैशिंग के लिए उपयोग किया जा सकता है। लेकिन यह इस ज़बरदस्त स्वैपिंग मुद्दे की ओर जाता है जिसे आप देख रहे हैं।
मुझे व्यक्तिगत रूप से लगता है कि सबसे अच्छा समाधान किसी प्रकार का कर्नेल विकल्प है, जो जबरदस्ती स्वैपिंग पर OOM हत्यारे को आमंत्रित करता है। मूल रूप से प्रीमेप्टिव स्वैप काम करते हैं, लेकिन अगर कर्नेल को स्वैप में कुछ स्थानांतरित करने के लिए मजबूर किया जाता है क्योंकि आप RAM से बाहर हैं, तो OOM किलर को आमंत्रित करें।
दुर्भाग्य से यह सिर्फ मेरी अपनी व्यक्तिगत इच्छा है। यह ऐसा नहीं करता है।