2012-07-24 25 views
9

क्या मेरी रैम का उपभोग करने के लिए make -j को मजबूर करने का कोई तरीका है? मैं एक देव टीम पर काम करता हूं, और हमारे पास अलग-अलग हार्डवेयर सेट हैं, इसलिए -j8 सभी के लिए इष्टतम नहीं हो सकता है। हालांकि, make -j मेरे लिए बहुत अधिक रैम का उपयोग करता है, और स्वैप में फैलता है, जो मेरी पूरी प्रणाली को नीचे ले जा सकता है। इससे कैसे बचा जा सकता है?मेक-जे रैम सीमा

आदर्श रूप से, मैं सिस्टम लोड को देखना और नए धागे को रोकने के लिए देखना चाहता हूं, कुछ पूरा करने के लिए प्रतीक्षा करें, और जारी रखें।

+0

gnu बनाते हैं? – Chimera

+0

'मेक -वर्जन' रिपोर्ट जीएनयू बनाएं 3.81 – Drise

उत्तर

4

प्रत्येक वर्कस्टेशन के लिए एक पर्यावरण परिवर्तनीय होने के लिए कुछ सरल समाधान होगा जो हार्डवेयर को संभाल सकता है। मेकफ़ाइल इस पर्यावरण चर को पढ़ें और इसे -जे विकल्प पर पास करें। How to get gnu make to read env variables.

इसके अलावा, यदि निर्माण प्रक्रिया में कई कदम हैं और लंबे समय तक make पर्यावरण चर को फिर से पढ़ते हैं ताकि निर्माण के दौरान आप संसाधन उपयोग को कम/बढ़ा सकते हैं।

इसके अलावा, हो सकता है एक सेवा/आवेदन वर्कस्टेशन कि संसाधन उपयोग की निगरानी करता है पर चल रहे हैं और make है की कोशिश कर के बजाय वातावरण चर को संशोधित यह कर ...

+1

हार्डवेयर क्या संभाल सकता है इस पर निर्भर करता है कि क्या संकलित किया जा रहा है और इसे make -j द्वारा बेहतर रूप से नियंत्रित नहीं किया जा सकता है क्योंकि -j विकल्प विभिन्न प्रकार के निर्माण के दौरान आवश्यक RAM उपयोग के बारे में कुछ नहीं जानता स्रोत। उदाहरण के लिए, -ओ0 बनाम-ओ 2 या सी बनाम सी ++ या जीसीसी बनाम इंटेल कंपाइलर्स। –

3

एक और तरीका यह करने के लिए नहीं है :

(http://www.gnu.org/software/make/manual/html_node/Parallel.html#Parallel से)

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

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

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

+0

इसके साथ एकमात्र समस्या यह है कि * हमारे पास अलग-अलग हार्डवेयर सेट * हैं। लेकिन यह काम कर सकता है। – Drise

+1

कोई फर्क नहीं पड़ता, उचित लोड सीमा को वही करना चाहिए जो आप चाहते हैं, ज्यादातर हार्डवेयर से स्वतंत्र। * मैं इटालिक्स में भी टाइप कर सकते हैं *। –

+0

@ keith.layne हां, अच्छा बिंदु। इस मामले में मान लेना राम उपयोग के साथ सहसंबंध करता है। – Chimera

-1

क्या यह संभव है कि कुछ भ्रम हो जो -जे करता है? (कम से कम मैं इसे लंबे समय से गलत था ...)। मैंने माना कि -जे बिना विकल्पों के सीपीयू की संख्या के अनुकूल होगा, लेकिन ऐसा नहीं है - यह बस किसी भी सीमा को लागू नहीं करता है। इसका मतलब है कि बड़ी परियोजनाओं के लिए यह बड़ी संख्या में प्रक्रियाएं पैदा करेगा (केवल "शीर्ष" को देखने के लिए चलाएं ...), और संभवतः सभी रैम का उपयोग करें। मैंने इस पर ठोकर खाई जब मेरी परियोजना के "मेक-जे" ने मेरी सभी 16 जीबी रैम का इस्तेमाल किया और असफल रहा, जबकि "मेक-जे 8" 2.5 जीबी रैम के उपयोग पर शीर्ष पर रहा (8 कोर पर, भार 100% के करीब है दोनों घटनायें)।

दक्षता के मामले में, मुझे लगता है कि आपके द्वारा अपेक्षित CPU की अधिकतम संख्या के बराबर या उससे अधिक की सीमा का उपयोग करना अधिक कुशल है, क्योंकि कोई सीमा नहीं है, क्योंकि हजारों प्रक्रियाओं के शेड्यूलिंग में कुछ ओवरहेड है। बनाए गए प्रक्रियाओं की कुल संख्या निरंतर होनी चाहिए, लेकिन "-j" उनमें से बहुत से एक बार बनाता है, स्मृति आवंटन एक समस्या बन सकता है। सीपीयू की संख्या को दोगुना करने की सीमा को भी सेट करना अभी भी अधिक रूढ़िवादी होना चाहिए जो कि सीमा निर्धारित नहीं कर रहा है।

पुनश्च: कुछ और मैं एक स्वच्छ समाधान के साथ आया था खुदाई के बाद - बस प्रोसेसर की संख्या पढ़ा और का उपयोग करें कि -j विकल्प के रूप में: लिनक्स/यूनिक्स पर

make -j `nproc` 
संबंधित मुद्दे