आपको cgroups का उपयोग करना चाहिए। डिस्ट्रोस और कर्नेल पर माउंट पॉइंट और विवरण अलग हैं। अर्थात। स्टॉक कर्नेल के साथ डेबियन 7.0 डिफ़ॉल्ट रूप से cgroupfs माउंट नहीं करता है और मेमोरी सबसिस्टम अक्षम है (लोग cgroup_enabled=memory के साथ रीबूट करने की सलाह देते हैं) जबकि ओपनएसयूएसई 13.1 बॉक्स से बाहर (ज्यादातर सिस्टमड के कारण) के साथ भेज दिया गया है।
तो सबसे पहले, माउंट पॉइंट बनाएं और cgroupfs माउंट करें यदि अभी तक आपके डिस्ट्रो द्वारा नहीं किया गया है:
mkdir /sys/fs/cgroup/cpu
mount -t cgroup -o cpuacct,cpu cgroup /sys/fs/cgroup/cpu
mkdir /sys/fs/cgroup/memory
mount -t cgroup -o memory cgroup /sys/fs/cgroup/memory
एक समूह बनाएं:
mkdir /sys/fs/cgroup/cpu/shell
mkdir /sys/fs/cgroup/memory/shell
एक सीग्रुप सेट करें। मैंने सीपीयू शेयर में बदलाव करने का फैसला किया है . इसके लिए डिफ़ॉल्ट मान 1024 है, इसलिए इसे 128 पर सेट करना cgroup को सभी CPU संसाधनों के 11% तक सीमित कर देगा, अगर प्रतिस्पर्धी हैं। यदि अभी भी मुक्त सीपीयू संसाधन हैं तो उन्हें मोंगोडम्प को दिया जाएगा। आप cpuset
. का भी उपयोग कर सकते हैं इसके लिए उपलब्ध कोर की संख्या को सीमित करने के लिए।
echo 128 > /sys/fs/cgroup/cpu/shell/cpu.shares
echo 50331648 > /sys/fs/cgroup/memory/shell/memory.limit_in_bytes
अब पीआईडी को सीग्रुप में जोड़ें यह उनके सभी बच्चों को भी प्रभावित करेगा।
echo 13065 > /sys/fs/cgroup/cpu/shell/tasks
echo 13065 > /sys/fs/cgroup/memory/shell/tasks
मैं कुछ परीक्षण चलाता हूं। मेम का गुच्छा आवंटित करने का प्रयास करने वाले पायथन को OOM द्वारा मार दिया गया था:
[email protected]:~$ python -c 'l = range(3000000)'
Killed
मैंने चार अनंत लूप और cgroup में पांचवां भी चलाया है। जैसा कि अपेक्षित था, cgroup में चलने वाले लूप को CPU समय का केवल 45% मिला, जबकि बाकी को 355% (मेरे पास 4 कोर हैं)।
वे सभी परिवर्तन रीबूट होने से नहीं बचते हैं!
आप इस कोड को एक स्क्रिप्ट में जोड़ सकते हैं जो मोंगोडम्प चलाती है, या कुछ स्थायी समाधान का उपयोग करती है।