अद्यतन: ध्यान दें कि नीचे दिया गया उत्तर आरएचईएल 6 पर लागू होता है। आरएचईएल 7 में, अधिकांश cgroups को systemd द्वारा प्रबंधित किया जाता है, और libcgroup को हटा दिया जाता है।
इस प्रश्न को पोस्ट करने के बाद से मैंने पूरे गाइड का अध्ययन किया है जिसे मैंने ऊपर से जोड़ा है, साथ ही साथ cgroups.txt प्रलेखन और cpusets.txt के बहुमत । अब मैं cgroups के बारे में जानने की अपेक्षा से अधिक जानता हूं, इसलिए मैं यहां अपने प्रश्न का उत्तर दूंगा।
कई दृष्टिकोण हैं जिन्हें आप ले सकते हैं। Red Hat (एक तकनीकी वास्तुकार) में हमारी कंपनी के संपर्क ने अधिक घोषणात्मक दृष्टिकोण के लिए सभी प्रक्रियाओं के एक कंबल प्रतिबंध के खिलाफ सिफारिश की - केवल उन प्रक्रियाओं को सीमित करना जो हम विशेष रूप से प्रतिबंधित चाहते थे। इस विषय पर उनके बयानों के अनुसार, इसका कारण यह है कि सिस्टम कॉल के लिए उपयोगकर्ता स्थान कोड (जैसे LVM प्रक्रिया) पर निर्भर होना संभव है, जो प्रतिबंधित होने पर सिस्टम को धीमा कर सकता है - इच्छित प्रभाव के विपरीत। इसलिए मैंने कई विशेष रूप से नामित प्रक्रियाओं को प्रतिबंधित कर दिया और सब कुछ अकेले छोड़ दिया।
इसके अतिरिक्त, मैं कुछ cgroup मूल डेटा का उल्लेख करना चाहता हूं जो मुझे अपना प्रश्न पोस्ट करते समय याद आ रहा था।
Cgroups स्थापित होने पर निर्भर नहीं करते हैं libcgroup
। हालाँकि, यह स्वचालित रूप से cgroup कॉन्फ़िगरेशन और प्रक्रिया असाइनमेंट को cgroups से निपटने के लिए उपकरणों का एक सेट है और बहुत मददगार हो सकता है।
मैंने पाया कि libcgroup टूल भ्रामक भी हो सकते हैं, क्योंकि libcgroup पैकेज आपके अपने cgroups के उपयोग के बारे में अमूर्त और मान्यताओं के अपने सेट पर बनाया गया है , जो cgroups के वास्तविक कर्नेल स्तर कार्यान्वयन से थोड़ा अलग हैं। (मैं उदाहरण रख सकता हूं, लेकिन यह कुछ काम लेगा, यदि आपकी रुचि है तो टिप्पणी करें।)
इसलिए, libcgroup उपकरण का उपयोग कर से पहले (जैसे /etc/cgconfig.conf
, /etc/cgrules.conf
, cgexec
, cgcreate
, cgclassify
, आदि) मैं अत्यधिक साथ बहुत परिचित हो रही सलाह देते हैं /cgroup
आभासी फाइल सिस्टम ही है, और मैन्युअल रूप से cgroups, cgroup पदानुक्रम (संलग्न कई उप साथ पदानुक्रम सहित, जो sneakily libcgroup और leakily सार बनाने दूर), अलग-अलग cgroups को चलाने के द्वारा प्रक्रियाओं को पुन: सौंपता है echo $the_pid > /cgroup/some_cgroup_hierarchy/a_cgroup_within_that_hierarchy/tasks
, और अन्य प्रतीत होता है जादुई कार्य जो libcgroup
हुड के तहत करता है।
एक और मूल अवधारणा मुझे याद आ रही थी कि यदि /cgroup
वर्चुअल फाइलसिस्टम आपके सिस्टम पर आरोहित है (या अधिक सटीक रूप से, यदि कोई cgroup सबसिस्टम उर्फ "नियंत्रकों" सभी पर आरोहित हैं), तो आपके पूरे सिस्टम पर हर प्रक्रिया एक में है cgroup। "कुछ प्रक्रियाएँ cgroup में हैं और कुछ नहीं हैं" जैसी कोई बात नहीं है।
किसी दिए गए पदानुक्रम के लिए रूट cgroup कहा जाता है, जो संलग्न सबसिस्टम के लिए सिस्टम के सभी संसाधनों का मालिक है । उदाहरण के लिए एक cgroup पदानुक्रम जिसमें cpuset और blkio सबसिस्टम संलग्न हैं, एक रूट cgroup होगा जो सिस्टम पर सभी cpus का मालिक होगा और सिस्टम पर सभी blkio होगा, और चाइल्ड cgroups के साथ उन संसाधनों में से कुछ को साझा कर सकता है । आप रूट cgroup को प्रतिबंधित नहीं कर सकते क्योंकि यह आपके सभी सिस्टम के संसाधनों का मालिक है , इसलिए इसे प्रतिबंधित करना भी समझ में नहीं आएगा।
कुछ अन्य साधारण डेटा जो मुझे libcgroup के बारे में याद आ रहे थे:
यदि आप उपयोग करते हैं /etc/cgconfig.conf
, तो आपको यह सुनिश्चित करना चाहिए कि सिस्टम बूट पर चलने के लिए निर्धारित chkconfig --list cgconfig
शो cgconfig
।
यदि आप बदलते हैं /etc/cgconfig.conf
, तो आपको परिवर्तनों service cgconfig restart
को लोड करने के लिए चलाने की आवश्यकता है । (और सेवा को रोकने या cgclear
परीक्षण के दौरान बेवकूफ बनाने के साथ समस्याएं बहुत आम हैं। डिबगिंग के लिए मैं सलाह देता हूं, उदाहरण के लिए lsof /cgroup/cpuset
, यदि cpuset
आप उपयोग कर रहे cgroup पदानुक्रम का नाम है।)
यदि आप उपयोग करना चाहते हैं /etc/cgrules.conf
, तो आपको "cgroup rules engine daemon" ( cgrulesengd
) चल रहा है: service cgred start
और chkconfig cgred on
। (और आपको इस सेवा के बारे में संभावित लेकिन असंभावित दौड़ की स्थिति के बारे में पता होना चाहिए, जैसा कि पृष्ठ के निचले भाग में 2.8.1 खंड में Red Hat संसाधन प्रबंधन गाइड में वर्णित है ।)
यदि आप मैन्युअल रूप से बेवकूफ बनाना चाहते हैं और वर्चुअल फाइलसिस्टम (जो मैं पहले उपयोग के लिए सलाह देता हूं) का उपयोग करके अपने cgroups को सेट कर सकता हूं, तो आप ऐसा कर सकते हैं और फिर अपने विभिन्न विकल्पों के साथ cgconfig.conf
उपयोग करके अपने सेटअप को मिरर करने के लिए एक फ़ाइल बना सकते हैं cgsnapshot
।
और अंत में, जानकारी का मुख्य टुकड़ा मुझे याद आ रहा था जब मैंने निम्नलिखित लिखा था:
हालाँकि, इस पर चेतावनी यह है ... कि myprocessname के बच्चों को प्रतिबंधित cpu0only cgroup में फिर से असाइन किया जाएगा।
मैं सही था, लेकिन एक विकल्प है जिससे मैं अनजान था।
cgexec
एक प्रक्रिया शुरू करने / एक कमांड चलाने और इसे एक cgroup में असाइन करने के लिए कमांड है।
cgclassify
cgroup में पहले से चल रही प्रक्रिया को असाइन करने का कमांड है।
ये दोनों भी निर्दिष्ट प्रक्रिया को एक अलग cgroup के आधार पर पुन: असाइन करने से cgred
( cgrulesengd
) रोकेंगे /etc/cgrules.conf
।
दोनों cgexec
और cgclassify
समर्थन --sticky
झंडा है, जो अतिरिक्त रोकता है cgred
फिर नियत से बच्चे प्रक्रियाओं पर आधारित /etc/cgrules.conf
।
इसलिए, इस प्रश्न का उत्तर जैसा कि मैंने इसे लिखा था (हालांकि सेटअप मैंने समाप्त नहीं किया था, क्योंकि हमारे Red Hat तकनीकी वास्तुकार की सलाह ऊपर बताई गई है):
मेरे प्रश्न में वर्णित के रूप में cpu0only
और anycpu
cgroup बनाओ । (सुनिश्चित करें cgconfig
कि बूट पर चलना तय है।)
* cpuset cpu0only
मेरे प्रश्न में वर्णित नियम बनाइए । (और सुनिश्चित करें cgred
कि बूट पर चलना तय है।)
ऐसी कोई भी प्रक्रिया मैं चाहता हूँ शुरू अप्रतिबंधित साथ: cgexec -g cpuset:anycpu --sticky myprocessname
।
उन प्रक्रियाओं को अप्रतिबंधित किया जाएगा, और उनकी सभी बाल प्रक्रियाओं को भी अप्रतिबंधित किया जाएगा। सिस्टम पर बाकी सब कुछ सीपीयू 0 (जब आप रिबूट होता है, तब से प्रतिबंधित हो जाएगा, क्योंकि cgred
यह पहले से ही चल रही प्रक्रियाओं के लिए जब तक कि वे अपना ईयूआईडी नहीं बदल लेते हैं) लागू नहीं होते हैं। यह पूरी तरह से उचित नहीं है, लेकिन यही मैंने शुरू में अनुरोध किया था और यह cgroups के साथ किया जा सकता है।