2013-08-22 12 views
7

दस्तावेज़, http://gperftools.googlecode.com/svn/trunk/doc/cpuprofile.html के अनुसार, सीपीयू प्रोफाइल बहु प्रक्रिया का समर्थन करता है और स्वतंत्र आउटपुट फ़ाइल उत्पन्न करेगा:gperftools cpu प्रोफाइलर बहु ​​प्रक्रिया का समर्थन नहीं करता है?

यदि आपकी कार्यक्रम कांटे, बच्चों को भी प्रोफाइल की जाएगी (क्योंकि वे एक ही CPUPROFILE सेटिंग को इनहेरिट ) । प्रत्येक प्रक्रिया को अलग से प्रोफाइल किया गया है; मूल प्रोफ़ाइल से बच्चे प्रोफाइल को अलग करने के लिए और एक दूसरे से, सभी बच्चों को उनकी प्रक्रिया-आईडी को को CPUPROFILE नाम में जोड़ा जाएगा।

लेकिन जब मैं इस प्रकार की कोशिश:

// main_cmd_argv.cpp

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <string.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <gperftools/profiler.h> 

int loop(int n) { 
    int sum = 0; 
    for (int i = 0; i < n; i++) { 
     for (int j = 0; j < n; j++) { 
      sum = i + j; 
      if (sum %3 == 0) { 
       sum /= 3; 
      } 
     } 
    } 
    return 0; 
} 

int main(int argc, char* argv[]) { 

    printf("%s\n%s\n", getenv("CPUPROFILE"), getenv("CPUPROFILESIGNAL")); 

    if (argc > 1 && strcmp(argv[1], "-s")==0) { 
     // single process 
     loop(100000); 
     printf("stoped\n"); 
    } else if (argc > 1 && strcmp(argv[1], "-m")==0) { 
     // multi process 
     pid_t pid = fork(); 
     if (pid < 0) { 
      printf("fork error\n"); 
      return -1; 
     } 
     if (pid == 0) {  
      loop(100000); 
      printf("child stoped\n"); 
     } else if (pid > 0) { 
      loop(10000); 
      printf("father stoped\n"); 
      wait(NULL); 
     }   
    } 

    return 0; 
} 

// makefile

GPerfTools=/home/adenzhang/tools/gperftools 

CCFLAGS=-fno-omit-frame-pointer -g -Wall 

ALL_BINS=main_cmd_argv 
all:$(ALL_BINS) 

main_cmd_argv:main_cmd_argv.o 
    g++ $(CCFLAGS) -o [email protected] $^ -L./ -L$(GPerfTools)/lib -Wl,-Bdynamic -lprofiler -lunwind 

.cpp.o: 
    g++ $(CCFLAGS) -c -I./ -I$(GPerfTools)/include -fPIC -o [email protected] $< 
clean: 
    rm -f $(ALL_BINS) *.o *.prof 

// शेल कमांड

$ make 
g++ -fno-omit-frame-pointer -g -Wall -c -I./ -I/home/adenzhang/tools/gperftools/include -fPIC -o main_cmd_argv.o main_cmd_argv.cpp 
g++ -fno-omit-frame-pointer -g -Wall -o main_cmd_argv main_cmd_argv.o -L./ -L/home/adenzhang/tools/gperftools/lib -Wl,-Bdynamic -lprofiler -lunwind 
$ env CPUPROFILE=main_cmd_argv.prof ./main_cmd_argv -s 
젩n_cmd_argv.prof 
(null) 
stoped 
PROFILE: interrupts/evictions/bytes = 6686/3564/228416 
$ /home/adenzhang/tools/gperftools/bin/pprof --text ./main_cmd_argv ./main_cmd_argv.prof 
Using local file ./main_cmd_argv. 
Using local file ./main_cmd_argv.prof. 
Removing killpg from all stack traces. 
Total: 6686 samples 
    6686 100.0% 100.0%  6686 100.0% loop 
     0 0.0% 100.0%  6686 100.0% __libc_start_main 
     0 0.0% 100.0%  6686 100.0% _start 
     0 0.0% 100.0%  6686 100.0% main 
$ rm main_cmd_argv.prof 
$ env CPUPROFILE=main_cmd_argv.prof ./main_cmd_argv -m 
젩n_cmd_argv.prof 
(null) 
father stoped 
child stoped 
PROFILE: interrupts/evictions/bytes = 0/0/64 
PROFILE: interrupts/evictions/bytes = 68/36/2624 
$ ls 
main_cmd_argv main_cmd_argv.cpp main_cmd_argv.o main_cmd_argv.prof Makefile 
$ /home/adenzhang/tools/gperftools/bin/pprof --text ./main_cmd_argv ./main_cmd_argv.prof 
Using local file ./main_cmd_argv. 
Using local file ./main_cmd_argv.prof. 
$ 

यह अर्द्ध है कि gperf बहु प्रक्रिया का समर्थन नहीं करता है, क्या कोई भी कृपया समझा सकता है? धन्यवाद!

उत्तर

3

यदि आप एक जवाब या नहीं मिला काफी पुराना है, पता नहीं है, लेकिन ...

हर धागे की तरह लगता है/कांटा रूप से पंजीकृत चाहिए ProfilerRegisterThread का उपयोग कर(); आप उन दो मुद्दों में अधिक जानकारी प्राप्त कर सकते हैं: Here और Here

यह भी एक उदाहरण कोड है, आपके परीक्षण मामले के समान जहां फोर्क registered हो सकता है।

+0

जवाब के लिए धन्यवाद। क्या आप इसमें कुछ कोड उदाहरण जोड़ सकते हैं? – osgx

0

मैं वर्तमान में एक एमपीआई प्रोग्राम प्रोफाइल करने के लिए gperftools का उपयोग कर रहा हूं और इस समस्या को पूरा करता हूं। Googling के बाद मुझे लगता है कि ProfilerStart(_YOUR_PROF_FILE_NAME_) और ProfilerStop() प्रत्येक उप-प्रक्रिया के दौरान बुलाया जाना चाहिए, और _YOUR_PRO_FILE_NAME_ विभिन्न प्रक्रियाओं के बीच अलग होना चाहिए। फिर आप हर प्रक्रिया के विश्लेषण प्रदर्शन कर सकते हैं।

लिंक (भी ZRJ ने पूछा):
https://groups.google.com/forum/#!topic/google-perftools/bmysZILR4ik

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