2013-08-22 15 views
7

zgodnie z dokumentem, http://gperftools.googlecode.com/svn/trunk/doc/cpuprofile.html profile CPU nie obsługuje wielu procesów i wygeneruje niezależny plik wyjściowy:profiler gperftools cpu nie obsługuje wielu procesów?

Jeżeli swoimi widłami programu, dzieci będą również profilowane (od oni posiądą samo ustawienie CPUPROFILE) . Każdy proces jest osobno profilowany ; aby odróżnić profile podrzędne od profilu nadrzędnego i od siebie nawzajem, wszystkie dzieci będą miały swój identyfikator procesu dodany do nazwy CPUPROFILE.

ale gdy próbuję się następująco:

// 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 

// powłoki poleceń

$ 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. 
$ 

To znaczy, że gperf nie obsługuje wielu procesów, czy ktoś mógłby to wyjaśnić? dzięki!

Odpowiedz

3

dość stary, nie wiem, czy znaleźć odpowiedź, czy nie, ale ...

Wydaje się każdego wątku/widelec powinien zarejestrować się używając ProfilerRegisterThread(); Możesz znaleźć więcej informacji w tych dwóch kwestiach: Here i Here.

Również tutaj znajduje się przykładowy kod, podobny do twojego przypadku testowego, gdzie widły mogą być registered.

+0

Dziękuję za odpowiedź. Czy możesz dodać do niego przykłady kodu? – osgx

0

Obecnie używam gperftools do profilowania programu mpi i napotykam ten problem. Po uruchomieniu go, stwierdzam, że powinno być wywoływane podczas wykonywania każdego podprocesu, a _YOUR_PRO_FILE_NAME_ musi być inny w różnych procesach. Następnie możesz przeanalizować wydajność każdego procesu.

Link (również poproszony przez ZRJ):
https://groups.google.com/forum/#!topic/google-perftools/bmysZILR4ik

Powiązane problemy