Google Perftool 使用介绍

Goole perftools工具使用

安装

1. yum 安装

yum install gperftools

2. 源码安装

源码路径:

https://code.google.com/p/google-perftools/

执行命令

./configure
make
make install

 

Heapprofile使用介绍

首先需要把tcmalloc链接到我们需要分析的程序中, 当然我们也可以动态load 这个lib,但是为了简单起见,还是推荐大家链接这个lib到自己的程序中。

链接之后,我们接下来的任务就是得到内存分析的dump文件,我们有两种方法:

    1.    静态dump方法:

        直接定义一个环境变量HEAPPROFILE来指定dumpprofile文件的位置,如:/tmp/test.log,它将会在/tmp/目录下生成很多类似/tmp/test.log.0003.heap文件名的文件

        env HEAPPROFILE="/tmp/test.log" /test/testprog

     2.    动态dump方法:

我们可以调用Google Heap Profiler的API来控制什么时候dump出内存的profiler文件,这样更加灵活,为此,我们必须包含heap-profiler.h这个头文件。

HeapProfilerStart() 用来开始内存分析

HeapProfilerStop().  用来终止内存分析

这样就只会在开始和结束之间产生dump profiler文件。

 

用法

首先需要把tcmalloc链接到我们需要分析的程序中, 当然我们也可以动态load 这个lib,但是为了简单起见,还是推荐大家链接这个lib到自己的程序中。

链接之后,我们接下来的任务就是得到内存分析的dump文件,我们有两种方法:

    1.    静态dump方法:

        直接定义一个环境变量HEAPPROFILE来指定dumpprofile文件的位置,如:/tmp/test.log,它将会在/tmp/目录下生成很多类似/tmp/test.log.0003.heap文件名的文件

        env HEAPPROFILE="/tmp/test.log" /test/testprog

     2.    动态dump方法:

我们可以调用Google Heap Profiler的API来控制什么时候dump出内存的profiler文件,这样更加灵活,为此,我们必须包含heap-profiler.h这个头文件。

HeapProfilerStart() 用来开始内存分析

HeapProfilerStop().  用来终止内存分析

这样就只会在开始和结束之间产生dump profiler文件。

 

 

选项

  • HEAP_PROFILE_ALLOCATION_INTERVAL

程序内存每增长这一数值之后就dump 一次内存,默认是1G (1073741824)

  •  HEAP_PROFILE_INUSE_INTERVAL

程序如果一次性分配内存超过这个数值dump 默认是100K

 

在执行完

env HEAPPROFILE="/tmp/test.log" /test/testprog

预期在/tmp/目录下将产生形如/tmp/test.log.xxxx.heap对应的文件,xxxx将从0000开始不断增长,

如果未能产生文件,有可能是,程序本身并未产生过大的内存,此时文件不一定能产生。所以可以通过配置HEAP_PROFILE_ALLOCATION_INTERVAL,或HEAP_PROFILE_ALLOCATION_INTERVAL的方式来产生heap文件

env HEAPPROFILE="/tmp/test.log"  HEAP_PROFILE_ALLOCATION_INTERVAL=100000 \
HEAP_PROFILE_INUSE_INTERVAL=10000  /test/testprog

如果还未产生即可将这两个参数再设置成更小的值。

 

内存分析

对于已经产生的/tmp/test.log.xxxx.heap文件,可以通过pprof工具进行查看。

 

pprof可产生不同类型的结果,常用的选项可使用—text,及—pdf

pprof —text /test/testprog /tmp/test.log.0000.heap

这个命令将输出形如

501  62.2%  62.2%      714  88.6% RBTree::insert

 84  10.4%  72.6%       84  10.4% RBTree::defaultCmp

 80   9.9%  82.5%      154  19.1% RBTree::nodeCmp

 61   7.6%  90.1%       73   9.1% RBTree::insertFixup

 

对于该输出的,对于每一行的内容说明如下:

序号

说明

1

函数占用内存数(不包含其他函数调用)

2

函数内存占用百分比(不包含其他函数调用)

3

目前为止的百分比(百分比累计值)

4

函数占用总的内存数(包含其他函数调用)

5

函数内存占用百分比(包含其他函数调用)

6

函数名

pprof —text /test/testprog —base /tmp/test.log.0000.heap /tmp/test.log.0001.heap

该方法的输出内容格式是一样的,但是输出的结果是两个snapshot间的差异。

 

pprof —pdf /test/testprog /tmp/test.log.0000.heap

可以输出pdf文件,将可以看到更详细的函数调用关系。

Heap Checker

    堆内存泄漏检测工具。使用简单,先在链接被检查程序的时候用-ltcmalloc选项连接Goolge Perftools的堆内存管理库tcmalloc(tcmalloc会替代C的堆内存管理库),然后每次用命令行“env HEAPCHECK=normal 可执行程序路径”来进行检查

 

 

google-perftools 简介 google-perftools 是一款针对 C/C++ 程序的性能分析工具,它是一个遵守 BSD 协议的开源项目。使用该工具可以对 CPU 时间片、内存等系统资源的分配和使用进行分析,本文将重点介绍如何进行 CPU 时间片的剖析。 google-perftools 对一个程序的 CPU 性能剖析包括以下几个步骤。 1. 编译目标程序,加入对 google-perftools 库的依赖。 2. 运行目标程序,并用某种方式启动 / 终止剖析函数并产生剖析结果。 3. 运行剖结果转换工具,将不可读的结果数据转化成某种格式的文档(例如 pdf,txt,gv 等)。 安装 您可以在 google-perftools 的网站 (http://code.google.com/p/google-perftools/downloads/list) 上下载最新版的安装包。为完成步骤 3 的工作,您还需要一个将剖析结果转化为程序员可读文档的工具,例如 gv(http://www.gnu.org/software/gv/)。 编译与运行 您需要在原有的编译选项中加入对 libprofiler.so 的引用,这样在目标程序运行时会加载工具的动态库。例如本例中作者的系统中,libprofiler.so 安装在"/usr/lib"目录下,所以需要在 makefile 文件中的编译选项加入“-L/usr/lib -lprofiler”。 google-perftools 需要在目标代码的开始和结尾点分别调用剖析模块的启动和终止函数,这样在目标程序运行时就可以对这段时间内程序实际占用的 CPU 时间片进行统计和分析。工具的启动和终止可以采用以下两种方式。 a. 使用调试工具 gdb 在程序中手动运行性能工具的启动 / 终止函数。 gdb 是 Linux 上广泛使用的调试工具,它提供了强大的命令行功能,使我们可以在程序运行时插入断点并在断点处执行其他函数。具体的文档请参照 http://www.gnu.org/software/gdb/,本文中将只对用到的几个基本功能进行简单介绍使用以下几个功能就可以满足我们性能调试的基本需求,具体使用请参见下文示例。 命令 功能 ctrl+c 暂停程序的运行 c 继续程序的运行 b 添加函数断点(参数可以是源代码中的行号或者一个函数名) p 打印某个量的值或者执行一个函数调用 b. 在目标代码中直接加入性能工具函数的调用,该方法就是在程序代码中直接加入调试函数的调用。 两种方式都需要对目标程序重新编译,加入对性能工具的库依赖。对于前者,他的好处是使用比较灵活,但工具的启动和终止依赖于程序员的手动操作,常常需要一些暂停函数(比如休眠 sleep)的支持才能达到控制程序的目的,因此精度可能受到影响。对于后者,它需要对目标代码的进行修改,需要处理函数声明等问题,但得到的结果精度较高,缺点是每次重新设置启动点都需要重新编译,灵活度不高,读者可以根据自己的实际需求采用有效的方式。 示例详解 该程序是一个简单的例子,文中有两处耗时的无用操作,并且二者间有一定的调用关系。 清单 1. 示例程序 void consumeSomeCPUTime1(int input){ int i = 0; input++; while(i++ < 10000){ i--; i++; i--; i++; } }; void consumeSomeCPUTime2(int input){ input++; consumeSomeCPUTime1(input); int i = 0; while(i++ < 10000){ i--; i++; i--; i++; } }; int stupidComputing(int a, int b){ int i = 0; while( i++ < 10000){ consumeSomeCPUTime1(i); } int j = 0; while(j++ < 5000){ consumeSomeCPUTime2(j); } return a+b; }; int smartComputing(int a, int b){ return a+b; }; void main(){ int i = 0; printf("reached the start point of performance bottle neck\n"); sleep(5); //ProfilerStart("CPUProfile"); while( i++ MyProfile.pdf 转换后产生的结果文档如下图。图中的数字和框体的大小代表了的某个函数的运行时间占整个剖析时间的比例。由代码的逻辑可知,stupidComputing,stupidComputing2 都是费时操作并且它们和 consumeSomeCPUTime 存在着一定的调用关系。 图 1. 剖析结果 结束语 本文介绍了一个 Linux 平台上的性能剖析工具 google-perftools,并结合实例向读者展示了如何使用该工具配置、使用及分析性能瓶颈。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值