प्रदर्शन के मुद्दों की तलाश में ईवेंट डेटा को विज़ुअलाइज़ करने के तरीके


10

मैं एक उच्च अतुल्यकालिक संचार पैटर्न के साथ एक MPI एप्लिकेशन को अनुकूलित करने की कोशिश कर रहा हूं। प्रत्येक रैंक में गणना करने के लिए चीजों की एक सूची होती है, और यदि आवश्यक हो तो संदेश भेजता है यदि इनपुट या आउटपुट एक अलग रैंक पर रहते हैं। इसके अलावा, प्रत्येक रैंक थ्रेडेड है (वर्तमान में एक संचार थ्रेड और 5 श्रमिकों के साथ)।

मैंने कोड के विभिन्न प्रदर्शन महत्वपूर्ण भागों के आसपास टाइमर के साथ कोड लिख दिया है, जो मुझे प्रत्येक थ्रेड के लिए (प्रारंभ, अंत, प्रकार) त्रिकोणीय सूची देता है। स्पष्ट तरीके से प्लॉट किए गए, क्षैतिज अक्ष, रैंक और थ्रेड को ऊर्ध्वाधर के रूप में समय के साथ, और यह दर्शाता है कि प्रत्येक धागा वर्तमान में क्या कर रहा है, मुझे इस तरह की छवि मिलती है जैसे 6 धागे / रैंक के साथ 16 रैंक।

पेंटागो रैंक और थ्रेड हिस्ट्री

मेरा सवाल यह है: इस डेटा को देखने के अन्य तरीके क्या हैं जो प्रदर्शन के मुद्दों को कम करने में मदद कर सकते हैं? क्या किसी के पास एक पसंदीदा प्रकार का प्लॉट है जिसका उपयोग वे एसिंक्रोनस अनुप्रयोगों को प्रोफाइल करते समय करते हैं?

यह डेटा सेट सीमित है कि यह डेटाफ़्लो संरचना को नहीं जानता है, लेकिन मैं कुछ अधिक जटिल इकट्ठा करने की कोशिश करने से पहले इसके बारे में अधिक से अधिक जानकारी प्राप्त करना चाहता हूं।

यदि कोई भी व्यक्ति चारों ओर देखना चाहता है, तो यह असम्बद्ध छवि यहाँ है (यह सामान्य मार्ग से अपलोड करने में विफल रहा)। दुर्भाग्य से, फ़ायरफ़ॉक्स इसे स्वीकार नहीं करता, भले ही मेरा मानना ​​है कि यह मान्य है, संभवतः क्योंकि यह बस बहुत बड़ा है।


मुझे अपने ब्राउज़र या बड़ी छवि को लोड करने के लिए किसी भी अन्य कार्यक्रम को प्राप्त करने में काफी परेशानी हुई। अंत में, जिम्प ने इसे किया, लेकिन आप आकार या फ़ाइल प्रारूप विकल्पों पर फिर से विचार करना चाह सकते हैं।
पेड्रो

उसके लिए माफ़ करना। मुझे लगता है कि छवि वैध है, क्योंकि फ़ायरफ़ॉक्स मुझे वही त्रुटियां देता है जो इसे कन्वर्ट (इमेजमैजिक) के माध्यम से चला रहा है। संभवतः यह कुछ मनमाने आकार की सीमा से अधिक है।
ज्योफ्री इरविंग

जवाबों:


4

मैं साझा कोड और डिबगिंग मेमोरी के साथ बहुत समय लेखन और डिबगिंग में बिताता हूं, लेकिन साझा और / या वितरित मेमोरी के साथ, लेकिन आपकी विशिष्ट समस्या को जाने बिना, मैं केवल आपको बता सकता हूं कि मेरे लिए सबसे अच्छा क्या काम करता है।

यह जानना कि कौन सी दिनचर्या में कितना समय लगता है यदि आप कम्प्यूटेशनल दक्षता देख रहे हैं, लेकिन अगर आप समानांतर दक्षता के बारे में चिंतित हैं, तो आपको इस बात को लेकर अधिक चिंतित होना चाहिए कि जब कोई कंपीटिशन नहीं कर रहा है तो आपका कोड क्या कर रहा है। बच्चों को क्या करना है चिंता करने की तरह यह बहुत शांत है ...

चूंकि आप हाइब्रिड साझा / वितरित मेमोरी दृष्टिकोण का उपयोग कर रहे हैं, मुझे लगता है कि आपका कोड रिक्त स्थान पर है, या तो एमपीआई कॉल पर या म्यूटेक्स / स्थिति चर पर प्रतीक्षा कर रहा है। आप इन कॉल को टाइमर्स में भी रैप कर सकते हैं, और यह आपको एक बेहतर तस्वीर देगा जो आपको धीमा कर रहा है, जैसे कि यदि यह हमेशा एक ही सशर्त या हमेशा एक जैसा MPI_REDUCEहो तो आपके धागे अटक जाते हैं।

सॉफ्टवेयर का एक टुकड़ा जो मैं अक्सर उपयोग करता हूं वह इंटेल Vtune एम्पलीफायर XE है । इसमें एक अच्छी प्लॉटिंग सुविधा / विकल्प है जो थ्रेड कंसिस्टेंसी की कल्पना करता है। यह प्रोग्राम आपके जैसे ही एक कथानक को आकर्षित करेगा, फिर भी जब एक थ्रेड म्यूटेक्स या कंडीशन वैरिएबल पर प्रतीक्षा करता है, तो यह वेटिंग थ्रेड से एक विकर्ण रेखा खींचता है, जिस समय वह प्रतीक्षा करना शुरू करता है, उस थ्रेड को जो वास्तव में म्यूटेक्स या सिग्नल को रिलीज़ करता है। उस स्थिति की प्रतीक्षा की जा रही थी, जिस समय इसे जारी किया गया था। यह काफी गड़बड़ हो सकता है, लेकिन यह बाधाओं को तुरंत प्रकट करता है।

अंत में, मैं बल्क आँकड़े भी इकट्ठा करता हूं, उदाहरण के लिए प्रत्येक म्यूटेक्स / सिग्नल / एमपीआई-कॉल के लिए, औसत और अधिकतम प्रतीक्षा समय क्या थे? एकत्रित प्रतीक्षा समय का हिस्टोग्राम क्या है? जबकि प्लॉट आपको एक अच्छा अवलोकन देता है, यह ठीक विवरण के नीचे आने पर काफी गड़बड़ हो सकता है।

अंत में, एक प्रश्न जिसे कम करके नहीं आंका जाना चाहिए: आप अपने समय को कैसे इकट्ठा कर रहे हैं? क्या आपका टाइमर गैर-घुसपैठिया है जो आपके कोड को प्रभावित नहीं करेगा? मैं जब भी संभव हो, RDTSCx86 आर्किटेक्चर पर CPU निर्देश गणना का उपयोग करता हूं । यह आमतौर पर आपके कोड में केवल एक निर्देश जोड़ता है।


डेटा में पहले से ही सभी वेट के आसपास ब्लॉक हैं; चित्र में वे निष्क्रिय कार्यकर्ता धागे के लिए सफेद और प्रतीक्षा संचार धागे के लिए पीले रंग के रूप में दिखाते हैं। दुर्भाग्य से, संचार धागे में सभी इंतजार एक ही कंबल MPI_Waitsome में अतुल्यकालिक के कारण होता है। Vtune इस मामले में लागू नहीं होता है क्योंकि विशुद्ध रूप से थ्रेडेड प्रदर्शन अनिवार्य रूप से सही है, लेकिन पॉइंटर के लिए धन्यवाद। हिस्टोग्राम सुझाव एक अच्छा भी है।
जेफ्री इरविंग

ओवरहेडिंग टाइम के लिए: मैं गेटटाइमऑफडे का उपयोग कर रहा हूं, जो कि कम से कम निष्क्रिय सेक्शन के आसपास आवश्यक है क्योंकि मैं वहां पर पार्थिव प्लेटफॉर्म का उपयोग करता हूं। क्या ऐसी स्थिति में काम करने के लिए सीपीयू निर्देश गणना की जा सकती है? ओवरहेड पहले से ही काफी कम है, लेकिन कम निश्चित रूप से अच्छा होगा।
ज्योफ्री इरविंग

1
@GeoffreyIrving: हाँ, आप उनका उपयोग कर सकते हैं, लेकिन वे केवल CPU पर समझदारी रखते हैं जिनके पास constant_tscध्वज सेट (चेक /proc/cpuinfo) होता है और यदि आप प्रत्येक धागे को एक विशिष्ट कोर पर लॉक करते हैं, अर्थात प्रत्येक धागा हमेशा उसी कोर से एक ही रजिस्टर को पढ़ता है। जैसे उपयोग करना pthread_setaffinity_np। ध्यान दें कि बाद वाला लिनक्स विशिष्ट है और इस प्रकार पोर्टेबल नहीं है।
पेड्रो

@GeoffreyIrving: यदि आप किसी अज्ञात घटना का उपयोग करने की प्रतीक्षा कर रहे हैं MPI_Waitsome, तो भी आप यह रिकॉर्ड कर सकते हैं कि वास्तव में क्या अनुरोध आया है और कहां से आया है। यह जानकारी उपयोग की हो सकती है या नहीं भी ...
पेड्रो

5

कभी-कभी आप उच्च-स्तरीय संसाधन विश्लेषण के माध्यम से प्रदर्शन की समस्याओं पर एक वैकल्पिक दृष्टिकोण प्राप्त कर सकते हैं: क्या मेमोरी बैंडविड्थ जैसे प्रासंगिक अड़चन है? क्या प्रत्येक श्रमिक धागा समान कार्य करता है? इस डेटा को LIKWID टूल सूट LIKWID Google कोड प्रोजेक्ट से likwid-perfctr के साथ आसानी से एकत्र किया जा सकता है । यदि प्रोफ़ाइल ऐसी है जिसमें कई अलग-अलग हॉट स्पॉट मौजूद हैं, तो आपको एक-एक करके उनसे निपटने की आवश्यकता हो सकती है। कितने धागे / प्रक्रिया का उपयोग किया जाता है, इसके आधार पर भी अलग-अलग मुद्दे हो सकते हैं।


पूर्ण प्रकटीकरण के हितों में, जॉर्ज LIKWID परियोजना पर काम करता है और मैंने इस प्रतिक्रिया की याचना की है क्योंकि मैं पेड्रो के महान जवाब को एक और परिप्रेक्ष्य (और एक महान, स्वतंत्र रूप से उपलब्ध उपकरण) के साथ पूरक करना चाहता था।
एरन अहमदिया

2

जब मुझे संदेशों या घटनाओं द्वारा संचालित अत्यधिक अतुल्यकालिक प्रक्रियाओं के नेटवर्क में कोई समस्या होती है, तो मैं एक विधि का उपयोग करता हूं जो आसान नहीं है लेकिन प्रभावी है। इसमें प्रक्रियाओं के टाइम-स्टैम्प्ड लॉग्स को शामिल करना, उन्हें एक सामान्य समयरेखा में विलय करना और कुछ संदेशों की प्रगति को ट्रैक करना जैसे कि वे गतिविधियों को ट्रिगर करते हैं, आगे के संदेशों को ट्रिगर करते हैं। मैं जिस समय की तलाश कर रहा हूं वह एक संदेश प्राप्त होने के समय में देरी है और उस समय जिस पर कार्रवाई की गई है, और देरी के कारण को समझ रहा है। जब कोई समस्या पाई जाती है, तो इसे ठीक किया जाता है, और प्रक्रिया को दोहराया जाता है। इस तरह, आप वास्तव में संतोषजनक प्रदर्शन प्राप्त कर सकते हैं।

यह देखना महत्वपूर्ण है कि यह आपके दृष्टिकोण, माप, माप से अलग कैसे है। केवल एक चीज को मापने क़यास आप बता सकते हैं जहां है नहीं देखने के लिए। वास्तविक प्रदर्शन ट्यूनिंग को समय के नजरिए से विवरण को ध्यान से देखने की आवश्यकता है। आप जो खोज रहे हैं वह वह नहीं है जहाँ समय व्यतीत होता है, लेकिन जहाँ यह अनावश्यक रूप से खर्च होता है।

सौभाग्य।


दूसरे शब्दों में, मेरे पास मौजूद डेटा का कोई उपयोगी दृश्य नहीं है। :) जेड ब्राउन ने आपके द्वारा सुझाए गए डेटा को इकट्ठा करने और कल्पना करने के एक तरीके के रूप में जम्पशॉट (और संबद्ध उपयोगिताओं) का सुझाव दिया, इसलिए मैं उस पर गौर करूंगा।
जियोफ्रे इरविंग

@Geof: विज़ुअलाइज़ेशन के साथ शुभकामनाएँ। एकमात्र उपकरण जो मुझे उपयोगी लगा, वह है ईवेंट लॉग को इकट्ठा करने और मर्ज करने के लिए कुछ है ताकि मैं एक या एक से अधिक अनुरोधों के मार्ग का अनुसरण कर सकूं क्योंकि यह विभिन्न थ्रेड्स के माध्यम से अपना रास्ता बना रहा है, 'यही कारण है कि मुझे अनावश्यक का पता लगाने का एकमात्र तरीका है देरी। कि किसी भी प्रदर्शन समस्या में क्या होगा - अनावश्यक देरी।
माइक डनलैवी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.