2012-08-26 17 views
5

में समय-समय पर प्रदर्शन काउंटर पढ़ें लिनक्स में समय-समय पर प्रदर्शन काउंटर पढ़ने का कोई तरीका है?लिनक्स

कुछ एक्स चक्रों का नमूना देने की क्षमता के साथ perf stat कुछ ऐसा है जो मैं ढूंढ रहा हूं।

मूल रूप से मैं कुछ प्रोग्राम के लिए प्रत्येक एक्स मात्रा सीपीयू चक्रों को निर्देश काउंटर (निष्पादित निर्देशों की संख्या) को पढ़ने में सक्षम होना चाहता हूं।

उत्तर

5

ऐसा लगता है कि लिनक्स में परफ टूल एक ईवेंट रिकॉर्ड करके काम करता है जब काउंटर नियमित अंतराल पर नमूना देने के बजाए एक विशिष्ट मूल्य तक पहुंचते हैं।

कमांड perf record -e cycles,instructions -c 10000 हर 10000 चक्र और हर 10000 निर्देशों को एक ईवेंट स्टोर करता है। इसे एक नए कमांड या मौजूदा पिड के खिलाफ चलाया जा सकता है। यह वर्तमान निर्देशिका में perf.data पर रिकॉर्ड करता है।

डेटा का विश्लेषण करना एक और मामला है। perf script का उपयोग करके आप हो जाता है काफी करीब:

ls 16040 2152149.005813: cycles:   c113a068 ([kernel.kallsyms]) 
ls 16040 2152149.005820: cycles:   c1576af0 ([kernel.kallsyms]) 
ls 16040 2152149.005827: cycles:   c10ed6aa ([kernel.kallsyms]) 
ls 16040 2152149.005831: instructions:   c1104b30 ([kernel.kallsyms]) 
ls 16040 2152149.005835: cycles:   c11777c1 ([kernel.kallsyms]) 
ls 16040 2152149.005842: cycles:   c10702a8 ([kernel.kallsyms]) 
... 

आप एक स्क्रिप्ट है कि उत्पादन से लाइनों की एक गुच्छा ले जाता है और 'चक्र' और उस सेट में 'निर्देश' की घटनाओं की संख्या की गणना लिखने के लिए की जरूरत है। आप रिकॉर्डिंग कमांड में पैरामीटर -c 10000 को बदलकर संकल्प को समायोजित कर सकते हैं।

मैंने ls / के विरुद्ध perf stat और perf record चलाकर विश्लेषण सत्यापित किया। स्टेट ने 2 634 205 चक्र, 1 725 255 निर्देशों की सूचना दी, जबकि स्क्रिप्ट आउटपुट में 410 चक्र घटनाएं और 18 9 निर्देश घटनाएं थीं। -c मान जितना छोटा होगा, उतना अधिक ओवरहेड चक्र पढ़ने में लगता है।

विकल्प perf record पर भी है, जो नियमित अंतराल पर नमूने हैं। हालांकि, इस विकल्प का उपयोग करते समय मुझे काउंटर वैल्यू पुनर्प्राप्त करने का कोई तरीका नहीं मिला।

संपादित करें:perf stat स्पष्ट रूप से पिड्स पर भी काम करता है, और ctrl-c दबाए जाने तक डेटा कैप्चर करता है। स्रोत को संशोधित करना काफी आसान होना चाहिए ताकि यह हमेशा एन सेकंड के लिए कैप्चर हो और फिर इसे लूप में चलाएं।

+0

कैसे कर आप perf स्क्रिप्ट चलाते हैं? मैंने 'perf रिकॉर्ड-चक्र, निर्देश-सी 10000 -आर एलएस;' 'perf स्क्रिप्ट' चलाने की कोशिश की, लेकिन मुझे ** घातक: कोई event_list! ** त्रुटि नहीं मिली। – Ben

+0

@ स्कीम अजीब, मेरे लिए सिर्फ 'perf script' काम टाइप कर रहा है। क्या आपके लिए 'perf report' काम करता है, यानी रिकॉर्ड किया गया perf.data फ़ाइल ठीक है? – jpa

+0

बाहर निकलता है मैं perf (2.6) के पुराने संस्करण का उपयोग कर रहा था। जैसा कि आपने ऊपर बताया है perf 3.0.38 काम करता है। जब मैं पर्याप्त प्रतिनिधि हूं तो मैं वापस आऊंगा और आपको ऊपर उठाऊंगा। धन्यवाद! – Ben

0

आप इसे करने के लिए आसानी से perf stat को संशोधित कर सकते हैं।

वास्तव में, मैं एक कच्चे संशोधन को पहले से ही लागू किया है और आप के साथ इस परिवर्तन साझा करने के लिए खुशी होगी .. जो परिवर्तन किए हैं, जबकि भीतर run_perf_stat समारोह में ज्यादातर रहे हैं

(! किया) पाश

करने के लिए लूप के अंदर और समय की अवधि के साथ एक नैनोस्लीप है कि आप उस पर्फ़ प्रिंट बनाना चाहिए

पर नमूने के लिए इच्छा के लिए नींद बदल;

बस लाइनों, जबकि नीचे {नींद (1)} के लिए कदम (किया!) STDOUT (या STDERR) पर आउटपुट

आप इन मूल्यों को स्टोर करने के लिए चाहते हैं, तो मैं तुम्हें, प्रकार struct आँकड़ों का एक 2-आयामी सरणी बनाए गए प्रत्येक नमूना के साथ इस को अद्यतन करने और एक फाइल करने के लिए समय-समय पर लिखने का सुझाव

4

अच्छी खबर: अगले गिरी (लिनक्स 3.9) में, नियमित समय अंतराल पर ईवेंट डेल्टा प्रिंट करने के लिए perf stat के पास -I msecs विकल्प होगा।

https://patchwork.kernel.org/patch/2004891/

$ perf stat -I 1000 -e cycles noploop 10 
noploop for 10 seconds 
1.000086918   2385155642 cycles     # 0.000 GHz 
2.000267937   2392279774 cycles     # 0.000 GHz 
3.000385400   2390971450 cycles     # 0.000 GHz 
4.000504408   2390996752 cycles     # 0.000 GHz 
5.000626878   2390853097 cycles     # 0.000 GHz 

http://man7.org/linux/man-pages/man1/perf-stat.1.html

-I msecs, --interval-print msecs 

प्रिंट गिनती डेल्टा हर एन मिलीसेकंड (न्यूनतम: 10ms)

+0

सिर के लिए धन्यवाद। – Ben

+0

विकल्प 1 सेकंड प्रिंटिंग के लिए '-I 1000' है: http://man7.org/linux/man-pages/man1/perf-stat.1.html -' -I msecs, --interval-print msecs' "प्रत्येक एन मिलीसेकंड (न्यूनतम: 10 मिमी)" गिनती प्रिंट करें – osgx

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

  • कोई संबंधित समस्या नहीं^_^