2013-08-22 37 views
7

theo tài liệu, http://gperftools.googlecode.com/svn/trunk/doc/cpuprofile.html, các cấu hình CPU không hỗ trợ quá trình đa và sẽ tạo ra file output độc lập:gperftools cpu profiler không hỗ trợ nhiều quá trình?

Nếu dĩa chương trình của bạn, những đứa trẻ cũng sẽ được trình bày sơ (kể từ khi họ kế thừa cài đặt CPUPROFILE giống nhau) . Mỗi quá trình được lược tả riêng biệt ; để phân biệt các cấu hình con từ hồ sơ gốc và với nhau, tất cả trẻ sẽ được gắn thêm mã số của quá trình vào tên CPUPROFILE.

nhưng khi tôi thử như sau:

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

// vỏ lệnh

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

Nó semms rằng gperf không hỗ trợ quá trình đa, bất cứ ai có thể vui lòng giải thích? cảm ơn!

Trả lời

3

Khá cũ, không biết nếu bạn tìm thấy một câu trả lời hay không, nhưng ...

Có vẻ như tất cả các chủ đề/ngã ba nên tự đăng ký sử dụng ProfilerRegisterThread(); Bạn có thể tìm thêm thông tin trong hai vấn đề sau: HereHere.

Ngoài ra, đây là mã ví dụ, tương tự như trường hợp thử nghiệm của bạn, nơi dĩa có thể là registered.

+0

Cảm ơn bạn đã trả lời. Bạn có thể thêm một số ví dụ mã vào nó? – osgx

0

Tôi hiện đang sử dụng gperftools để cấu hình một chương trình mpi và gặp phải vấn đề này. Sau khi googling tôi thấy rằng ProfilerStart(_YOUR_PROF_FILE_NAME_)ProfilerStop() nên được gọi là trong quá trình mỗi tiểu được thực hiện, và _YOUR_PRO_FILE_NAME_ phải khác nhau giữa các quá trình khác nhau. Sau đó, bạn có thể phân tích hiệu suất của mọi quá trình.

liên kết (cũng yêu cầu bởi ZRJ):
https://groups.google.com/forum/#!topic/google-perftools/bmysZILR4ik