在阅读reids源码时发现redis在自身内存管理malloc/frees的时候使用到tcmalloc,google后发现此组件竟然出自google开源的gperftools性能分析工具集,然后发现许多大虾云云基于tcmalloc提升mysql等等组件的性能,带着好奇心开始接触此工具。由于初次接触,此篇文章仅介绍gperftools和简单使用gperftools,深入阅读理解待续...
一、gperftools介绍
gperftools是Google开源的一款非常使用的性能分析工具集。主要由四个组件组成:
1、Tcmalloc内存分析器
Tcmalloc是Thread Cache malloc的缩写,号称比ptmalloc2更快的内存管理库。
Tcmalloc原理是为每个线程单独分配一个线程本地的Cache,少量的地址分配就直接从Cache中分配,并且定期做垃圾回收,将线程本地Cache中的空闲内存返回给全局控制堆;Tcmalloc认为小于等于32K的对象是小对象,大对象直接从全局控制堆以页为单位进行分配,所以大对象总是页对齐的;Tcmalloc中一个页可以存入一些相同大小的小对象,小对象从本地内存链表中分配,大对象从中心内存堆分配[1]。
优势:
1)快速:相比ptmalloc2,Tcmalloc的性能城北提升。尤其是Tcmalloc可以减少多线程之间锁的竞争问题,在小对象(32K)上能达到零竞争。
2)占用空间小:相比ptmalloc2,tcmalloc对小对象占用空间进行了优化。例如:分配N个8字节对象只需要占用8N*1.01字节的空间。即,只需要多使用1%的空间。而ptmalloc2中每个对象都需要使用一个4字节的头信息,最后占用的字节可能达到8N*8。
3)不易出现内存暴涨(ptmalloc2使用内存池,长时间没有将内存还给系统就会造成内存暴涨,tcmalloc可以通过MallocExtension::instance()->ReleaseFreeMemory()类设置内存还给系统的速度)。
2、Heap-profiler
Heap-profiler是内存监控器,可以随时知道内存的使用情况[2]。
3、Heap-checker
Heap-checker是专门检测内存泄漏的工具
4、Cpu-profiler
Cpu-profiler主要是通过采样的的方式,给出一段时间内程序实际占用cpu时间偏进行统计和分析。
二、安装
git clone https://github.com/gperftools/gperftools.git
./autogen.sh --> ./configure -->make && make install
四、简单使用
1、CPU性能测试
Cpu-profiler工具使用很简单,包括以下步骤:
1)编译目标程序,包含<google/profilter.h>或<gperftools/profiler.h>
2)运行目标程序,在需要进行分析的代码前后分别加上ProfilerStart()和ProfilerStop();
3)运行剖析结果转换:使用pprof工具将分析结果转换成某种可读格式的文档。
2、Tcmalloc与 ptmalloc2 性能对比
测试代码(new 100*10000个X KB字节的空间的耗时):代码并无区别,仅编译选项不同,ptmalloc2 模式下编译时无需添加-ltcmalloc,tcmalloc模式下编译时需要添加-ltcmalloc
结果对比:
单线程小对象 单线程大对象 五个线程小对象 五个线程大对象
tcmalloc 0.58s 0.69s 2.57s 7.29s
ptmalloc2 2.02s 2.14s 19.93s 20.80s
标签:ptmalloc2,对象,内存,测试工具,gperftools,tcmalloc,cpu,Tcmalloc From: https://www.cnblogs.com/peifx/p/17197432.html