मेरे पास एक मानक लिनक्स (डेबियन परीक्षण) लैपटॉप है, जिसमें एक स्वैप विभाजन है।
मैं इसके साथ बहुत सारे प्रयोग करता हूं। उनमें से कुछ वास्तव में भूख लगी है और लिनक्स डिफ़ॉल्ट रूप से व्यवहार करता है मेरे लिए एक मुद्दा है ... आइए एक बेवकूफ उदाहरण दें:
- लैपटॉप के सामने बैठो
- एक टर्मिनल खोलें
- टाइप करें
python
, तबa = [0]*100000000
अब संभावना अधिक है कि आपके पास उस बड़ी सूची को संभालने के लिए पर्याप्त रैम नहीं होगी। लिनक्स रैम को भर देगा, फिर स्वैप और कुछ मिनट बाद, OOM हत्यारा ट्रिगर हो जाएगा और (लगभग) यादृच्छिक सेवाओं को मार देगा और उम्मीद है, अगर आप अच्छे समय में Ctrl + C मारते हैं python
, और यदि टर्मिनल अभी भी फोकस था, कंप्यूटर फिर से उत्तरदायी हो जाएगा।
मैं उस अनचाहे स्वैपिंग से बचने और एक प्रक्रिया से इंकार करने के लिए कुछ मेमोरी लिमिट लागू करना चाहता हूं, जितना कि मेरे पास (RAM में) अधिक मेमोरी आवंटित करने का अधिकार है। यदि मेमोरी डिमांड एक निश्चित सीमा से कम है या रूट द्वारा पूछा गया है, तो बस रूट को छोड़कर किसी भी उपयोगकर्ता की सबसे मेमोरी भूख प्रक्रिया को मार दें।
ulimit -Sv [mem]
मैं पीछे में सुनता हूँ!
हो हो! "उपयोग cgroups
के माध्यम से cgexec
!" पहली पंक्ति में कोई कहता है!
हां, आप सही हैं: ये वास्तव में बहुत अच्छे समाधान हैं। परंतु:
- वे सिस्टम-वाइड लागू नहीं करते हैं
- सीमाएँ प्रति-प्रक्रिया निर्धारित हैं
- सीमाएं स्थिर हैं, वास्तविक राशि की नि: शुल्क रैम की उपेक्षा (AFAIK)
- यहाँ और वहाँ , वे कहते हैं कि ये वास्तव में कठिन सीमाओं को लागू करने के लिए एक अच्छा समाधान नहीं हैं।
मैं यह चाहूंगा कि कर्नेल कहे: "आप उपयोगकर्ता फू (रूट नहीं) से संबंधित हैं, आप बहुत सारी मेमोरी का उपयोग करते हैं और हम मेमोरी से बाहर निकलने वाले हैं। क्षमा करें दोस्त ... अब मर जाओ!"
या: "आप क्या कर रहे हैं? आपको x MB की आवश्यकता है और केवल y MB उपलब्ध है। हां, SWAP खाली है, लेकिन आप अपने गंदे काम करने के लिए SWAP का उपयोग करने का इरादा नहीं रखते हैं, क्या आप? नहीं, मैं आपके लिए कोई स्मृति नहीं है! यदि आप जोर देते हैं, तो आप मरने वाले हैं! "
overcommit_memory
विशेष फ़ाइल RAM + SWAP का उपयोग करने योग्य मेमोरी के रूप में करती है। मैं अभी भी स्वैप करने जा रहा हूँ :)
ulimits
एक बुरा विचार है जैसा कि लगभग हर जगह दिखाया गया है क्योंकि यह एक प्रति प्रक्रिया सीमा है ... मुझे पता है कि आप के बारे में :) cgroups
, यह निश्चित रूप से बेहतर है, लेकिन कुछ और सामान्य का अभाव है: मैं अपने लैपटॉप के बारे में बात कर रहा हूं लेकिन मैं भी एक "गणना" सर्वर का मालिक है जिसे हम साझा करने के लिए तीन हैं। यदि मैं ऐसी प्रति उपयोगकर्ता सीमा लागू करता हूं, तो मैं सबसे खराब स्थिति में सीमित रहूंगा, क्या मैं नहीं?
/proc/sys/vm/overcommit_memory
कम मेमोरी पर कर्नेल व्यवहार को प्रभावित करता है।