2010-03-15 13 views
12

लघु संस्करण:लिनक्स समय नमूना आधारित प्रोफाइलर

वहाँ लिनक्स के लिए एक अच्छा समय आधारित नमूना प्रोफाइलर है?

लंबे संस्करण:

मैं आम तौर पर OProfile का उपयोग अपने आवेदन पत्र का अनुकूलन करने के। मुझे हाल ही में एक कमी मिली जो मुझे आश्चर्यचकित कर रही है।

समस्या एक कसौटी लूप थी, सी ++ नाम को ध्वस्त करने के लिए C++ filt spawning था। एक और बाधा का पीछा करते हुए मैं केवल दुर्घटना से कोड पर ठोकर खाई। OProfile ने कोड के बारे में कुछ भी असामान्य नहीं दिखाया, इसलिए मैंने इसे लगभग अनदेखा कर दिया लेकिन मेरे कोड की भावना ने मुझे कॉल को अनुकूलित करने और क्या हुआ यह देखने के लिए कहा। मैंने popen सी ++ फिल्ट के abi::__cxa_demangle में बदल दिया। रनटाइम एक मिनट से थोड़ा अधिक समय तक थोड़ा सा हो गया। एक x60 गति के बारे में।

क्या कोई तरीका है जिसे मैं popen कॉल को ध्वजांकित करने के लिए OProfile कॉन्फ़िगर कर सकता था? चूंकि प्रोफाइल डेटा अब बैठता है ओप्रोफाइल सोचता है कि बोतल की गर्दन ढेर थी और std::string कॉल (जिसे बीटीडब्ल्यू ने एक बार ऑप्टिमाइज़ किया था, रनटाइम को एक सेकंड से भी कम, x2 गति से अधिक) को छोड़ दिया था।

$ sudo opcontrol --status 
Daemon not running 
Event 0: CPU_CLK_UNHALTED:90000:0:1:1 
Separate options: library 
vmlinux file: none 
Image filter: /path/to/executable 
Call-graph depth: 7 
Buffer size: 65536 

वहाँ कि टोंटी मिल सकता था लिनक्स के लिए एक और प्रोफाइलर है:

यहाँ मेरी OProfile विन्यास है?

मुझे संदेह है कि समस्या यह है कि OProfile केवल वर्तमान में चल रहे प्रक्रिया में इसके नमूने लॉग करता है। मैं चाहता हूं कि मैं हमेशा प्रक्रिया के लिए अपने नमूने लॉग इन करूं। इसलिए यदि प्रक्रिया वर्तमान में स्विच हो गई है (आईओ या popen कॉल पर अवरुद्ध) OProfile केवल अपने नमूना को अवरुद्ध कॉल पर रखेगा।

यदि मैं इसे ठीक नहीं कर सकता, तो OProfile केवल तब उपयोगी होगा जब निष्पादन योग्य 100% CPU के करीब धक्का दे रहा हो। यह उन निष्पादन योग्यताओं में सहायता नहीं कर सकता है जिनमें अक्षम अक्षम कॉल हैं।

उत्तर

6

खुशी आपने पूछा। मेरा मानना ​​है कि ओप्राफाइल को सही चीज़ पर विचार करने के लिए बनाया जा सकता है, जो वॉल-घड़ी के समय पर स्टैक नमूने लेना है जब प्रोग्राम धीमा हो रहा है और, यदि यह आपको कम से कम व्यक्तिगत स्टैक नमूने की जांच करने नहीं देगा नमूनों पर दिखाई देने वाले कोड की प्रत्येक पंक्ति के लिए संक्षेप में, नमूने का प्रतिशत रेखा दिखाई देता है। यह प्रत्यक्ष है कि उस पंक्ति को वहां सहेजने के उपाय को बचाया जाएगा। Here's one discussion.Here's another, और another। और, जैसे पौलुस ने कहा, ज़ूम इसे करना चाहिए।

यदि आपका समय 60 सेकेंड से 1 सेकेंड तक चला गया, तो इसका तात्पर्य है कि प्रत्येक एकल स्टैक नमूना में आपको समस्या दिखाने की 59/60 संभावना होगी।

+1

माइक अपनी बात, बहुत मान्य है, मैं 100% के साथ तकनीक से सहमत हूं। OProfile के माध्यम से समय आधारित नमूनाकरण या डीबगर में तोड़ने की तुलना में अधिक स्वचालित दृष्टिकोण में किसी भी विचार को कैसे सक्षम किया जाए? –

+0

@ कैस्पिन: मैं विंडोज़ पर हूं, और मैं ओप्रोफाइल का उपयोगकर्ता नहीं हूं, लेकिन यह लिंक (http://oprofile.sourceforge.net/doc/opreport.html) स्टैक नमूना डेटा के उपयोग और प्रस्तुति के बारे में बात करता है । इसके अलावा यह लिंक (http://oprofile.sourceforge.net/doc/detailed-parameters.html#timer) टाइमर इंटरप्ट्स के बारे में बात करता है। मैं यह नहीं बता सकता कि यह आई/ओ या अन्य अवरुद्ध कॉल के दौरान नमूने लेगा या नहीं। –

+0

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

3

Zoom आज़माएं - मुझे विश्वास है कि यह आपको सभी प्रक्रियाओं को प्रोफाइल करने देगा - यह जानना दिलचस्प होगा कि यह इस मामले में आपकी समस्या को हाइलाइट करता है या नहीं। http://vi-server.org/vi/simple_sampling_profiler.html

यह SIGUSR1 पर एक फ़ाइल में backtrace(3) जोड़ देती है, और उसके बाद एनोटेट स्रोत में बदल देता है:

+0

ज़ूम संस्करण 1.6.6 या तो समस्या नहीं मिलती है। ज़ूम के अगले संस्करण में नमूना मोड (* "थ्रेड टाइम प्रोफाइलिंग" *) होगा जो समस्या को पा सकता है। –

1

जल्दी लिनक्स के लिए तुच्छ नमूना प्रोफाइलर हैक की गई।

+0

lsstack पर एक नज़र डालें लागू किया गया है। वर्तमान बैकट्रैक प्राप्त करने के लिए इसे विशेष ड्राइवर कोड की आवश्यकता नहीं है। अपने कोड को बिटबकेट या Google कोड पर भी डालें। यदि आप एक निर्णायक परियोजना प्राप्त करते हैं तो मैं इसका उपयोग करते हुए बग फिक्स का योगदान दूंगा। –

+0

@caspin, ठीक है, अब मैं एक ही काम करने के लिए gdb (http://stackoverflow.com/questions/3999464/how-to-make-gdb-get-stacktrace-repeatably) का उपयोग करने के तरीके को देख रहा हूं। –

+0

मैंने आपके कोड की कोशिश की, लेकिन यह लटकता है, क्योंकि आप एक सिग्नल हैंडलर से फॉपेन का उपयोग कर रहे हैं, जिसे लटकने के लिए जाना जाता है (आप केवल सिग्नल हैंडलर से बहुत कम फ़ंक्शंस का उपयोग कर सकते हैं)। –

2

मैं इस एक लंबे समय पहले लिखा था, सिर्फ इसलिए कि मैं बेहतर कुछ भी नहीं मिला: https://github.com/dicej/profile

मैं सिर्फ यह भी हालांकि मैं इसे करने की कोशिश नहीं की है पाया,: https://github.com/oliver/ptrace-sampler

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