什么是gperftools
一个优化的内存管理算法—tcmalloc性能优于malloc。
一个用于CPU profile的工具,用于检测程序的性能热点,这个功能和gprof类似。
一个用于堆检查工具,用于检测程序在是够有内存泄露,这个功能和valgrind类似。
一个用于Heap profile的工具,用于监控程序在执行过程的内存使用情况。
如何安装
代码:https://github.com/gperftools/gperftools
git clone https://github.com/gperftools/gperftools.git
sh autogen.sh
./configure
make
sudo make install
使用HeapProfiler方法定位内存泄漏
1) Link your executable with -ltcmalloc 2) Run your executable with the HEAPPROFILE environment var set: $ HEAPPROFILE=/tmp/heapprof <path/to/binary> [binary args] 3) Run pprof to analyze the heap usage $ pprof <path/to/binary> /tmp/heapprof.0045.heap # run 'ls' to see options $ pprof --gv <path/to/binary> /tmp/heapprof.0045.heap
也可以使用LD_PRELOAD方法,以freeswitch为例子。
LD_PRELOAD="/usr/local/lib/libtcmalloc.so" HEAPCHECK=normal HEAP_PROFILE_ALLOCATION_INTERVAL=104857600 HEAPPROFILE="/home/vv/log/freeswitch.log" /usr/local/freeswitch/bin/freeswitch -nonat
注:HEAPPROFILE指定生成dump文件的位置
HEAP_PROFILE_ALLOCATION_INTERVAL,程序内存每增长这一数值之后就dump 一次内存
等程序运行一段时间后,在/home/vv/log下会生成heap文件即freeswitch的内存镜像。
再用pprof命令生成pdf,查看内存泄漏的路径:
pprof --pdf --base freeswitch.log.0046.heap /usr/local/freeswitch/bin/freeswitch freeswitch.log.0102.heap > diff.46.102.pdf
生成的结果如下:
Total MB: 43.5,代表一共增长了43.5M内存
主要泄漏的线程是su_pthread_port_clone_main,占了93.9%
注:图片太小的化可以把网页放大来看