एक निश्चित प्रक्रिया के लिए CPU + RAM को बचाने के लिए संसाधन उपयोग को कैसे सीमित करें?


25

मेरे पास एक देव सर्वर है जिस पर sshdकभी-कभी काम करना बंद हो जाता है क्योंकि मशीन रैम से बाहर निकलती है। हां, हम मेमोरी पर कम चल रहे हैं और अभी अपग्रेड करना संभव नहीं है। मैं जो करना चाहता हूं वह मशीन को बताना है: "जो आप चाहते हैं, वह करें, लेकिन 20 एमबी और कुछ सीपीयू को छोड़ दें sshd!"।

वह कैसे किया जा सकता है?


Sshd को इस तरह नहीं उड़ाया जाना चाहिए, यह सामान्य रूप से एक बहुत अच्छा व्यवहार है। सुनिश्चित करें कि यह नवीनतम / सबसे बड़ी के लिए अद्यतन किया गया है। आप इसके साथ क्या कर रहे हैं? क्या आप इसके माध्यम से बड़े पैमाने पर डेटा पाइप कर रहे हैं?
मार्सिन

2
@ कर्क मुझे नहीं लगता कि मैं कुछ भी बड़ा कर रहा हूं, पाठ संपादन। यहां तक ​​कि अगर sshdअच्छी तरह से व्यवहार किया जाता है, तो मुझे लगता है कि अगर यह पर्याप्त सीपीयू / रैम का उपयोग करने के लिए नहीं है, तो यह अटक जाएगा?
फुनेहे

जब लिनक्स स्मृति से बाहर निकलता है, तो यह मेमोरी को पुनः प्राप्त करने के लिए प्रक्रियाओं को मारना शुरू कर देता है। आप OOM इन एक्शन (मेमोरी किलर से बाहर) देख रहे होंगे। मुझे नहीं पता कि यह आपके sshd को लगातार मारने का फैसला क्यों करेगा। क्या आपने कभी sshd को वास्तव में लीक (आकार में बड़ा) देखा है, इससे पहले कि वह उड़ जाए, या यह एक पल ठीक काम करता है और अगले दिन मर जाता है?
मार्सिन

@Marcin संभावनाएं हैं कि अगर वह OOM है तो सिस्टम इतना फंस गया है कि वह sshd को सिर्फ जवाब नहीं दे सकता, यह एक sshd समस्या नहीं है बल्कि उसके लोड के साथ एक समस्या है। दुर्भाग्य से मुझे इसका उत्तर नहीं पता है।
xenoterracide

@phunehehe क्या आप सुनिश्चित हैं कि समस्या ssh के लिए कोई मेमोरी नहीं है और आपका लोड छत के माध्यम से नहीं है? sshd कोई त्रुटि देता है? बॉक्स पर लोड क्या है? और क्या कारण है कि सिस्टम मेमोरी से बाहर चला जाता है।
13

जवाबों:


9

मेमोरी संसाधन नियंत्रक के साथ cgroups का उपयोग करके आप संभवतः ऐसा कुछ प्राप्त कर सकते हैं ।

मुझे लगता है कि आप अपने सभी संसाधन-खपत कार्यों को एक सीमित (सीपीयू और रैम) में डाल cgroupदेंगे, और sshd"बाहर" छोड़ देंगे ताकि यह प्रतिबंधित न हो।

(स्वैप फ़ाइल के रूप में भी अधिक स्वैप जोड़ना, हालांकि एक अच्छा विकल्प हो सकता है।)


मैं अभी भी संकोच कर रहा हूं, यह आसान नहीं दिखता (उबंटू द्वारा खराब)।
फुनेहे

ओह, यह निश्चित रूप से आसान नहीं है :-) स्वैप जोड़ना बहुत आसान है।
Mat

@ Sphune में Sys एडमिन होने का स्वागत है, यह आसान नहीं है। लेकिन अब आपको सीखना होगा कि आसान चीजें कैसे नहीं करें।
xenoterracide

6

ओह, लेकिन cgroups आसान हैं :) libcgroup पैकेज स्थापित करें। एक /etc/cgconfig.conf बनाएं:

mount {
    cpu     = /cgroup/cpu_and_mem;
    cpuacct = /cgroup/cpu_and_mem;
    memory  = /cgroup/cpu_and_mem;
}

group sshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

group nosshd {
        cpu {
                cpu.shares="500";
        }
        cpuacct {
                cpuacct.usage="0";
        }
        memory {
                memory.limit_in_bytes="1G";
        }
}

cgconfigप्रक्रिया शुरू करें जो पदानुक्रम, cgroups बनाएगी, और सीमाएं निर्धारित करेगी। यदि यह सफल होता है, तो आपके पास दो cgroups हैं, जिनमें से दोनों में 50% CPU असाइन किया गया है और 1G मेमोरी उपलब्ध है (यह नहीं जानते कि आपकी उपलब्ध मेमोरी की वास्तविक मात्रा क्या है, इस उदाहरण में यह 2G है)। अब आपको बस सभी कार्यों (यानी सिस्टम पर चल रही सभी प्रक्रियाओं) को रूट ग्रुप से nosshd cgroup में ले जाना होगा:

cgroup]# cat tasks >> nosshd/tasks
cgroup]# echo > tasks

फिर आपको बस sshdप्रक्रिया की PID प्राप्त करने और इसे sshd कार्य फ़ाइल की जानकारी देने की आवश्यकता है:

cgroup]# echo $PID >> sshd/tasks

ता-दा, आपका काम हो गया। अब आप निश्चिंत हो सकते हैं कि sshd में हमेशा 50% CPU और 1G मेमोरी होगी।


1

reniceके लिए एक उच्च प्राथमिकता प्राप्त करने के लिए उपयोग करें sshd, या लेखांकन की जाँच करें। (acct) -> इसके साथ आप उपयोगकर्ताओं के लिए संसाधन सेट कर सकते हैं, इसलिए sshd को s के साथ चलाएं


मैं इसे भी जोड़ना चाहूंगा ionice, और संभवत: बाद में इसे फिर से शुरू न करके अच्छे के साथ sshd करना शुरू कर दूंगा।
13

1

अनुप्रयोग संसाधन उपयोग की समस्या का एक अधिक सामान्य समाधान आपके एप्लिकेशन को डॉकटर का उपयोग करके कंटेनर में चलाना है । फिर आप cgroups के समान CPU और मेमोरी उपयोग सीमा के साथ कंटेनर चला सकते हैं ।

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