2013-08-22 28 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 

// shell命令

$ 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