- अत्यधिक स्वैपिंग के कारण गैर-जिम्मेदार या बेहद सुस्त हो चुके लिनक्स सिस्टम पर नियंत्रण पाने का सबसे तेज़ तरीका क्या है?
पहले से ही साथ जवाब दिया Alt-SysRq-एफ
- क्या इस तरह की अदला-बदली को रोकने के लिए एक प्रभावी तरीका है, उदाहरण के लिए, स्मृति की मात्रा को सीमित करके एक प्रक्रिया को आवंटित करने की कोशिश करने की अनुमति है?
मैं इस 2 भाग का जवाब दे रहा हूं। हाँ, ulimit
अभी भी एक ही प्रक्रिया को सीमित करने के लिए पर्याप्त रूप से काम करता है। आप ऐसा कर सकते हैं:
- एक प्रक्रिया के लिए एक नरम सीमा निर्धारित करें जिसे आप जानते हैं कि वह नियंत्रण से बाहर हो जाएगी
- यदि आप अतिरिक्त बीमा चाहते हैं तो सभी प्रक्रियाओं के लिए एक कठिन सीमा निर्धारित करें
जैसा कि, संक्षेप में बताया गया है:
आप संसाधन उपयोग को सीमित करने और ऐसी समस्याओं को रोकने के लिए सीजीग्रुप का उपयोग कर सकते हैं
वास्तव में, cgroups अधिक उन्नत नियंत्रण प्रदान करते हैं, लेकिन वर्तमान में मेरी राय में कॉन्फ़िगर करने के लिए अधिक जटिल हैं।
पुराना स्कूल अलिमित
एक बार बंद
एक सरल उदाहरण है:
$ bash
$ ulimit -S -v $((1*2**20))
$ r2(){r2 $@$@;};r2 r2
bash: xmalloc: .././subst.c:3550: cannot allocate 134217729 bytes (946343936 bytes allocated)
यह:
- 1GB समग्र मेमोरी उपयोग की नरम सीमा निर्धारित करता है (kB इकाई में सीमा सीमित करता है)
- एक पुनरावर्ती बैश फ़ंक्शन कॉल चलाता है
r2(){ r2 $@$@;};r2 r2
स्टैक मेमोरी को रिक्वेस्ट करते हुए CPU और RAM को तेजी से दोगुना करते हुए तेजी से चबाता है।
जैसा कि आप देख सकते हैं, 1GB से अधिक अनुरोध करने की कोशिश करने पर यह बंद हो गया।
ध्यान दें, -v
वर्चुअल मेमोरी एलोकेशन (कुल, यानी फिजिकल + स्वैप) पर काम करता है।
स्थायी सुरक्षा
वर्चुअल मेमोरी आवंटन को सीमित करने के लिए, as
के बराबर है -v
के लिये limits.conf
।
मैं किसी भी दुर्व्यवहार प्रक्रिया से बचाने के लिए निम्नलिखित कार्य करता हूं:
- सभी प्रक्रियाओं के लिए एक हार्ड एड्रेस स्पेस लिमिट सेट करें।
address space limit = <physical memory> - 256MB
।
- इसलिए, लालची मेमोरी उपयोग या एक सक्रिय लूप और मेमोरी लीक के साथ कोई भी एकल प्रक्रिया सभी भौतिक मेमोरी का उपभोग नहीं कर सकती है।
- 256MB हेडरूम ssh या कंसोल के साथ आवश्यक प्रसंस्करण के लिए है।
एक लाइन:
$ sudo bash -c "echo -e \"*\thard\tas\t$(($(grep -E 'MemTotal' /proc/meminfo | grep -oP '(?<=\s)\d+(?=\skB$)') - 256*2**10))\" > /etc/security/limits.d/mem.conf"
मान्य करने के लिए, यह निम्नलिखित (जैसे 16GB सिस्टम पर) होता है:
$ cat /etc/security/limits.d/mem.conf
* hard as 16135196
$ ulimit -H -v
161351960
टिप्पणियाँ:
- मेमोरी उपयोग के साथ ओवरबोर्ड जाने वाली एकल प्रक्रिया के खिलाफ केवल मिती
- भारी मेमोरी दबाव के साथ एक बहु-प्रक्रिया कार्यभार को नहीं रोकेंगे, जिसके कारण थ्रशिंग (जवाब तब होता है)
- उपयोग न करें
rss
सीमा में विकल्प ।conf। यह नई गुठली द्वारा सम्मानित नहीं है।
- यह रूढ़िवादी है।
- सिद्धांत रूप में, एक प्रक्रिया सट्टा रूप से बहुत सारी मेमोरी का अनुरोध कर सकती है लेकिन केवल सक्रिय रूप से एक सबसेट (छोटे कामकाजी सेट / निवासी मेमोरी उपयोग) का उपयोग करें।
- उपरोक्त कठिन सीमा के कारण ऐसी प्रक्रियाएं निरस्त हो जाएंगी (भले ही वे ठीक से चलाए गए लिनक्स को भी याद कर सकें, वर्चुअल मेमोरी एड्रेस स्पेस को ओवरकम्यूज किया जा सकता है)।
नए सीजी समूह
अधिक नियंत्रण प्रदान करता है, लेकिन वर्तमान में उपयोग करने के लिए अधिक जटिल है:
- Ulimit की पेशकश पर सुधार।
memory.max_usage_in_bytes
खाते और भौतिक स्मृति को अलग से सीमित कर सकते हैं।
- जहाँ तक
ulimit -m
और / या rss
में limits.conf
इसी तरह की कार्यक्षमता की पेशकश करने के लिए था, लेकिन यह कर्नेल लिनक्स 2.4.30 से काम नहीं करता है
- बूटलोडर में कुछ कर्नेल cgroup ध्वज सक्षम करने की आवश्यकता है:
cgroup_enable=memory swapaccount=1
।
- यह Ubuntu 16.04 के साथ डिफ़ॉल्ट रूप से नहीं हुआ।
- संभवतः अतिरिक्त लेखांकन ओवरहेड के कुछ प्रदर्शन निहितार्थों के कारण।
- cgroup / systemd सामान अपेक्षाकृत नया है और एक उचित बिट को बदल रहा है, इसलिए फ्लक्स अपस्ट्रीम का अर्थ लिनक्स डिस्ट्रो विक्रेताओं ने अभी तक इसका उपयोग करना आसान नहीं बनाया है। 14.04LTS और 16.04LTS के बीच, cgroups का उपयोग करने के लिए उपयोगकर्ता का स्थान बदल गया है।
cgm
अब आधिकारिक तौर पर समर्थित यूजरस्पेस टूल लगता है।
- सिस्टमड यूनिट फाइलें अभी तक ssh जैसी महत्वपूर्ण सेवाओं को प्राथमिकता देने के लिए किसी भी पूर्व-परिभाषित "वेंडर / डिस्ट्रो" डिफॉल्ट को नहीं लगती हैं।
जैसे वर्तमान सेटिंग्स की जांच करने के लिए:
$ echo $(($(cat /sys/fs/cgroup/memory/memory.max_usage_in_bytes) / 2**20)) MB
11389 MB
$ cat /sys/fs/cgroup/memory/memory.stat
...
जैसे किसी एकल प्रक्रिया की मेमोरी को सीमित करने के लिए:
$ cgm create memory mem_1G
$ cgm setvalue memory mem_1G memory.limit_in_bytes $((1*2**30))
$ cgm setvalue memory mem_1G memory.memsw.limit_in_bytes $((1*2**30))
$ bash
$ cgm movepid memory mem_1G $$
$ r2(){ r2 $@$@;};r2 r2
Killed
एक बैकग्राउंड प्रोसेस के रूप में रैम को चबाने की क्रिया में देखना और फिर मारना
$ bash -c 'cgm movepid memory mem_1G $$; r2(){ r2 $@$@;};r2 r2' & while [ -e /proc/$! ]; do ps -p $! -o pcpu,pmem,rss h; sleep 1; done
[1] 3201
0.0 0.0 2876
102 0.2 44056
103 0.5 85024
103 1.0 166944
...
98.9 5.6 920552
99.1 4.3 718196
[1]+ Killed bash -c 'cgm movepid memory mem_1G $$; r2(){ r2 $@$@;};r2 r2'
स्मृति अनुरोधों में घातांक (2 की शक्ति) नोट करें।
भविष्य में, आइए SSH और ग्राफ़िकल स्टैक जैसी महत्वपूर्ण चीज़ों के लिए "डिस्ट्रो / वेंडर्स" को पूर्व-कॉन्फ़िगर cgroup प्राथमिकताओं और सीमाओं (सिस्टमड इकाइयों के माध्यम से) में देखने की उम्मीद करें, जैसे कि वे कभी भी स्मृति से भूखे न हों।