2013-08-22 6 views
7

문서, http://gperftools.googlecode.com/svn/trunk/doc/cpuprofile.html에 따르면, CPU 프로파일은 멀티 프로세스를 지원 않으며 독립적 인 출력 파일을 생성합니다 프로그램 포크 경우, 아이들도 프로파일됩니다gperftools cpu profiler는 다중 프로세스를 지원하지 않습니까?

(그들은 같은 CPUPROFILE 설정을 상속 이후) . 각 프로세스의 프로파일은 입니다. 하위 프로파일을 상위 프로파일 과 구별하기 위해 모든 하위 프로세스 ID는 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; 
} 

// 메이크

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를 사용하여 자신을 등록한다 자세한 내용은 HereHere의 두 가지 문제에서 확인할 수 있습니다.

여기 코드 예제는 포크가 registered 일 수있는 테스트 케이스와 유사합니다.

+0


답변 주셔서 감사합니다. 코드 예제를 추가 할 수 있습니까? – osgx

0

나는 현재 gperftools을 사용하여 mpi 프로그램을 프로파일 링하고이 문제를 해결합니다. 검색 후 모든 서브 프로세스가 실행될 때마다 ProfilerStart(_YOUR_PROF_FILE_NAME_)ProfilerStop()을 호출해야하며 _YOUR_PRO_FILE_NAME_은 다른 프로세스에서 달라야한다는 것을 알게되었습니다. 그런 다음 모든 프로세스의 성능을 분석 할 수 있습니다. (또한 ZRJ에 의해 요청)

링크 : https://groups.google.com/forum/#!topic/google-perftools/bmysZILR4ik