2009-09-09 26 views
11

मेरे पास एक साधारण बैश स्क्रिप्ट है जो एक प्रक्रिया के दूसरे भाग में पाइप आउटपुट करती है। अर्थात् :.एकाधिक कोर पर बैश के साथ पाइप प्रक्रियाओं को कैसे चलाया जाए?

dostuff | filterstuff 

ऐसा होता है कि मेरे Linux सिस्टम पर (openSUSE यह मायने रखता है, तो गिरी 2.6.27) इन दोनों एक सिंगल कोर पर चलने संसाधित करता है। हालांकि, अलग-अलग कोर पर प्रक्रिया प्रक्रियाएं एक डिफ़ॉल्ट नीति है जो इस मामले में ट्रिगर नहीं होती है।

उस के लिए सिस्टम का कौन सा घटक ज़िम्मेदार है और मल्टीकोर सुविधा का उपयोग करने के लिए मुझे क्या करना चाहिए?

नोट कि 2.6.30 कर्नेल पर ऐसी कोई समस्या नहीं है।

स्पष्टीकरण: Dennis Williamson की सलाह का पालन करने के बाद, मैं शीर्ष कार्यक्रम के साथ यकीन बनाया, पहुंचाया कि प्रक्रियाओं वास्तव में हमेशा एक ही प्रोसेसर पर रन कर रहे हैं। लिनक्स शेड्यूलर, जो आमतौर पर वास्तव में अच्छी नौकरी करता है, इस बार ऐसा नहीं करता है।

मुझे लगता है कि बैश में कुछ ओएस को ऐसा करने से रोकता है। बात यह है कि मुझे बहु-कोर और एकल-कोर मशीनों के लिए पोर्टेबल समाधान की आवश्यकता है। tasksetsolutionDennis Williamson द्वारा प्रस्तावित एकल-कोर मशीनों पर काम नहीं करेगा। वर्तमान में मैं उपयोग कर रहा हूँ :,

dostuff | taskset -c 0 filterstuff 

लेकिन यह एक गंदा हैक की तरह लगता है। क्या कोई बेहतर समाधान प्रदान कर सकता है?

+0

अपने परीक्षण को 'शीर्ष' के साथ कई बार ('टास्कसेट' के बिना) दोहराने का प्रयास करें। जब मैंने किया, कभी-कभी दो प्रक्रियाएं एक ही सीपीयू पर होती थीं, कभी-कभी अलग-अलग होती थीं। –

+0

वे हमेशा एक ही हैं और सिस्टम का केवल 50% उपयोग करते हैं :( –

+1

'(dostuff) | (filterstuff)' आज़माएं और देखें कि वे किस कोर पर दिखते हैं। एक अंतर (यदि यह मायने रखता है) यह है कि आप हैं एक मल्टीकोर सिस्टम पर और मैं एक बहु-प्रोसेसर (एकल कोर प्रत्येक) सिस्टम पर हूं। आप इन प्रक्रियाओं को वैसे भी अलग क्यों करना चाहते हैं? क्या वे प्रोग्राम हैं जिन्हें आपने लिखा था और क्या आप उन्हें बदल सकते हैं ताकि वे शेड्यूलर को स्वयं प्रभावित कर सकें? –

उत्तर

7

मान लीजिए dostuff एक सीपीयू पर चल रहा है। यह डेटा को एक पाइप में लिखता है, और वह डेटा उस सीपीयू पर कैश में होगा। चूंकि filterstuff उस पाइप से पढ़ रहा है, शेड्यूलर इसे उसी CPU पर चलाने का निर्णय लेता है, ताकि उसका इनपुट डेटा कैश में हो।

अपने कर्नेल CONFIG_SCHED_DEBUG=y के साथ बनाया गया है, तो

# echo NO_SYNC_WAKEUPS > /sys/kernel/debug/sched_features

heuristics के इस वर्ग अक्षम करना चाहिए। (अन्य शेड्यूलर ट्यूनेबल के लिए /usr/src/linux/kernel/sched_features.h और /proc/sys/kernel/sched_* देखें।)

हैं कि मदद करता है और समस्या अभी भी एक नया कर्नेल, और यह वास्तव में तेजी से एक सीपीयू से अलग CPUs पर चलाने के लिए किया है के साथ होता है, तो कृपया लिनक्स कर्नेल मेलिंग सूची के लिए समस्या की रिपोर्ट ताकि वे समायोजित कर सकते हैं उनके heuristics।

+0

NO_SYNC_WAKEUPS काम किया। हालांकि, कर्नेल 2.6.27 है, जबकि 2.6.30 सिस्टम पर समस्या उत्पन्न नहीं होती है। मैं इसे आगे की जांच करूंगा। –

+0

इसे 2.6.30 पर पुन: पेश नहीं किया जा सका। SYNC_WAKEUPS के साथ और बिना दोनों कोर के बीच प्रक्रियाएं उछालती हैं। –

+0

ठीक है, मैं tihnk, यह समस्या हल करता है। चूंकि मेरे उत्पाद में कई उपयोगकर्ता नहीं हैं, और उनके कर्नेल को ठीक से संकलित किया गया है, इसलिए मैं उन्हें आपके द्वारा प्रदान किए गए तरीके से ट्यून करने के लिए कह सकता हूं। धन्यवाद। –

7

इस एक सीपीयू (प्रोसेसर) आत्मीयता स्थापित करने के लिए आजमाएँ:

taskset -c 0 dostuff | taskset -c 1 filterstuff 

संपादित करें:

  • एक फ़ाइल बनाने के proctest कहा जाता है और chmod +x proctest:

    इस प्रयोग की कोशिश करो सामग्री के साथ:

    #!/bin/bash 
    while true 
    do 
        ps 
        sleep 2 
    done 
    
  • इस चल रहा शुरू:,

    ./proctest | grep bash 
    
  • एक और टर्मिनल में
  • शीर्ष शुरू - यकीन है कि यह% सीपीयू द्वारा छँटाई है
  • को कुछ सेकंड के लिए समझौता करते हैं, फिर
  • मुद्दा आदेश छोड़ने ps u
  • उच्चतम कई प्रक्रियाओं के पीआईडी ​​की सूची के साथ top -p शुरू करें, उनमें से 8 कहें, top से अधिक स्क्रीन पर छोड़े गए सूची से 01 के लिए च तो जे तो अंतरिक्ष

  • प्रेस -

    top -p 1234, 1255, 1211, 1212, 1270, 1275, 1261, 1250, 16521, 16522 
    
  • प्रोसेसर फ़ील्ड जोड़ें: -और grep जो ps द्वारा सूचीबद्ध किए गए सभी अल्पविराम के द्वारा अलग है, इसलिए की तरह (क्रम आवश्यक नहीं है)
  • पीआईडी ​​को तरह सेट - प्रेस Shift + एफ तो एक तो अंतरिक्ष
  • वैकल्पिक: प्रेस धागा दृश्य
  • वैकल्पिक चालू करने के लिए शिफ्ट + एच: प्रेस और टाइप .09 और दर्ज थोड़ी देर समय
  • अब सेट को देखने के लिए इस कदम प्रोसेस किए जाते प्रेस प्रोसेसर से प्रोसेसर तक, आपको proctest और grep बाउंस देखना चाहिए, कभी-कभी एक ही प्रोसेसर पर, कभी-कभी अलग-अलग
+0

कमाल! यह काम करता हैं। लेकिन, एचएम, मैं कोर को मैन्युअल असाइनिंग क्यों नहीं कर सकता? –

+2

अधिक जानकारी के लिए 'man sched_setscheduler' और 'man cpuset' देखें। लिनक्स शेड्यूलिंग का अच्छा काम करता है। प्रोसेसर (पी) फ़ील्ड जोड़ने के लिए 'शीर्ष' चलाने का प्रयास करें और fj दबाएं और आप देखेंगे कि अलग-अलग CPUs पर विभिन्न प्रक्रियाएं चल रही हैं। –

+0

शीर्ष पर प्रति सीपीयू अलग से सीपीयू लोड को देखने के लिए आप 'शीर्ष' में '1' (एक) भी दबा सकते हैं। –

1

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

यदि आपके पास दो कार्य हैं जो सीपीयू पर चलाने के लिए वास्तव में तैयार हैं, तो मैं उन्हें अलग-अलग कोर (कुछ बिंदु पर) पर निर्धारित करने की अपेक्षा करता हूं।

मेरा अनुमान है, क्या होता है कि पाइप बफर पूर्ण होने तक डोस्टफ चलता है, जिस बिंदु पर यह और नहीं चला सकता है, इसलिए "फ़िल्टरस्टफ" प्रक्रिया चलती है, लेकिन यह इतनी कम समय के लिए चलती है कि डोस्टफ जब तक फ़िल्टरस्टफ ने पूरे पाइप बफर को फ़िल्टर करना समाप्त नहीं किया है, तब तक पुन: निर्धारित नहीं किया जाता है, जिस बिंदु पर डोस्टफ फिर से निर्धारित हो जाता है।

+0

आपका अनुमान गलत है। प्रक्रियाएं इस तरह चलती हैं: 'डोस्टफ' कोर के CPU समय का 60% लेता है, और 'फ़िल्टरस्टफ' शेष 40% लेता है। और उन्हें कई मिनटों के साथ अलग-अलग कोरों के लिए पुन: निर्धारित नहीं किया जाता है। –

+0

तब पर्याप्त मेला, बस एक विचार। – MarkR