gperftools cpu profiler不支持多进程?
问题描述:
根据该文件,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不支持多进程,请问谁能解释一下?谢谢!
答
很老了,不知道你是否找到了答案或没有,但...
好像每一个线程/叉应使用ProfilerRegisterThread(注册本身); 您可以在这两个问题中找到更多信息:Here和Here。
此处还有一个示例代码,类似于您的测试案例,其中叉可以是registered。
答
我目前使用gperftools
来剖析mpi程序并遇到此问题。谷歌搜索后我发现ProfilerStart(_YOUR_PROF_FILE_NAME_)
和ProfilerStop()
应该在每个子进程执行期间调用,并且_YOUR_PRO_FILE_NAME_
必须在不同进程间有所不同。然后你可以分析每个过程的表现。
链接(也由ZRJ问):
https://groups.google.com/forum/#!topic/google-perftools/bmysZILR4ik
谢谢你的回答。你可以添加一些代码示例吗? – osgx