सीपीयू उपयोग के 10% से अधिक नहीं की प्रक्रियाओं को सीमित करना


32

मैं एक लिनक्स सिस्टम संचालित करता हूं जिसमें बहुत सारे उपयोगकर्ता हैं लेकिन कभी-कभी एक दुरुपयोग होता है; जहां एक उपयोगकर्ता एक ऐसी प्रक्रिया चला सकता है जो 80% से अधिक CPU / मेमोरी का उपयोग करता है।

तो क्या सीपीयू के उपयोग की प्रक्रिया को सीमित करने की मात्रा को सीमित करने से इसे रोकने का एक तरीका है (उदाहरण के लिए 10%) का उपयोग कर सकते हैं? मैं इससे अवगत हूं cpulimit, लेकिन यह दुर्भाग्य से उन प्रक्रियाओं की सीमा को लागू करता है, जो मैं इसे सीमित करने के लिए निर्देश देता हूं (जैसे एकल प्रक्रियाएं)। तो मेरा सवाल यह है कि, मैं सभी चल रही प्रक्रियाओं और प्रक्रियाओं के लिए सीमा कैसे लागू कर सकता हूं जो भविष्य में उनकी आईडी / पथ प्रदान करने की आवश्यकता के बिना चलेंगे?


क्या आप प्रदर्शन की समस्याओं का सामना कर रहे हैं? या यह सिर्फ संख्या है जो आपको परेशान करती है?
ctrl-alt-delor 12

@richard प्रदर्शन समस्याएँ, इसीलिए मैं उन प्रक्रियाओं को समाप्त करने / सीमित करने की कोशिश कर रहा था / लगा रहा था, जो बहुत सारे सीपीयू का उपयोग करती प्रतीत होती हैं, लेकिन मैंने पहले से ही बैश स्क्रिप्ट लिखकर ऐसा किया है। यह भी एक वर्चुअल मशीन है अगर इससे मदद मिलती है
Giovanni Mounir

2
उन प्रक्रियाओं को मारने से सावधान रहें जो बहुत कम समय के लिए हो सकती हैं, सिस्टम प्रक्रियाएं भी। cpulimitअपनी खोज स्क्रिप्ट के साथ संयोजन के रूप में विचार करें । एक नीति रखें और इसके उपयोग की अनुशंसा करें cpulimit, फिर 10% से अधिक की खोज करें और फिर 5% तक सीमित करें (ताकि उपयोगकर्ताओं को उपयोग करने के लिए प्रोत्साहित किया जाए cpulimit)। यह भी सुनिश्चित करें कि आप एक उपयोगकर्ता के लिए 10% से अधिक जोड़ने वाली कई प्रक्रियाओं का पता लगा सकते हैं।
ctrl-alt-delor

इन सभी उपयोगी टिप्पणियों के लिए @richard धन्यवाद रिचर्ड! उन्होंने मेरी बहुत मदद की है! आपका उपयोग करने का सुझाव cpulimitकेवल प्रक्रिया को मारने से बेहतर है क्योंकि इसे उपयोगकर्ता द्वारा बाद में फिर से शुरू किया जा सकता है (जैसा कि आपकी टिप्पणियों में से एक में बताया गया है)। धन्यवाद!
जियोवन्नी मौनिर

जवाबों:


20

हालांकि यह मेमोरी के लिए एक दुरुपयोग हो सकता है, यह सीपीयू के लिए नहीं है: जब एक सीपीयू निष्क्रिय होता है, तो एक रनिंग प्रक्रिया ("रनिंग" से मेरा मतलब है कि प्रक्रिया आई / ओ या कुछ और के लिए इंतजार नहीं कर रही है) डिफ़ॉल्ट रूप से 100% CPU समय। और कोई सीमा लागू करने का कोई कारण नहीं है।

अब, आप प्राथमिकताओं को धन्यवाद के लिए सेट कर सकते हैं nice। यदि आप उन्हें किसी दिए गए उपयोगकर्ता के लिए सभी प्रक्रियाओं पर लागू करना चाहते हैं, तो आपको केवल यह सुनिश्चित करने की आवश्यकता है कि उसका लॉगिन शेल इसके साथ चलाया जाता है nice: बच्चे की प्रक्रिया niceमूल्य का वारिस करेगी । यह इस बात पर निर्भर करता है कि उपयोगकर्ता किस प्रकार लॉग इन करते हैं। उदाहरण के लिए प्राथमिकता ssh logins (अच्छा) देखें ।

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

एक और समाधान /etc/security/limits.confसीमा निर्धारित करना है; सीमाओं को देखें ।conf (5) मैन पेज। उदाहरण के लिए, आप प्रति लॉगिन अधिकतम सीपीयू समय और / या लॉगिन प्रति प्रक्रियाओं की अधिकतम संख्या निर्धारित कर सकते हैं। आप maxloginsप्रत्येक उपयोगकर्ता के लिए 1 पर भी सेट कर सकते हैं ।


1
@GOVanniMounir मेरा मतलब था: प्रति उपयोगकर्ता एक वर्चुअल मशीन।
vinc17

1
मैं देखता हूं, लेकिन दुर्भाग्य से यह संसाधन-खपत होगा और वास्तव में मेरे उद्देश्य के लिए उपयोगी नहीं होगा, क्योंकि उपयोगकर्ताओं को कुछ सामान्य विकास पैकेजों के उपयोग की आवश्यकता हो सकती है, और मैं इसे हर एक नई मशीन पर स्थापित नहीं करूंगा; मुझे लगता है कि इसे इस तरह से छोड़ना और बैश स्क्रिप्ट द्वारा मॉनिटरिंग अपने आप करना बेहतर है।
गियोवन्नी मौनिर

1
@GOVanniMounir आप कई वर्चुअल मशीनों के बीच एक विभाजन साझा कर सकते हैं।
vinc17

@GOVanniMounir वर्चुअलाइजेशन ओवरहेड को लगभग शून्य करने के लिए आप LXC या Docker का उपयोग कर सकते हैं । इसके अलावा "पसंद" एक मजबूत कारण नहीं है। उदाहरण के लिए, यदि आप एक साझा PHP होस्ट का प्रबंधन कर रहे हैं, तो मैं आपके समाधान के साथ जाऊंगा क्योंकि LXCs या वर्चुअल मशीन को करने के लिए $ 15 / $ 5 लाइसेंस प्राप्त सॉफ़्टवेयर को फिर से लिखना होगा, जो ओवरकिल है।
पोयनन खोसरावी २५'१४

मेरी समझ यह है कि अच्छा केवल अन्य प्रक्रियाओं की तुलना में सापेक्ष सीपीयू सेट करता है। यदि कोई अन्य प्रक्रिया CPU का उपयोग नहीं कर रही है, तो आपकी प्रक्रिया 100% CPU का उपयोग करेगी, 10% की सीमा नहीं।
जॉनी क्यों

25

अच्छा / त्याग

nice एक प्रणाली के लिए 'एक बंद' tweaks के लिए एक महान उपकरण है।

 nice COMMAND

cpulimit

cpulimit यदि आपको CPU गहन कार्य चलाने की आवश्यकता है और किसी सिस्टम की जवाबदेही के लिए सीपीयू समय मुक्त होना आवश्यक है।

cpulimit -l 50 COMMAND

cgroups

cgroups केवल एक के बजाय प्रक्रियाओं के एक सेट पर सीमाएं लागू करें

cgcreate -g cpu:/cpulimited
cgset -r cpu.shares=512 cpulimited
cgexec -g cpu:cpulimited COMMAND_1
cgexec -g cpu:cpulimited COMMAND_2
cgexec -g cpu:cpulimited COMMAND_3

साधन

http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups


5
सीपीयू के उपयोग पर एक कठोर सीमा निर्धारित करने की चाह रखने वालों के लिए, जब कोई अन्य प्रक्रिया नहीं चल रही है, तो cpu.cfs_quota_usपैरामीटर देखें ( मैनुअल देखें )
डिएगो

cgroups को systemd निर्देशों के लिए धन्यवाद का उपयोग करना आसान है ... उस उद्देश्य के लिए या तो सिस्टम या उपयोगकर्ता के लिए एक इकाई बनाएं सबसे अच्छा विकल्प है
Yves Martin

एक पूर्व की प्रक्रिया के लिए पूर्व:sudo cgclassify -g cpu:cpulimited 2315444
कुंभ राशि का पॉवर

1
मेरी समझ यह है कि अच्छा केवल अन्य प्रक्रियाओं की तुलना में सापेक्ष सीपीयू सेट करता है। यदि कोई अन्य प्रक्रिया CPU का उपयोग नहीं कर रही है, तो आपकी प्रक्रिया 100% CPU का उपयोग करेगी, 10% की सीमा नहीं।
जॉनी क्यों

10

क्या आपने cgroups को देखा? उनके बारे में आर्क विकी पर कुछ जानकारी है। इसके बारे में अनुभाग पढ़ें cpu.shares, ऐसा लगता है कि यह वही कर रहा है जिसकी आपको आवश्यकता है, और वे उपयोगकर्ता-स्तर पर काम कर सकते हैं, इसलिए आप एक बार में सभी उपयोगकर्ता प्रक्रियाओं को सीमित कर सकते हैं।


हालांकि, सीजीग्रुप्स जाने का रास्ता है। मैं (कई) साझा किए गए कंप्यूटर सर्वर भी चलाता हूं और हम अधिकतम लॉगिन कोर का उपयोग करने के लिए cgroups का उपयोग कर सकते हैं जो एक संपूर्ण लॉगिन सत्र उपयोग कर सकता है। इस तरह, यदि व्यक्ति नई प्रक्रियाएं शुरू करता है, तो प्रत्येक को एक छोटा सा टुकड़ा मिलता है। स्मृति उपयोग के लिए भी। आपके पास उपयोगकर्ता स्वचालित रूप से pam_cgroups और cgrulesengd सेवा के साथ cgroup में डाल सकते हैं। आप प्रत्येक उपयोगकर्ता को अपने स्वयं के cgroup में डालने के लिए cgconfig फ़ाइल में 'टेम्पलेट' का उपयोग कर सकते हैं। cgrulesengd आपकी स्क्रिप्ट की तरह कार्य करता है, हत्या की प्रक्रियाओं को छोड़कर, यह सुनिश्चित करता है कि प्रत्येक प्रक्रिया सही cgroup में है।
jsbillings

यहां तक ​​कि अगर आप संसाधन उपयोग को सीमित करने के लिए cgroups का उपयोग नहीं करते हैं, तो आप इसका उपयोग यह मूल्यांकन करने के लिए कर सकते हैं कि कोई व्यक्ति प्रत्येक संसाधन के लिए 'स्टेट' फ़ाइल को देखकर कितना संसाधन का उपयोग कर रहा है, फिर अपनी 5 मिनट की स्क्रिप्ट के लिए उस जानकारी का उपयोग करें।
jsbillings

3

स्मृति के लिए, आप जो देख रहे हैं वह है ulimit -v। ध्यान दें कि ulimitबाल प्रक्रियाओं को विरासत में मिला है, इसलिए यदि आप इसे लॉगिन के समय उपयोगकर्ता के लॉगिन शेल पर लागू करते हैं, तो यह सभी प्रक्रियाओं पर लागू होता है।

यदि आपके उपयोगकर्ता सभी bashलॉगिन शेल के रूप में उपयोग करते हैं , तो निम्नलिखित पंक्ति को /etc/profileसभी उपयोगकर्ता प्रक्रियाओं को 1 गीगाबाइट की कठिन सीमा (अधिक सटीक रूप से, एक मिलियन किलोबाइट) के कारण होना चाहिए:

ulimit -vH 1000000

विकल्प Hयह सुनिश्चित करता है कि यह एक कठिन सीमा है, अर्थात्, उपयोगकर्ता इसे बाद में वापस सेट नहीं कर सकता है। बेशक उपयोगकर्ता अभी भी एक ही बार में कई प्रक्रियाओं को शुरू करके मेमोरी को भर सकता है।

अन्य गोले के लिए, आपको यह पता लगाना होगा कि वे किन आरंभिक फ़ाइलों को पढ़ते हैं (और वे किसके बजाय अन्य कमांड का ulimitउपयोग करते हैं)।

सीपीयू के लिए, आप जो चाहते हैं वह मेरे लिए समझ में नहीं आता है। जब केवल एक प्रक्रिया चल रही हो तो 90% CPU का उपयोग न होने देने से क्या होगा? मुझे लगता है कि आप वास्तव में क्या चाहते हैं nice(और संभवतः ionice)। ध्यान दें, जैसे ulimit, niceमान बाल प्रक्रियाओं द्वारा विरासत में मिले हैं, इसलिए इसे लॉगिन शेल में लॉगिन समय पर लागू किया जाता है। मुझे लगता है कि यह भी लागू होता है, ioniceलेकिन मुझे यकीन नहीं है।


स्मृति सुझाव के लिए धन्यवाद! क्या कोई मौका है जो आप मुझे लॉगिन के समय उपयोगकर्ता के लॉगिन शेल पर इसे लागू करने के लिए एक उदाहरण दिखा सकते हैं? मुझे यकीन नहीं है कि यह कैसे करना है। मुझे भी स्पष्ट नहीं होने के लिए खेद है; मैं जो करने की कोशिश कर रहा हूं वह किसी भी प्रक्रिया को 10% से अधिक सीपीयू का उपयोग करने की अनुमति नहीं देता है। तो क्या आपको लगता है कि niceऐसा करना काफी अच्छा होगा? यदि हां, तो क्या आपको लगता है कि आप इसे प्राप्त करने के लिए मुझे एक उदाहरण दिखा सकते हैं?
गियोवन्नी मौनिर

जब अभी केवल एक प्रक्रिया चल रही है तो मुझे CPU 90% निष्क्रिय रखने की बात नहीं आती।
celtschk

1
यदि वर्तमान में समवर्ती रूप से चलने वाली 10 से कम प्रक्रियाएँ हैं (और रनिंग से मेरा मतलब वास्तव में चल रहा है, न कि केवल उपयोगकर्ता इनपुट या डिस्क I / O के लिए प्रतीक्षा कर रहा है), तो यह वस्तुतः गारंटी है कि उनमें से एक में 10% से अधिक सीपीयू होगा। अन्यथा सीपीयू लगभग निष्क्रिय हो जाएगा। और अगर आप सिर्फ 10% से ऊपर जाने वाली किसी भी प्रक्रिया को मारते हैं, तो मुझे यकीन है कि आपके पास कई उपयोगकर्ता होंगे जो आपको मारना चाहते हैं। या कम से कम, आपको किसी ऐसे व्यक्ति द्वारा प्रतिस्थापित करने का प्रयास करेंगे जिनके पास उन संख्याओं का कोई मतलब है, क्योंकि आप ऐसा नहीं करते हैं।
celtschk

@Celtschk की टिप्पणी के विपरीत, यदि 11 या अधिक प्रक्रियाएं चल रही हैं (सीपीयू बाध्य है), तो वे 9.09% से कम होंगे। इसलिए यदि मैं एक ऐसी प्रणाली का उपयोगकर्ता हूं जो 10% सीपीयू के उपयोग पर प्रतिबंध लगाता है तो मैं 11 या अधिक प्रक्रियाएं चला सकता हूं, और रडार के नीचे छिपा सकता हूं।
ctrl-alt-delor

@richard आप सही हैं, शायद यह बेहतर होगा यदि स्क्रिप्ट किसी उपयोगकर्ता द्वारा उपयोग की जाने वाली मेमोरी / CPU की कुल राशि का योग करेगी, और तब उपयोगकर्ता की सभी प्रक्रियाओं को समाप्त कर देगा जब प्रतिशत एक विशिष्ट राशि तक पहुंच जाएगा (इसलिए उसे लॉग भी करेगा। बाहर)
गियोवन्नी मौनीर

3

चूंकि आप बता रहे हैं कि आपके मामले में cpulimit व्यावहारिक नहीं होगा, तो मेरा सुझाव है कि आप अच्छा , त्याग , और कार्यदिशा देखें , जो कि आप जो हासिल करना चाहते हैं, उसके करीब आ सकते हैं, हालांकि कार्यपत्रक प्रक्रियाओं के सीपीयू संबंध को स्थापित करने की अनुमति देता है, इसलिए यह आपके मामले में तुरंत मददगार नहीं हो सकता है।


1
niceऔर renice? यह अच्छा है! मैंने उनके मैनुअल पृष्ठों को देखा है, लेकिन मुझे अभी भी नहीं लगता कि वे इसके साथ मदद कर सकते हैं क्योंकि आपको अभी भी एक प्रक्रिया आईडी सेट करना है। यदि आप मुझे एक उदाहरण दे सकते हैं, जिसमें सभी चल रही प्रक्रियाओं / भविष्य की प्रक्रियाओं पर सीमा लागू करने के लिए ये पैकेज शामिल हैं जो भयानक होंगे!
गियोवन्नी मौनिर

1

चूंकि आपके टैग हैं centos, आप उपयोग कर सकते हैं systemd

उदाहरण के लिए यदि आप उपयोगकर्ता को ID 1234:

sudo systemctl edit --force user-1234.slice

फिर इसे टाइप करें और सेव करें:

[Slice] CPUQuota=10%

अगली बार जब उपयोगकर्ता लॉग इन करेगा, तो यह प्रभावित करेगा।

मैन पेज: systemctl, systemd.slice, systemd.resource-control...


0

यदि आप पहले से शुरू की गई प्रक्रियाओं को सीमित करना चाहते हैं, तो आपको इसे पीआईडी ​​द्वारा एक-एक करके करना होगा, लेकिन आपके पास ऐसा करने के लिए एक बैच स्क्रिप्ट हो सकती है:

#!/bin/bash
LIMIT_PIDS=$(pgrep tesseract)   # PIDs in queue replace tesseract with your name
echo $LIMIT_PIDS
for i in $LIMIT_PIDS
do
    cpulimit -p $i -l 10 -z &   # to 10 percent processes
done

मेरे मामले pypdfocrमें लालच शुरू करता है tesseract

इसके अलावा कुछ मामलों में आपका CPU बहुत अच्छा था आप बस reniceइस तरह का उपयोग कर सकते हैं :

watch -n5 'pidof tesseract | xargs -L1 sudo renice +19'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.