2012-12-17 44 views
7

जीएनयू के लिए दस्तावेज़ से बनाना: http://www.gnu.org/software/make/manual/make.html#Parallelएक मल्टीकोर लिनक्स मशीन पर जीएनयू मेक - मैक्स-लोड का उपयोग कैसे करें?

जब प्रणाली भारी लोड किया जाता है, तो आप जब यह हल्के से भरी हुई है की तुलना में कम नौकरियों को चलाने के लिए शायद चाहते हैं। लोड औसत के आधार पर आप '-l' विकल्प का उपयोग पर एक बार चलाने के लिए नौकरियों की संख्या को सीमित करने के लिए कह सकते हैं। '-l' या '--max-load' विकल्प के बाद फ़्लोटिंग-पॉइंट नंबर होता है। उदाहरण के लिए,

-l 2.5 

लोड औसत औसत 2.5 से ऊपर होने पर एक से अधिक नौकरी शुरू करने नहीं देगा। किसी भी संख्या के साथ '-l' विकल्प लोड सीमा को हटा देता है, अगर कोई पिछले '-l' विकल्प के साथ था।

अधिक सटीक, जब कोई नौकरी शुरू करने के लिए जाता है, और इसमें पहले से ही कम से कम एक नौकरी चल रहा है, तो यह वर्तमान लोड औसत की जांच करता है; यदि यह '-l' के साथ दी गई सीमा से कम नहीं है, तब तक लोड करें जब तक लोड औसत उस सीमा से नीचे न हो, या जब तक अन्य सभी नौकरियां समाप्त न हों।

लिनक्स आदमी पृष्ठ से सक्रिय रहने की अवधि के लिए: http://www.unix.com/man-page/Linux/1/uptime/

सिस्टम लोड औसत प्रक्रियाओं है कि या तो एक runnable या uninterruptable राज्य में हैं की औसत संख्या है। एक चलने योग्य स्थिति में एक प्रक्रिया या तो सीपीयू का उपयोग कर रही है या CPU का उपयोग करने का इंतजार कर रही है। एक प्रक्रिया निर्बाध स्थिति में कुछ I/O पहुंच की प्रतीक्षा कर रही है, उदाहरण के लिए डिस्क के लिए प्रतीक्षा करें। औसत तीन बार अंतराल पर लिया जाता है। लोड औसत औसत सिस्टम में CPUs की संख्या के लिए सामान्य नहीं हैं, इसलिए 1 का लोड औसत का मतलब है कि एक सीपीयू सिस्टम को सभी समय 4 सीपीयू सिस्टम पर लोड किया जाता है, इसका मतलब है कि यह समय का 75% निष्क्रिय था।

मेरे पास समानांतर मेकफ़ाइल है और मैं स्पष्ट चीज़ करना चाहता हूं: जब तक मुझे पूर्ण CPU उपयोग नहीं मिल रहा है तब तक प्रक्रियाओं को जोड़ना जारी रखें, लेकिन मैं थ्रैशिंग को प्रेरित नहीं कर रहा हूं।

कई (सभी?) मशीनें आज मल्टीकोर हैं, इसलिए इसका मतलब है कि लोड औसत संख्या की जांच नहीं की जानी चाहिए, क्योंकि उस संख्या को कोर की संख्या के लिए समायोजित करने की आवश्यकता है।

क्या इसका मतलब यह है कि - एमएक्सयू के लिए - मैक्स-लोड (उर्फ-एल) ध्वज अब बेकार है? लोग क्या कर रहे हैं जो मल्टीकोर मशीनों पर समांतर मेकफ़ाइल चला रहे हैं?

उत्तर

0

कई (सभी?) मशीनों आज मल्टीकोर हैं तो इसका मतलब है कि लोड औसत संख्या मेकअप, जाँच की जानी चाहिए नहीं के रूप में है कि संख्या की जरूरत कोर की संख्या के लिए समायोजित किया जा सकता है।

क्या इसका मतलब यह है कि - एमएक्सयू बनाने के लिए - मैक्स-लोड (उर्फ-एल) ध्वज अब बेकार है?

नहीं डिस्क की मांग के साथ नौकरियों की कल्पना करें I/o। यदि आपने सीपीयू के रूप में कई नौकरियां शुरू की हैं, तो भी आप सीपीयू का बहुत अच्छा उपयोग नहीं करेंगे।

व्यक्तिगत रूप से, मैं बस -j का उपयोग करता हूं क्योंकि अब तक यह मेरे लिए काफी अच्छा काम करता है।

0

यहां तक ​​कि एक निर्माण के लिए जहां सीपीयू बाधा है, -l आदर्श नहीं है। मैं -jN का उपयोग करता हूं, जहां एन मौजूद कोरों की संख्या है या मैं निर्माण पर खर्च करना चाहता हूं। एक बड़ी संख्या का चयन करना मेरी स्थिति में निर्माण को तेज नहीं करता है। जब तक आप ओवरबोर्ड नहीं जाते हैं (जैसे कि -j के माध्यम से अनंत निर्दिष्ट करके) इसे धीमा नहीं करता है।

का उपयोग -lN है मोटे तौर पर -jN के बराबर है, और अगर मशीन करने के लिए अन्य स्वतंत्र काम है बेहतर काम कर सकते हैं, लेकिन वहाँ दो quirks (अलग से एक आप उल्लेख किया है, के लिए जिम्मेदार नहीं कोर की संख्या से) कर रहे हैं:

  • प्रारंभिक स्पाइक: जब निर्माण शुरू होता है, ने बहुत सी नौकरियां लॉन्च की हैं, एन से अधिक कई। सिस्टम लोड नंबर तुरंत प्रक्रिया में नहीं बढ़ता है जब प्रक्रिया को फोर्क किया जाता है। यह मेरी स्थिति में कोई समस्या नहीं है।
  • भुखमरी: जब कुछ बिल्डिंग नौकरियों को दूसरों की तुलना में काफी समय लगता है, इस समय पहली एम त्वरित नौकरियां समाप्त हो गई हैं, सिस्टम लोड अभी भी> एन है। जल्द ही सिस्टम लोड एन-एम पर गिर जाता है, लेकिन जब तक कि कुछ धीमी नौकरियां खींच रही हैं, तब तक कोई नई नौकरियां लॉन्च नहीं की जाती हैं, और कोर भूखे रह जाते हैं। केवल पुरानी नौकरी शुरू होने पर, और शुरुआत में नई नौकरियां लॉन्च करने के बारे में सोचता है। यह सिस्टम लोड लोड के बीच में नोटिस नहीं करता है।
5

मेरा संक्षिप्त उत्तर: --max-load उपयोगी है यदि आप इसका अच्छा उपयोग करने के लिए समय लेना चाहते हैं। अपने वर्तमान कार्यान्वयन के साथ अच्छे मूल्यों को चुनने के लिए कोई सरल सूत्र नहीं है, या उन्हें खोजने के लिए प्री-फैब टूल नहीं है।


जो बिल्ड मैं बनाए रखता हूं वह काफी बड़ा है। इससे पहले कि मैंने इसे बनाए रखना शुरू किया, बिल्ड 6 घंटे था। रैमडिस्क पर -j64 के साथ, अब यह 5 मिनट में समाप्त होता है (के साथ एनएफएस माउंट पर 30)। मेरा लक्ष्य यहां -j और -l के लिए उचित कैप्स ढूंढना था जो हमारे डेवलपर्स को जल्दी से निर्माण करने की अनुमति देता है लेकिन सर्वर (बिल्ड सर्वर या एनएफएस सर्वर) को हर किसी के लिए उपयोग करने योग्य नहीं बनाता है।

  • आप (आपकी मशीन पर) एक उचित-jN मूल्य चुनें और लोड औसत के लिए एक उचित ऊपरी सीमा (आपकी मशीन पर) मिल जाए, वे अच्छी तरह से एक साथ काम बातें रखने के लिए:

    साथ शुरू करने के लिए संतुलित।

  • आप एक बहुत बड़े -jN मूल्य (या अनिर्दिष्ट; जैसे, -j एक नंबर के बिना) का उपयोग करते हैं और लोड औसत की सीमा है, gmake देगा:
    • स्पॉन प्रक्रियाओं (gmake 3 जारी है।81 एक थ्रॉटलिंग तंत्र जोड़ा है, लेकिन है कि समस्या सिर्फ एक छोटे से) को कम करने में मदद करता है जब तक नौकरियों की अधिकतम संख्या आ जाए या लोड औसत अपनी सीमा
    • ऊपर चला जाता है, जबकि लोड औसत आपकी सीमा से अधिक है:
      • जब तक सभी उप प्रक्रियाओं एक समय
    • पर
    • अंडे एक ही काम पूरा कर लें कुछ भी नहीं यह सब फिर से
से अधिक करना 0

लिनक्स पर कम से कम (और शायद अन्य * निक्स वेरिएंट), load average is एक exponential moving average (यूनिक्स लोड औसत रिवाइघेड, नील जे गन्थर) जो CPU समय के लिए प्रतीक्षा की जाने वाली प्रक्रियाओं की औसत संख्या का प्रतिनिधित्व करता है (बहुत सी प्रक्रियाओं के कारण हो सकता है, आईओ, पृष्ठ दोष, आदि के लिए इंतजार कर रहा है)। चूंकि यह एक घातीय चलने वाला औसत है, इसलिए यह भारित किया गया है कि नए नमूने पुराने नमूने की तुलना में वर्तमान मूल्य पर एक मजबूत प्रभाव डालते हैं।

यदि आप सही अधिकतम भार और समानांतर नौकरियों (शिक्षित अनुमानों और अनुभवजन्य परीक्षण के संयोजन के माध्यम से) के लिए एक अच्छी "मीठी जगह" की पहचान कर सकते हैं, तो मान लें कि आपके पास लंबे समय तक चलने वाला निर्माण है: आपका 1 मिनट औसत हिट होगा एक संतुलन बिंदु (ज्यादा उतार-चढ़ाव नहीं करेगा)। हालांकि, यदि आपके -jN संख्या किसी दिए गए अधिकतम लोड औसत के लिए बहुत अधिक है, तो यह काफी हद तक उतार-चढ़ाव कर देगा।

यह पता लगाने कि मीठा स्थान अनिवार्य रूप से एक अंतर समीकरण के लिए इष्टतम मानकों को खोजने के बराबर है। चूंकि यह प्रारंभिक स्थितियों के अधीन होगा, इसलिए फोकस उन पैरामीटर को ढूंढने पर है जो सिस्टम को "लक्ष्य" लोड औसत के साथ आने के विपरीत संतुलन में रहने के लिए मिलता है। "संतुलन पर" मेरा मतलब है: 1 मीटर भार औसत अधिक उतार-चढ़ाव नहीं करता है।

मान लीजिए कि आप gmake में सीमाओं से बाधित नहीं हैं: जब आपको -jN-lM संयोजन मिलता है जो न्यूनतम निर्माण समय देता है: वह संयोजन आपकी मशीन को इसकी सीमा तक दबाएगा। मशीन अन्य प्रयोजनों के लिए प्रयोग की जाने वाली ...

compiling

की जरूरत है ... आप इसे वापस एक सा काम पूरा होने पर अनुकूलित कर रहे पैमाने पर करने के लिए कर सकते हैं।

लोड औसत के संबंध में, -jN बढ़ने के साथ निर्माण समय में किए गए सुधार [लगभग] लॉगरिदमिक दिखाई दिए। ऐसा कहने के लिए, मैंने और -j12 के बीच -j12 और -j16 के बीच एक बड़ा अंतर देखा है।

चीजें मेरे लिए क्योंकि प्रारंभिक gmake प्रक्रिया एकल पिरोया है (Solaris मशीन यह -j56 के बारे में था पर) -j48 और -j64 के बीच कहीं न कहीं अपने चरम पर थी; कुछ बिंदु पर धागा खत्म होने से तेज़ी से नई नौकरियां शुरू नहीं कर सकता है।

मेरे परीक्षणों पर प्रदर्शन किया गया:

  • एक गैर पुनरावर्ती निर्माण
    • पुनरावर्ती बनाता है अलग परिणाम देख सकते हैं; वे -j64
    • पर किए गए बाधा में भाग नहीं पाएंगे, मैंने व्यंजनों में मेक-इस्म्स (परिवर्तनीय विस्तार, मैक्रोज़ इत्यादि) की मात्रा को कम करने के लिए अपना सर्वश्रेष्ठ प्रयास किया है क्योंकि रेसिपी पार्सिंग समान थ्रेड में होती है जो समानांतर होती है नौकरियों। अधिक जटिल व्यंजन हैं, जितना अधिक समय यह पर्सिंग में खर्च करता है, नौकरियों को बढ़ाने/पकाने की बजाए। उदाहरण के लिए:
      • नहीं $(shell ...) मैक्रोज़ व्यंजनों में उपयोग किया जाता है; उन 1 पार्स करने पास दौरान भाग गया और कैश की गई
      • अधिकांश चर := साथ आवंटित कर रहे हैं कर रहे हैं पुनरावर्ती विस्तार
  • Solaris 10/SPARC
    • 256 कोर
    • कोई वर्चुअलाइजेशन से बचने के लिए/तार्किक डोमेन
    • निर्माण एक रैमडिस्क
    पर चला गया
  • x86_64 linux
    • 32-कोर (4x अति पिरोया)
    • कोई वर्चुअलाइजेशन
    • निर्माण एक तेजी से स्थानीय ड्राइव
पर भाग गया
संबंधित मुद्दे