tcmalloc的使用问题

我在使用cpu-profiler时,出了一点问题,这里记录一下。

tcmalloc能用作内存池,优化malloc和线程分配内存的效率。它是gperftools的一员,gperftools还提供了heap-checker,heap-profiler和cpu-profiler三个工具。

源码下载:
https://github.com/gperftools/gperftools

编译完后就可以使用tcmalloc库了:
-ltcmalloc
-ltcmalloc_minimal //不支持heap-profiler和heap-checker,只需要内存池需要减少进程大小。

其用法参考源码docs/目录下的同名html文件的使用说明即可。

问题:

根据cpuprofile.html的说明,cpu-profile的用法有三种:

  1. 无需修改程序,直接链接libtcmalloc_and_profile.so。运行前指明CPUPROFILE文件路径。程序结束后产生profile数据文件。
  2. 可以用信号来触发开始和结束监控。CPUPROFILESIGNAL=signo,signo不能被占用。
  3. 在程序里调用ProfilerStart()和ProfilerStop(),来指定要监控的代码段。

上面三种方式,最终都会产生profile文件,然后通过pprof分析。

前两种方式我没试出来(没有产生profile文件),因为tcmalloc源码中使用了单例对象来初始化和启动profile routine,由于程序没有显式调用tcmalloc的接口,所有libtcmalloc_and_profile.so并不会被加载,所以这个对象没有被初始化。
解决方法可以改改源码,主动调用库中的一个函数,或者参考heapprofile的实现方式,在ctor/dtor中调用ProfilerStart()和ProfilerStop()。

你可能感兴趣的:(Linux编程,开源工具)