yum install libtool (生成makefile用)
yum install graphviz (生成pdf用)
下载gperftools:
http://code.google.com/p/gperftools/downloads/list
./configure && make -j8 && make install
下载libunwind:
http://download.savannah.gnu.org/releases/libunwind/
./configure && make -j8 && make install
如果不安装libunwind库,就在安装gperftools的时候 enable-frame-pointers,
并且在编译应用程序的时候加上 -fno-omit-frame-pointer
echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig
ldconfig
包含头文件:#include <gperftools/profiler.h>
开始检测:ProfilerStart("fileName.prof
");
线程入口:ProfilerRegisterThread();
停止检测:ProfilerStop();
依赖两个库:-lprofiler -lunwind
pprof --pdf ./test fileName.prof > test.pdf
非侵入式使用方法:
pprof可以在不修改源码的情况下,通过在编译时链接profiler库,程序启动前设置特定的环境变量来开启CPU剖析功能。
在程序编译时链接
profiler
编写启动脚本:
#!/bin/sh
echo "start CPU profile"
env CPUPROFILE=example.prof ./example
exit 1
echo "start CPU profile"
env CPUPROFILE=example.prof ./example
exit 1
编写展示脚本:
echo "display CPU profile in pdf"
pprof --pdf ./ example example.prof > example.pdf
exit 1
pprof --pdf ./ example example.prof > example.pdf
exit 1
注意:
gperftools需要程序正常退出才能向prof文件打印数据,所以当程序无法退出时,得要发送信号给进程,
在接到信号后,调用ProfilerStop();函数,才能打印出数据。如下所示:
void signal_handler(int signo)
{
signal(signo, signal_handler);
INFO_LOG("recv signal[%d]", signo);
switch(signo)
{
case SIGTERM:
//程序自己退出,或shell里调用kill缺省该进程。该信号可以被阻塞,或被处理
//可以在这里做一些程序退出前的最后处理工作
ProfilerStop();
INFO_LOG("Process recieve SIGTERM");
break;
}
exit(0);
}
//主函数
signal(SIGTERM, &signal_handler);
gperftools需要程序正常退出才能向prof文件打印数据,所以当程序无法退出时,得要发送信号给进程,
在接到信号后,调用ProfilerStop();函数,才能打印出数据。如下所示:
void signal_handler(int signo)
{
signal(signo, signal_handler);
INFO_LOG("recv signal[%d]", signo);
switch(signo)
{
case SIGTERM:
//程序自己退出,或shell里调用kill缺省该进程。该信号可以被阻塞,或被处理
//可以在这里做一些程序退出前的最后处理工作
ProfilerStop();
INFO_LOG("Process recieve SIGTERM");
break;
}
exit(0);
}
//主函数
signal(SIGTERM, &signal_handler);