CPU प्रदर्शन को संतुलित करने के लिए लिनक्स cgroups का उपयोग करना


13

मेरे पास दो दोहरे कोर लिनक्स सिस्टम हैं जो अपेक्षाकृत हाल की गुठली के साथ लिनक्स cgroups का उपयोग करके स्थापित हैं; एक डेबियन स्क्वीज़ चला रहा है, दूसरा उबंटू 11.04 नट्टी नरवाल। मैंने सीपीयू लोड को अपने पुराने कर्नेल के बावजूद डेबियन सिस्टम पर थोड़ा बेहतर काम करने वाले cgroups के साथ संतुलित किया है। लेकिन यह सब कुछ के लिए सही नहीं है, और मैं यहां जो विशिष्ट विषमता पूछ रहा हूं वह दोनों प्रणालियों पर होता है।

यदि आप नियंत्रण समूह के साथ लिनक्स में संसाधन प्रबंधन पढ़ते हैं, तो यह एक उदाहरण देता है जिसमें दिखाया गया है कि समस्या को कैसे पुन: उत्पन्न किया जाए। यहाँ Ubuntu संस्करण है (इसे रूट के रूप में चलाएँ):

cd /sys/fs/cgroup/cpu
    [On Debian Squeeze start at /mnt/cgroups/cpu instead]
mkdir low high
echo 512 > low/cpu.shares
echo 2048 > high/cpu.shares
yes low > /dev/null &
echo $! > low/tasks
yes high > /dev/null &
echo $! > high/tasks
ps -C yes -opid,%cpu,psr,args
    [repeat that a few times]
killall -9 yes

मैं उम्मीद कर रहा था कि "उच्च" प्रक्रिया को "कम" वाले से अधिक समय आवंटित किया जाएगा; वास्तव में इस परीक्षण मामले के साथ क्या होता है हमेशा इस तरह होता है:

root@black:/sys/fs/cgroup/cpu# ps -C yes -opid,%cpu,psr,args
  PID %CPU PSR COMMAND
 3105 88.3   1 yes low
 3106 94.5   0 yes high

जहां समय लगभग बराबर है। यहाँ मेरा सवाल है: ऐसा क्यों हो रहा है?

प्रस्तुति में, इस समस्या को प्रत्येक प्रक्रिया को उसी सीपीयू में पिन करके दूर जाते हुए दिखाया गया है; परीक्षण करने के लिए अतिरिक्त लाइनें:

taskset -c 1 yes high > /dev/null &
echo $! > high/tasks
taskset -c 1 yes low > /dev/null &
echo $! > low/tasks
ps -C yes -opid,%cpu,psr,args
[later, rinse, repeat]
killall -9 yes

परिणाम तब है जो मैं हर समय देखने की उम्मीद कर रहा था: "उच्च" प्रक्रिया सीपीयू का बहुत अधिक प्रतिशत प्राप्त कर रही है:

root@black:/sys/fs/cgroup/cpu# ps -C yes -opid,%cpu,psr,args
  PID %CPU PSR COMMAND
 3128 83.3   1 yes high
 3129 20.7   1 yes low

यह बताते हुए कि यह कार्य यह पता लगाने की दिशा में एक उपयोगी कदम होगा कि पहले वाला भी क्यों नहीं।


जवाबों:


10

मैंने स्टीफन सेफ्राइड से इस परीक्षण मामले के बारे में एक प्रारंभिक स्पष्टीकरण प्राप्त किया है, जिन्होंने इस उदाहरण से लिया गया पेपर लिखा था। यहाँ समस्या यह है कि cgroups के CPU अनुसूचक भाग हमेशा किसी भी उपलब्ध CPU को व्यस्त रखने का लक्ष्य रखते हैं; अगर सब कुछ एक ही बार में फिट हो जाएगा तो यह कभी भी एक कठिन सीमा लागू नहीं करता है।

इस मामले में जहां दो प्रक्रियाएं (उच्च और निम्न यहां)> = 2 कोर पर चल रही हैं, यह सिर्फ एक कोर पर उच्च रखने और दूसरे पर कम होने जा रही है। दोनों तब पूरे समय चलेंगे, 100% उपयोग के करीब, क्योंकि वे ऐसा उस स्थिति से टकराने के बिना कर सकते हैं जहाँ अनुसूचक उन्हें सीपीयू पर पर्याप्त समय नहीं देता। cpu.share शेड्यूलिंग तभी होती है जब कोई कमी होती है।

दूसरे मामले में, दोनों प्रक्रियाओं को एक ही सीपीयू में पिन किया जाता है। तब सीपीयू शेयरिंग लॉजिक के लिए उन्हें संतुलित करने के लिए रिश्तेदार सीपीयू.शेयर नंबरों के साथ कुछ उपयोगी करना पड़ता है, और यह आशा के अनुरूप होता है।

सीएफएस बैंडविड्थ नियंत्रण पैच हिट होने के बाद तक सीपीयू के उपयोग पर कठोर सीमाएं दिखाई देने की संभावना नहीं है । उस समय यह कुछ और प्राप्त करना संभव हो सकता है जैसे मैं क्या उम्मीद कर रहा था।


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