सीमित रैम उपयोग के साथ उपयोगकर्ता कैसे बनाएं?


43

तो मेरे पास 4 जीबी रैम + 4 जीबी स्वैप है। मैं सीमित रैम और स्वैप के साथ एक उपयोगकर्ता बनाना चाहता हूं: 3 जीबी रैम और 1 जीबी स्वैप। क्या ऐसा संभव है? क्या सीमित उपयोगकर्ता के साथ अनुप्रयोग शुरू करना और एक अलग उपयोगकर्ता बनाने के बिना उनके लिए उपलब्ध स्वैप करना संभव है (और कोई विशेष एप्लिकेशन इंस्टॉल नहीं करना - केवल एक डिफ़ॉल्ट डेबियन / CentOS सर्वर कॉन्फ़िगरेशन होना, और sudo का उपयोग नहीं करना)?

अपडेट करें:

इसलिए मैंने टर्मिनला खोला और इसे एलिमिट कमांड में टाइप किया : ulimit -v 1000000जो 976,6Mbसीमा की तरह होगा । आगे मैंने फोन किया ulimit -aऔर देखा कि सीमा "चालू" है। फिर मैंने कुछ बैश स्क्रिप्ट शुरू की जो मेरे ऐप को संकलित करती है और शुरू करती है nohup, एक लंबा nohup ./cloud-updater-linux.sh >& /dev/null & ... लेकिन कुछ समय बाद मैंने देखा:

यहाँ छवि विवरण दर्ज करें

(यदि कोई सीमाएं लागू नहीं हुईं तो यह ठीक होगा - इसने कुछ बड़े परिवादों को डाउनलोड किया, और इसे संकलित करना शुरू किया।)

लेकिन मुझे लगा कि मैंने शेल के लिए सीमाएं लागू की हैं और इसके साथ / से लॉन्च की गई सभी प्रक्रियाएं ulimit -v 1000000? मैंने क्या गलत किया? एक टर्मिनल और सभी उप प्रक्रियाओं को कैसे शुरू किया जाए यह रैम के उपयोग पर सीमित हो?


1
आप प्रत्येक प्रक्रिया पर केवल एक उपयोगकर्ता के रूप में मेमोरी प्रतिबंध नहीं लगा सकते हैं। और आप RAM और स्वैप उपयोग के बीच अंतर नहीं कर सकते। यदि आप बेहतर नियंत्रण चाहते हैं, तो उपयोगकर्ता की प्रक्रियाओं को एक वर्चुअल मशीन में चलाएं।
गाइल्स 'एसओ- बुराई को रोकें'

@ गाइल्स को पूरा यकीन है कि वर्चुअल मशीनें सिर्फ cgroups और namespaces, या डेरिवेटिव का उपयोग करती हैं
RapidWebs

@RapidWebs नहीं वे नहीं। वे बस रैम की पूर्वनिर्धारित राशि का अनुकरण करते हैं, और अतिथि ओएस फिर यह तय करता है कि इसे प्रक्रियाओं को कैसे आवंटित किया जाए।
रुस्लान

कंटेनर (वर्चुअल मशीन नहीं) मेमोरी के उपयोग को सीमित करने के लिए cgroups का उपयोग करते हैं। आभासी स्मृति को सीमित करना एक अच्छा विचार नहीं है; एक प्रक्रिया बहुत सारी वर्चुअल मेमोरी का उपयोग कर सकती है, लेकिन केवल थोड़ी सी रैम का उपयोग कर सकती है। उदाहरण के लिए मेरे सिस्टम में 34359738367 kB वर्चुअल मेमोरी आवंटित है, लेकिन बहुत कम रैम है।
ctrl-alt-delor

जवाबों:


63

ulimitइसके लिए बनाया गया है। आप ulimitप्रति उपयोगकर्ता या प्रति समूह के आधार पर डिफॉल्ट को सेटअप कर सकते हैं

/etc/security/limits.conf

ulimit -v KBYTESअधिकतम वर्चुअल मेमोरी आकार सेट करता है। मुझे नहीं लगता कि आप स्वैप की अधिकतम मात्रा दे सकते हैं। यह उपयोगकर्ता द्वारा उपयोग की जाने वाली वर्चुअल मेमोरी की मात्र एक सीमा है।

तो आपके limits.confपास लाइन होगी (अधिकतम 4Gमेमोरी में)

luser  hard  as   4000000

अद्यतन - सीजी समूह

सीमा द्वारा लगाए गए ulimitऔर limits.confप्रक्रिया के अनुसार है। मैं निश्चित रूप से उस बिंदु पर स्पष्ट नहीं था।

यदि आप उपयोगकर्ताओं द्वारा उपयोग की जाने वाली मेमोरी की कुल मात्रा को सीमित करना चाहते हैं (जो आपने पूछा है)। आप cgroups का उपयोग करना चाहते हैं ।

इन /etc/cgconfig.conf:

group memlimit {
    memory {
        memory.limit_in_bytes = 4294967296;
    }
}

यह cgroup4GIB की अधिकतम मेमोरी सीमा बनाता है ।

इन /etc/cgrules.conf:

luser   memory   memlimit/

यह luserअंदर memlimitबनाई गई cgroups के अंदर चलाने के लिए सभी प्रक्रियाओं के कारण होगा cgconfig.conf


क्या ऐसी कोई बात है useradd?
myWallJSON

4
@myWallJSON सीधे तौर पर नहीं, लेकिन आप इसे तुरंत limit.conf में जोड़ सकते हैं, या आप एक समूह को कुछ सीमाओं के साथ limit.conf में सेट कर सकते हैं और उपयोगकर्ता को उस समूह में जोड़ सकते हैं।
utopiabound

1
वह तो कमाल है! मुझे नहीं पता था कि आप ऐसा कर सकते हैं! शानदार उत्तर +1
यानिक गिरौद

1
@utopiabound: मेरे Q को कुछ डेटा के साथ अद्यतित किया गया, जिन्हें मैं अलिमेट का उपयोग करने की कोशिश कर रहा था।
myWallJSON

1
@ f.ardelian कर्नेल को अपग्रेड करें। यहाँ कैसे करना है के बारे में एक लेख है!
डैनियल सी। सोबरल

4

आप उपयोगकर्ता के स्तर पर मेमोरी उपयोग को कैप नहीं कर सकते हैं, ulimit एक प्रक्रिया के लिए ऐसा कर सकता है।

प्रति उपयोगकर्ता सीमा का उपयोग करने के साथ भी /etc/security/limits.conf, एक उपयोगकर्ता कई प्रक्रियाओं को चलाकर सभी मेमोरी का उपयोग कर सकता है।

क्या आपको वास्तव में संसाधनों को कैप करना चाहिए, आपको एक संसाधन प्रबंधन टूल का उपयोग करने की आवश्यकता है, जैसे कि सोलारिस के तहत प्रोजेक्ट्स और ज़ोन द्वारा उपयोग किए जाने वाले rcapd

ऐसा कुछ है जो लिनक्स पर समान सुविधाएं प्रदान करता है जिसे आप जांच सकते हैं: cgroups


ठीक है, मुझे लगता है कि यूजर्स लॉगइन शेल पर कैप सेट करते हैं या ऐसा कुछ किया जा सकता है, जिसे "यूजर के लिए सीमा तय करना" समझा जा सकता है, क्योंकि सभी प्रक्रिया उस शेल से इनहेरिट होगी?
अमन

1
@amn यह नहीं होगा। एक उपयोगकर्ता बस इस तरह की सीमा को हल करने के लिए एक नया लॉगिन खोल खोल सकता है।
जूलियाग्रे

ठीक है, यह मेरी धारणा को ठीक करता है।
एमएन

3

cgroupsऐसा करने का सही तरीका है, जैसा कि अन्य उत्तरों ने बताया है। दुर्भाग्य से समस्या का कोई सटीक समाधान नहीं है, क्योंकि हम नीचे मिलेंगे। Cgroup मेमोरी उपयोग सीमा निर्धारित करने के विभिन्न तरीकों का एक समूह है। उपयोगकर्ता के लॉगिन सत्र को स्वचालित रूप से एक cgroup का हिस्सा बनाने के बारे में कैसे पता चलता है जो सिस्टम से सिस्टम में भिन्न होता है। Red Hat में कुछ उपकरण हैं, और इसी तरह systemd है

memory.memsw.limit_in_bytesऔर memory.limit_in_bytesक्रमशः स्वैप सहित और सीमा निर्धारित करें। नकारात्मक पक्ष यह memory.limit_in_bytesहै कि यह समूह के कोटे के खिलाफ cgroup में प्रक्रियाओं की ओर से गिरी हुई फाइलों को गिनता है। कम कैशिंग का मतलब अधिक डिस्क एक्सेस है, इसलिए यदि सिस्टम में कुछ मेमोरी उपलब्ध है, तो आप संभावित रूप से कुछ प्रदर्शन दे रहे हैं।

दूसरी ओर, memory.soft_limit_in_bytescgroup को ओवर-कोटा जाने की अनुमति देता है, लेकिन अगर कर्नेल OOM किलर को आमंत्रित किया जाता है, तो उन cgroups जो अपने कोटा से अधिक हैं, पहले तार्किक रूप से मारे जाते हैं। हालांकि, इसका नकारात्मक पहलू यह है कि ऐसी स्थितियां हैं, जहां कुछ मेमोरी की तुरंत आवश्यकता होती है और ओओएम किलर के पास प्रक्रियाओं को मारने के लिए चारों ओर देखने के लिए समय नहीं है, इस मामले में ओवर-कोटा उपयोगकर्ता की प्रक्रियाओं से पहले कुछ विफल हो सकता है मारे गए।

ulimitहालाँकि, इसके लिए बिल्कुल गलत उपकरण है। ulimit वर्चुअल मेमोरी उपयोग पर सीमाएं रखता है, जो निश्चित रूप से वह नहीं है जो आप चाहते हैं। कई वास्तविक दुनिया के अनुप्रयोग भौतिक मेमोरी की तुलना में कहीं अधिक आभासी मेमोरी का उपयोग करते हैं। अधिकांश कचरा एकत्रित रनटाइम्स (जावा, गो) विखंडन से बचने के लिए इस तरह से काम करते हैं। सी में एक तुच्छ "हैलो वर्ल्ड" प्रोग्राम, यदि एड्रेस सेनिटाइज़र के साथ संकलित किया गया है, तो 20TB वर्चुअल मेमोरी का उपयोग कर सकते हैं। एलाटेटर जो भरोसा नहीं करते हैं sbrk, जैसे जेमलॉक (जो जंग के लिए डिफ़ॉल्ट आवंटनकर्ता है ) या tcmalloc, उनके भौतिक उपयोग के अतिरिक्त वर्चुअल मेमोरी का पर्याप्त उपयोग होगा। कार्यकुशलता के लिए, कई उपकरण एमएमएपी फ़ाइलों को बनाएंगे, जो आभासी उपयोग को बढ़ाते हैं लेकिन जरूरी नहीं कि भौतिक उपयोग हो। मेरी सभी Chrome प्रक्रियाएँ प्रत्येक वर्चुअल मेमोरी के 2TB का उपयोग कर रही हैं। मैं 8GB की फिजिकल मेमोरी वाले लैपटॉप पर हूं। किसी भी तरह से किसी ने यहां वर्चुअल मेमोरी कोटा स्थापित करने की कोशिश की, या तो क्रोम को तोड़ देगा, क्रोम को कुछ सुरक्षा सुविधाओं को अक्षम करने के लिए मजबूर करेगा जो बड़ी मात्रा में वर्चुअल मेमोरी को आवंटित करने (लेकिन उपयोग नहीं करने) पर भरोसा करते हैं, या उपयोगकर्ता को सिस्टम का दुरुपयोग करने से रोकने में पूरी तरह से अप्रभावी होते हैं। ।

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