एक सीपीयू के लिए श्वेतसूची को छोड़कर सभी प्रक्रियाओं को सीमित करने के लिए cgroups का उपयोग कैसे करें?


26

Red Hat से cgroups के लिए एक मार्गदर्शिका है जो शायद इस तरह के सहायक की तरह है (लेकिन इस प्रश्न का उत्तर नहीं देता है)।

मुझे पता है कि उस प्रक्रिया को शुरू करने के लिए एक विशिष्ट सीपीयू में किसी विशिष्ट प्रक्रिया को कैसे सीमित किया जाए, इस प्रक्रिया को शुरू करने के लिए:

सबसे पहले, निम्नलिखित में डाल /etc/cgconfig.conf:

mount {
  cpuset =  /cgroup/cpuset;
  cpu =     /cgroup/cpu;
  cpuacct = /cgroup/cpuacct;
  memory =  /cgroup/memory;
  devices = /cgroup/devices;
  freezer = /cgroup/freezer;
  net_cls = /cgroup/net_cls;
  blkio =   /cgroup/blkio;
}

group cpu0only {
  cpuset {
    cpuset.cpus = 0;
    cpuset.mems = 0;
  }
}

और फिर एक प्रक्रिया शुरू करें और इसे विशेष रूप से उस cgroup में उपयोग करके असाइन करें:

cgexec -g cpuset:cpu0only myprocessname

मैं एक विशिष्ट प्रक्रिया के नाम के सभी उदाहरणों को स्वचालित रूप से सीमित कर सकता हूं (मुझे लगता है कि यह सही है) निम्नलिखित को डाल रहा है /etc/cgrules.conf:

# user:process  controller  destination
*:myprocessname cpuset      cpu0only

मेरा सवाल है: मैं रिवर्स कैसे कर सकता हूं ?

दूसरे शब्दों में, एक प्रतिबंधित cgroup में श्वेतसूचीबद्ध प्रक्रियाओं और उनके बच्चों के एक विशिष्ट समूह को छोड़कर मैं सभी प्रक्रियाओं को कैसे निर्दिष्ट कर सकता हूं ?


मैंने जो भी अध्ययन किया है उसके आधार पर, लेकिन परीक्षण नहीं किया है, मेरा मानना ​​है कि एक आंशिक समाधान होगा:

"अप्रतिबंधित" cgroup जोड़ें:

group anycpu {
  cpuset {
    cpuset.cpus = 0-31;
    cpuset.mems = 0;  # Not sure about this param but it seems to be required
  }
}

स्पष्ट रूप से अप्रतिबंधित समूह, और प्रतिबंधित समूह के लिए और सब कुछ के लिए मेरी प्रक्रिया असाइन करें:

# user:process  controller  destination
*:myprocessname cpuset      anycpu
*               cpuset      cpu0only

हालांकि, इस पर चेतावनी यह है कि (डॉक्स पढ़ने से, परीक्षण से नहीं, नमक के दाने से) ऐसा लगता है कि बच्चों के myprocessnameप्रतिबंधित cpu0onlyसीग्रुप को फिर से सौंपा जाएगा ।

एक संभावित वैकल्पिक दृष्टिकोण एक उपयोगकर्ता को चलाने के लिए बनाना होगा myprocessnameऔर उस उपयोगकर्ता की सभी प्रक्रियाओं को अप्रतिबंधित करना होगा, और बाकी सब कुछ प्रतिबंधित होगा। हालांकि, मेरे वास्तविक उपयोग के मामले में, प्रक्रिया को रूट द्वारा चलाने की आवश्यकता है, और अन्य प्रक्रियाएं भी हैं जिन्हें रूट द्वारा भी चलाया जाना चाहिए जो प्रतिबंधित होना चाहिए।

मैं इसे cgroups के साथ कैसे पूरा कर सकता हूं?


यदि यह cgroups (जो मुझे अब संदेह है मामला है) के साथ संभव नहीं है , क्या आंशिक समाधान के मेरे विचार सही हैं और क्या वे मेरे विचार से काम करेंगे?

* अस्वीकरण: यह शायद एक न्यूनतम कोड उदाहरण नहीं है; मैं सभी भागों को नहीं समझता हूं इसलिए मुझे नहीं पता कि यह आवश्यक नहीं है।

जवाबों:


30

अद्यतन: ध्यान दें कि नीचे दिया गया उत्तर आरएचईएल 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और anycpucgroup बनाओ । (सुनिश्चित करें cgconfigकि बूट पर चलना तय है।)

* cpuset cpu0onlyमेरे प्रश्न में वर्णित नियम बनाइए । (और सुनिश्चित करें cgredकि बूट पर चलना तय है।)

ऐसी कोई भी प्रक्रिया मैं चाहता हूँ शुरू अप्रतिबंधित साथ: cgexec -g cpuset:anycpu --sticky myprocessname

उन प्रक्रियाओं को अप्रतिबंधित किया जाएगा, और उनकी सभी बाल प्रक्रियाओं को भी अप्रतिबंधित किया जाएगा। सिस्टम पर बाकी सब कुछ सीपीयू 0 (जब आप रिबूट होता है, तब से प्रतिबंधित हो जाएगा, क्योंकि cgredयह पहले से ही चल रही प्रक्रियाओं के लिए जब तक कि वे अपना ईयूआईडी नहीं बदल लेते हैं) लागू नहीं होते हैं। यह पूरी तरह से उचित नहीं है, लेकिन यही मैंने शुरू में अनुरोध किया था और यह cgroups के साथ किया जा सकता है।


वाह। ठंडा। यह 0 वोट कैसे हुआ?
माइकस

@mikeserv, धन्यवाद। :) अपने प्रश्न का उत्तर दें: तिथियों की जांच करें; मैंने कल ही इसका उत्तर लिखा था।
वाइल्डकार्ड

1
मैंने देखा। लेकिन यह 24 घंटे पहले था। शायद इसकी लंबी वजह है। अच्छा सामान कभी-कभी उस तरह से अनदेखा हो सकता है। और वैसे भी, बहुत सारे वोटों के जवाब बहुत जल्द शायद ही कभी अच्छे होते हैं - जानकारी इतनी उपयोगी नहीं हो सकती है अगर बहुत से लोग पहले से ही जानते हैं कि यह है। यह अच्छे लोगों में से एक है, हालांकि। cgroups फ्रिगिन रहस्यमय हैं।
मोकेसर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.