कई कोर पर संकलन करते समय क्या हैंग हो सकता है?


17

कल मैं स्रोत से रूट पैकेज संकलित करने की कोशिश कर रहा था । चूंकि मैं इसे 6 कोर मॉन्स्टर मशीन पर संकलित कर रहा था, इसलिए मैंने कई कोर का उपयोग करके आगे बढ़ने और निर्माण करने का निर्णय लिया make -j 6। संकलन सुचारू रूप से शुरू हुआ और वास्तव में तेजी से बढ़ा, लेकिन कुछ बिंदु makeपर सिर्फ एक कोर पर 100% सीपीयू का उपयोग करके लटका दिया गया।

मैंने कुछ googling किया और इस पोस्ट को ROOT संदेश बोर्डों पर पाया । चूंकि मैंने खुद इस कंप्यूटर का निर्माण किया था, मुझे चिंता थी कि मैंने हीटसिंक को ठीक से लागू नहीं किया था और सीपीयू ओवरहीटिंग या कुछ और था। दुर्भाग्य से, मेरे पास काम पर यहां एक फ्रिज नहीं है जिसे मैं इसे छड़ी कर सकता हूं। ;-)

मैंने lm-sensorsपैकेज स्थापित किया और make -j 6फिर से चला गया, इस बार सीपीयू तापमान की निगरानी करना। हालांकि यह उच्च (60 सी के करीब) हो गया, यह कभी भी उच्च या महत्वपूर्ण तापमान से आगे नहीं गया।

मैंने दौड़ने की कोशिश की, make -j 4लेकिन makeसंकलन के दौरान फिर से लटका दिया, इस बार एक अलग स्थान पर।

अंत में, मैंने सिर्फ दौड़ना संकलित makeकिया और यह ठीक काम किया। मेरा सवाल है: यह क्यों लटका हुआ था? इस तथ्य के कारण कि यह दो अलग-अलग स्थानों पर रुका है, मुझे लगता है कि यह किसी प्रकार की दौड़ की स्थिति के कारण था, लेकिन मुझे लगता है कि makeयह सही क्रम में सब कुछ पाने के लिए पर्याप्त चतुर होना चाहिए क्योंकि यह -jविकल्प प्रदान करता है।


4
यह एक दौड़ की स्थिति की तरह ध्वनि करता है। एक चीज जो आप कर सकते हैं, वह है रनिंग मेक प्रोसेस (वह जो कताई है) का उपयोग करना, जैसे strace -p <pid>और देखने के लिए कि क्या आप पता लगा सकते हैं कि यह क्या / के लिए देख रहा है। स्ट्रेस केवल आपको syscalls (फ़ंक्शन कॉल नहीं) दिखाएगा, लेकिन यह अभी भी आपको बहुमूल्य जानकारी दे सकता है यदि यह किसी विशेष फ़ाइल को देखते समय या उसके लिए कताई कर रहा है।
jlp

Google के माध्यम से आपके द्वारा पाया गया धागा इस निष्कर्ष पर पहुंचता है कि कोई भी इसके साथ संकलित करने में सक्षम नहीं था -j >1
निल्स

समानांतर संकलन से संबंधित नहीं है, लेकिन मेरे पास एक लटकता हुआ मेकअप था जो हमेशा के लिए डिबग में ले गया। यह बताता है कि यह केवल एक चर के आरंभ में $(shell ...)था , अंततः एक कमांड चला रहा था जो इनपुट से इंतजार कर रहाstdin था । यह तब होता है जब एक चर खाली था और कमांड में कोई फ़ाइल तर्क पारित नहीं किया गया था।
jozxyqk

जवाबों:


13

मेरे पास इस सटीक मुद्दे का जवाब नहीं है, लेकिन मैं आपको संकेत दे सकता हूं कि क्या हो रहा है: मेकफाइल्स में निर्भरताएं।

उदाहरण:

target: a.bytecode b.bytecode
    link a.bytecode b.bytecode -o target

a.bytecode: a.source
    compile a.source -o a.bytecode

b.bytecode: b.source
    compile b.source a.bytecode -o a.bytecode

यदि आप कहते हैं कि make targetसब कुछ सही ढंग से संकलित होगा। का संकलन a.sourceपहले किया जाता है (मनमाने ढंग से, लेकिन निश्चित रूप से)। फिर संकलन का b.sourceप्रदर्शन किया जाता है।

लेकिन अगर आप make -j2 targetदोनों compileकमांड समानांतर चलेंगे। और आप वास्तव में नोटिस करेंगे कि आपके मेकफाइल की निर्भरता टूट गई है। दूसरा संकलन मान लिया गया a.bytecodeहै, लेकिन यह निर्भरता में नहीं दिखता है। तो एक त्रुटि होने की संभावना है। इसके लिए सही निर्भरता रेखा b.bytecodeहोनी चाहिए:

b.bytecode: b.source a.bytecode

आपकी समस्या पर वापस आने के लिए, यदि आप भाग्यशाली नहीं हैं, तो यह संभव है कि एक 100% सीपीयू लूप में एक कमांड लटका हुआ है, क्योंकि एक लापता निर्भरता है। शायद यहाँ क्या हो रहा है, लापता निर्भरता एक अनुक्रमिक निर्माण द्वारा प्रकट नहीं किया जा सकता है, लेकिन यह आपके समानांतर निर्माण से पता चला है।


दिलचस्प। क्या आप जानते हैं कि क्या कोई उपकरण उपलब्ध हैं जो मेकफाइल के माध्यम से चल सकते हैं और इन निर्भरताओं की जांच कर सकते हैं?
user545424

मैं किसी को नहीं जानता। किसी भी मामले में ऐसा उपकरण केवल स्पष्ट गलतियां ही खोज सकता है। जब तक यह मेकफाइल में दिखाई देने वाली प्रत्येक कमांड के सिंटैक्स को नहीं समझता, और जानता है कि (संभावित रूप से निहित) निर्भरताएं क्या हैं।
स्टेफेन जिमेनेज़

2

मुझे नहीं पता कि आपके पास कितनी देर मशीन है, लेकिन मेरी पहली सिफारिश मेमोरी टेस्ट करने और यह सत्यापित करने की होगी कि मेमोरी ठीक से काम कर रही है। मुझे पता है कि यह अक्सर समस्या है कि स्मृति नहीं है, लेकिन अगर यह है, तो यह एक कारण के रूप में पहले खत्म करने के लिए सबसे अच्छा है शायद नीचे अन्य मुद्दों का पता लगाने की कोशिश कर रहा है।


2

मुझे लगता है कि यह वास्तव में एक पुराना सवाल है, लेकिन यह अभी भी खोज परिणामों में सबसे ऊपर आता है, इसलिए यहां मेरा समाधान है:

GNU मेक को सुनिश्चित करने के लिए एक जॉबस्वरर मैकेनिज्म है और इसके पुनरावर्ती बच्चे कोर की निर्दिष्ट संख्या से अधिक का उपभोग नहीं करते हैं: http://make.mad-scientist.net/papers/jobserver-implementation/

यह सभी प्रक्रियाओं द्वारा साझा किए गए पाइप पर निर्भर करता है। प्रत्येक प्रक्रिया जो अतिरिक्त बच्चों को कांटा करना चाहती है, उसे पहले पाइप से टोकन का उपभोग करना पड़ता है, फिर जब किया जाता है तो उन्हें त्यागें। यदि एक बच्चे की प्रक्रिया उसके द्वारा उपभोग किए गए टोकन वापस नहीं करती है, तो शीर्ष-स्तर बनाते हैं, जबकि हमेशा के लिए लटकाए जाने का इंतजार करते हैं।

https://bugzilla.redhat.com/show_bug.cgi?id=654822

मुझे इस त्रुटि का सामना करना पड़ा जब जीएनयू के साथ बिन्यूल्स का निर्माण मेरे सोलारिस बॉक्स पर किया गया, जहां "सेड" जीएनयू सेड नहीं है। PATH के साथ sed करने के लिए Fiddling == प्राप्त सिस्टम सेड पर प्राथमिकता लेना समस्या को तय करता है। मुझे नहीं पता कि सीड पाइप से टोकन का उपभोग क्यों कर रहा था, हालांकि।


0

आपका सिस्टम ठीक हो सकता है, लेकिन यह makeसमानांतर में चलने पर चलने के साथ दौड़ की स्थिति हो सकती है ।

यदि आपके सिस्टम में कुछ गड़बड़ है, तो यह अन्य परिदृश्यों के लिए लटका / दुर्घटनाग्रस्त होगा, न कि केवल समानांतर निर्माण करते समय।


0

यह एक दौड़ की स्थिति हो सकती है, लेकिन यह भी कि यदि सभी आवश्यक संकलन समानांतर में किया जाता है और दूसरों की प्रतीक्षा में है, तो लिंकिंग आपके मशीन पर अपना समय लेती है। मुझे लगता है कि यदि लिंकिंग समानांतर में पिछले आवश्यक संकलन की प्रतीक्षा करती है, तो आप जो भी संकलन करते हैं, उसे जोड़ने वाले धागे पर उच्च सीपीयू आवृत्ति मिलती है।

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