2010-05-10 6 views
7

मेरी समझ यह है कि डिफ़ॉल्ट gprof खाते में सीपीयू समय लेता है। क्या दीवार घड़ी के समय के आधार पर प्रोफ़ाइल प्राप्त करने का कोई तरीका है?दीवार घड़ी के आधार पर प्रोफ़ाइल के लिए gprof प्राप्त करें?

मेरा प्रोग्राम बहुत सी डिस्क I/o करता है, इसलिए CPU समय का उपयोग केवल वास्तविक निष्पादन समय के एक अंश का प्रतिनिधित्व करता है। मुझे पता होना चाहिए कि डिस्क के कौन से भाग सबसे अधिक समय लेते हैं I

+3

शायद आप इसके लिए gprof के अलावा कुछ और चाहते हैं। – WhirlWind

+1

उदाहरण के लिए क्या पसंद है? – jetwolf

+1

अपने वास्तुकला के आधार पर, dtrace पर एक नज़र डालें। – WhirlWind

उत्तर

1

gprof ऐसा नहीं करेगा। देखें at this

And this.

संक्षेप में: gdb के तहत, चल इसे पाने और यादृच्छिक पर Ctrl-तोड़ या Ctrl-C 10 बार करते हैं, और कॉल स्टैक प्रदर्शित करते हैं। यदि आपका I/O ले रहा है (उदाहरण के लिए) 60% समय, फिर (लगभग) 10 विरामों में से 6 पर, आप इसे writebuf या readbuf routine में देखेंगे, और कोड की लाइनें अनुरोध करेंगे कि I/O ढेर पर स्पष्ट रूप से प्रदर्शित किया जाना चाहिए।

आप एक ही जानकारी प्राप्त करने के लिए lsstack का भी उपयोग कर सकते हैं।

+0

हम्म ... क्या यह विधि बहुत सांख्यिकीय रूप से गलत नहीं होगी? क्या ऐसा करने का एक स्वचालित तरीका है, जो 10 से अधिक नमूनों को लेता है, 1000 नमूने कहता है, लेकिन समान अंतराल पर, और फिर रिपोर्ट करता है कि कौन से कार्यों का सामना करना पड़ता था? – jetwolf

+0

@ जेटवॉल्फ: ज़ूम एक प्रोफाइलर का एक उदाहरण है जो इसे 10^3 नमूने के साथ करता है, लेकिन पहले लिंक, विशेष रूप से आइटम 5, 2, 7, और 9। –

+0

@ जेटवॉल्फ: उदाहरण: मान लीजिए I/O बिल्कुल 60 है %। इसे दिखाने के लिए नमूनों की संख्या का मानक विचलन एसक्यूआरटी (एनएफ (1-एफ)) है। 1000 के लिए +/- 1.55, 10 नमूनों के लिए, यह 15.5 है। तो 10 नमूनों में आप इसे लगभग 4.45 - 7.55 बार देखेंगे। 1000 नमूनों में आप इसे लगभग 584.5 - 615.5 बार देखेंगे। किसी भी तरह से, आप देखेंगे कि इसका क्या कारण है, इसलिए यह ठीक करने योग्य है, तो आप इसे ठीक कर सकते हैं। –

1

आप कोड को ठीक से प्रोफाइल करने के लिए स्ट्रेस या कैशग्रींड का उपयोग कर सकते हैं। स्ट्रेस आपको सिस्टम कॉल में बिताए गए समय का ब्योरा देगा और कैशग्रींड संसाधन उपयोग के विस्तृत विश्लेषण देगा।

0

दीवार-घड़ी प्रोफाइलिंग करने के लिए gprof को बदलना बहुत आसान है। केवल 8 को बदलने के लिए वर्ण हैं:

ITIMER_PROF -> ITIMER_REAL 

SIGPROF -> SIGALRM 
फ़ाइल glibc/sysdeps/posix/profil.c में

, __profil कार्य करते है, setitimer और sigaction (अधिक सटीक __Setitimer और __sigaction)

परिवर्तन किसी भी प्रोग्राम है जो SIGALRM का उपयोग करता है के बाद करने के लिए कॉल के पास टूटा जा सकता है और कोई भी प्रोग्राम जिसमें ब्लॉकिंग-सिस्कल पुनरारंभ कोड नहीं है, गलत परिणाम दे सकता है।

इसके अलावा, आप सीधे glibc बाइनरी में पूर्णांक मूल्यों को बदल सकते (कृपया, प्रणाली विस्तृत libc.so पर ऐसा नहीं है, एक अलग प्रतिलिपि बनाने के लिए और यह LD_LIBRARY_PATH साथ कार्यक्रम के लिए दे)

द्विआधारी पैच के लिए, ITIMER_PROF 2 है ; ITIMER_REAL 0 है; SIGPROF 27 (0x1b) है; SIGALRM 14 (0x0e) है। Glibc के profil फ़ंक्शन में प्रत्येक निरंतर के लिए दो स्थान हैं।

एक और तरीका एक पट्टा-डीबगर लिखना है, जो रनटाइम पर सेटिटिमर और सिग्नेक्शन कार्यों के तर्कों को बदल देगा।

+0

दुर्भाग्य से, एक libc बाइनरी बदलने के बाद, यह दृष्टिकोण विफल रहा। टाइमर और सिग्नल बदल दिए जाते हैं, लेकिन .. 'प्रोफाइल() '(जिसे' -pg' द्वारा सक्रिय किया जाता है, जीएम द्वारा उपयोग किया जाता है) गतिशील पुस्तकालयों को प्रोफ़ाइल नहीं कर सकता (जहां अधिकांश अवरुद्ध कार्य रहते हैं)। इसके अलावा, सिग्नल हैंडलर से सिग्नल हैंडलर से देखा जाने वाला 'ईआईपी' सक्रिय है, गतिशील libs के लिए गलत है (glibc में अंक, लेकिन सिस्कल रैपर में नहीं) और स्थिर लिंक के लिए न्यूल है। उस लिंक पर – osgx

4

आप google-perftools से profiler का उपयोग करके दीवार घड़ी का समय माप सकते हैं। Google प्रोफाइलर को वॉल-घड़ी मोड में स्विच करने के लिए, पर्यावरण चर CPUPROFILE_REALTIME = 1 सेट करें।

+0

404। क्या आप इसे अपडेट कर सकते हैं? –

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