5

मैं समझने की कोशिश कर रहा हूं कि सिस्टम विस्तृत प्रोफाइलर कैसे काम करता है। उदाहरण के लिए लिनक्स परफ लें। एक निश्चित रूपरेखा समय के लिए यह प्रदान कर सकते हैं:सिस्टम विस्तृत प्रोफाइलर (उदा। पीआरएफ) काउंटरों को निर्देशों के साथ कैसे सहसंबंधित करता है?

  • विभिन्न एकत्रित hadware प्रदर्शन काउंटरों
  • समय बिताया है और प्रत्येक उपयोगकर्ता अंतरिक्ष की प्रक्रिया और गिरी अंतरिक्ष समारोह
  • सूचना के लिए हार्डवेयर काउंटरों (जैसे #instructions) संदर्भ के बारे में
  • स्विच
  • आदि

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

अगला भाग काउंटर को मशीन पर चल रहे सॉफ़्टवेयर के साथ सहसंबंधित करना है। वह हिस्सा है जिसे मैं समझ नहीं पा रहा हूं

  1. तो प्रोफाइलर को इसका डेटा कहां से मिलता है?

  2. क्या आप उदाहरण के लिए कार्य शेड्यूलर से पूछ सकते हैं कि जब आप उसे बाधित करते हैं तो क्या चल रहा था? यह शेड्यूलर निष्पादन को प्रभावित नहीं करेगा (उदा। बाधित फ़ंक्शन को जारी रखने के बजाय यह प्रोफाइलर परिणाम सटीक नहीं होने पर, केवल एक और शेड्यूल करेगा)। की सूची है task_struct ऑब्जेक्ट्स उपलब्ध हैं?

  3. प्रोफेसर भी एचडब्ल्यू मेट्रिक्स को निर्देश स्तर पर भी कैसे सहसंबंधित कर सकते हैं?
+0

वहाँ रूपरेखा में दो बातें कर रहे हैं। गिनती और नमूनाकरण। गिनती के उपाय पूरे निष्पादन के दौरान की घटनाओं के समग्र संख्या निर्देश या कार्यों कि उत्पन्न उन्हें के बारे में कोई जानकारी की पेशकश के बिना। दूसरी ओर, नमूना अनुदेश सूचक .http की पर कब्जा कर लिया नमूने के माध्यम से कोड के लिए घटनाओं की एक संबंध देता है: //openlab.web.cern.ch/sites/openlab.web.cern.ch/ फ़ाइलें/तकनीकी_ दस्तावेज़/TheOverheadOfProfilingUsingPMUhardwareCounters.pdf –

उत्तर

6

मिलान किया जाता है तो मुझे लगता है कि कुछ कर्नेल मॉड्यूल की शुरूआत सॉफ्टवेयर पर व्यवधान है एक निश्चित नमूना दर।

Perf मॉड्यूल नहीं है, यह लिनक्स कर्नेल,, kernel/events/core.c में और हर समर्थित वास्तुकला और सीपीयू मॉडल के लिए लागू उदाहरण arch/x86/kernel/cpu/perf_event*.c के लिए का हिस्सा है। लेकिन ओप्रोफाइल समान दृष्टिकोण के साथ एक मॉड्यूल था।

Perf आम तौर पर CPU के पीएमयू (प्रदर्शन निरीक्षण इकाई) पूछ कुछ हार्डवेयर प्रदर्शन काउंटर के एन घटनाओं के बाद व्यवधान उत्पन्न करने के लिए कर काम करता है (Yokohama, slide 5 "• इंटरप्ट जब सीमा पर पहुंच गई: नमूना की अनुमति देता है")। वास्तव में यह रूप में लागू किया जा सकता है:

  • चयन कुछ पीएमयू काउंटर
  • -N, जहां एन नमूना अवधि है करने के लिए इसे प्रारंभ (हम,, एन घटनाओं के बाद बीच में, उदाहरण के लिए चक्र perf record -c 2000000 -e cycles के 2 लाखों के बाद चाहते हैं, या कुछ एन गणना और perf द्वारा tuned जब कोई अतिरिक्त विकल्प सेट नहीं किया गया है या -F दिया गया है)
  • इस काउंटर को वांछित ईवेंट पर सेट करें, और पीएमयू से अतिप्रवाह (ARCH_PERFMON_EVENTSEL_INT) पर बाधा उत्पन्न करने के लिए कहें। यह हमारे काउंटर की एन वृद्धि के बाद होगा। Nehalem प्रदर्शन की निगरानी यूनिट प्रोग्रामिंग गाइड

    EBS - - घटना के आधार सैम्पलिंग https://software.intel.com/sites/default/files/76/87/30320:

सभी आधुनिक प्रतिष्ठा इंटेल इस उदाहरण के लिए, Nehalem का समर्थन करता है। एक तकनीक जिसमें काउंटर बड़ी नकारात्मक गणना के साथ पूर्व लोड होते हैं, और वे ओवरफ्लो पर प्रोसेसर को बाधित करने के लिए कॉन्फ़िगर किए जाते हैं। जब काउंटर इंटरप्ट सेवा नियमित रूप से प्रोफाइलिंग डेटा को ओवरफ्लो करता है।

तो, जब आप हार्डवेयर पीएमयू का उपयोग करते हैं, तो हार्डवेयर पीएमयू काउंटरों के विशेष पढ़ने के साथ टाइमर इंटरप्ट पर कोई अतिरिक्त काम नहीं होता है। कार्य स्विच पर पीएमयू राज्य को सहेजने/पुनर्स्थापित करने के लिए कुछ काम है, लेकिन यह (*_sched_in/*_sched_out कर्नेल/घटनाओं/core.c के) पीएमयू काउंटर वैल्यू नहीं बदलेगा और न ही इसे उपयोगकर्ता-स्पेस में निर्यात करेगा।

हैंडलर नहीं है: arch/x86/kernel/cpu/perf_event.c: x86_pmu_handle_irq जो वर्तमान समय रिकॉर्ड करने के लिए overflowed काउंटर और callsperf_sample_data_init(&data, 0, event->hw.last_period); पाता है, पिछले निष्पादित आदेश के आईपी (यह सबसे इंटेल microarchitetures के बाहर के आदेश स्वभाव की वजह से अयथार्थ हो सकता है, वहाँ सीमित है कुछ घटनाओं के लिए वैकल्पिक हल - PEBS, perf record -e cycles:pp), स्टैकट्रेस (यदि -g रिकॉर्ड में इस्तेमाल किया गया था), आदि तो फिर हैंडलर -N (x86_perf_event_set_period, wrmsrl(hwc->event_base, (u64)(-left) & x86_pmu.cntval_mask); के लिए काउंटर मूल्य रीसेट करता है - left से पहले शून्य से ध्यान दें)

कम नमूना दर, प्रोफाइलर ओवरहेड कम।

Perf आप -F विकल्प के साथ लक्ष्य नमूना दर निर्धारित करने के लिए, -F 1000 लगभग 1000 आईआरक्यू/एस का मतलब है की अनुमति देता है।उच्च ओवरहेड के कारण उच्च दरों की सिफारिश नहीं की जाती है। दस साल पहले इंटेल वीट्यून ने 1000 से अधिक irq/s (www.cs.utah.edu/~mhall/cs4961f09/VTune-1.pdf "प्रति लॉजिकल सीपीयू प्रति सेकेंड 1000 नमूने प्राप्त करने का प्रयास किया।") , पीईएफ आमतौर पर गैर-रूट के लिए उच्च दर की अनुमति नहीं देता है ("पीआरएफ इंटरप्ट बहुत लंबा समय लेते समय कम दर पर स्वत:" - अपने डीएमएसजी में जांचें; sysctl -a|grep perf भी देखें, उदाहरण के लिए kernel.perf_cpu_time_max_percent=25 - जिसका अर्थ है कि परफ का उपयोग करने का प्रयास नहीं करेगा 25% सीपीयू)

क्या आप उदाहरण के लिए कार्य शेड्यूलर से पूछ सकते हैं कि जब आप उसे बाधित करते हैं तो क्या चल रहा था?

नहीं। लेकिन तुम sched_switch या अन्य Sched घटना (सूची Sched में सभी उपलब्ध: perf list 'sched:*') पर tracepoint सक्षम कर सकते हैं, और पर्फ़ के लिए घटना की रूपरेखा के रूप में उपयोग। तुम भी इस tracepoint पर स्टैकट्रेस रिकॉर्ड करने के लिए पर्फ़ पूछ सकते हैं:

perf record -a -g -e "sched:sched_switch" sleep 10 

कि अनुसूचक के निष्पादन

सक्षम tracepoint कार्य करने के लिए कुछ पर्फ़ घटना नमूना काम जोड़ने कर देगा को प्रभावित नहीं करेंगे ट्रेसपॉइंट

कार्य_स्ट्रक्चर ऑब्जेक्ट्स की सूची उपलब्ध है? केवल ftrace के माध्यम से ...

संदर्भ के बारे में जानकारी स्विच

इस घटना पर्फ़ सॉफ्टवेयर है, बस Sched/core.c (परोक्ष रूप से) से PERF_COUNT_SW_CONTEXT_SWITCHES घटना के साथ perf_sw_event को कहते हैं। प्रत्यक्ष कॉल के उदाहरण - प्रवास सॉफ्टवेयर घटना: kernel/sched/core.c set_task_cpu(): p->se.nr_migrations++; perf_sw_event(PERF_COUNT_SW_CPU_MIGRATIONS, 1, NULL, 0);

पुनश्च: पर्फ़, ftrace और अन्य रूपरेखा और लिनक्स में अनुरेखण उप पर अच्छा स्लाइड ग्रेग द्वारा देखते हैं: http://www.brendangregg.com/linuxperf.html

+0

आपको बहुत बहुत धन्यवाद। बहुत बढ़िया जवाब! – VAndrei

2

यह आपके तीनों सवालों के बहुत अधिक जवाब देता है।

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

देखें http://openlab.web.cern.ch/sites/openlab.web.cern.ch/files/technical_documents/TheOverheadOfProfilingUsingPMUhardwareCounters.pdf

+0

ठीक है। यह मेरे कुछ suppositions की पुष्टि शुरू होता है। हालांकि मुझे पूरा यकीन नहीं है कि एक काउंटर थ्रेसहोल्ड तक पहुंचने पर बाधा जारी की जाती है। मुझे लगता है कि केवल एक साधारण टाइमर है जो प्रत्येक टिक पर नमूने एकत्र करता है। हम वास्तव में पूर्व-पूर्व में नहीं जानते हैं कि सीमा तय करने के लिए काउंटर का मूल्य क्या होगा। संभवतः उत्तर दोनों विधियों का मिश्रण हो सकता है। आईपी ​​के संबंध में, यह बाधा दिनचर्या को इंगित नहीं करेगा। हम बाधित कार्य का आईपी कैसे प्राप्त कर सकते हैं? – VAndrei

+1

@VAndrei: जिस तरीके से इंटरप्ट्स कम से कम काम करते हैं, वह प्रत्येक निर्देश के लिए माइक्रोक्रोड कहता है, "क्या इंटरप्ट अनुरोध सेट है?" और यदि ऐसा है तो यह मूल रूप से इंटरप्ट हैंडलर को एक अनिश्चित फ़ंक्शन कॉल शुरू करता है। हैंडलर यह देखने के लिए स्टैक को देख सकता है कि इसे कहां से बुलाया गया था, जो बाधित प्रक्रिया का आईपी है। –

+0

@ माइकडुनलेवी मैंने कुछ और पढ़ा और अब मैं समझता हूं कि जब एक आईआर की सेवा करते हैं (भले ही यह सॉफ्टवेयर है), हैंडलर चल रहे कार्य की जानकारी बचाता है। मुझे संदेह है कि हार्डवेयर इंटरप्ट अनुरोधों के लिए प्रत्येक निर्देश चुनाव का माइक्रोक्रोड। इसका मतलब यह होगा कि निष्पादन बंदरगाहों में से एक हमेशा चुनाव में व्यस्त रहेगा। 21 वीं शताब्दी में पीएमयू को * अलग हार्डवेयर ब्लॉक * के रूप में लागू किया गया है, जिसमें पाइपलाइन के विभिन्न स्थानों से बहुत सारे प्रदर्शन मॉनिटर इनपुट हैं, और कई काउंटर भी हैं, यह एक कठिन वायर्ड दिनचर्या (उदाहरण के लिए एआरएम का जेनेरिक इंटरप्ट कंट्रोलर) – VAndrei

संबंधित मुद्दे