TCMalloc 安装和使用

  • Author:Echo Chen(陈斌)
  • Email:[email protected]
  • Blog:Blog.csdn.net/chen19870707
  • Date:October 20th, 2014

    前面三篇译文《TCMalloc:线程缓冲的Malloc》、《使用TCMalloc的堆栈检查》、《使用TCMalloc进行堆栈分析》介绍了TCMalloc的基本原理,以及堆栈分析和检查工具,TCMalloc优点很多,比glibc
    2.3的malloc快、自带的堆栈工具可以轻松找出内存瓶颈和内存泄漏,给服务器开发指明了一条新的道路。

    一、下载

    google-perftools:http://code.google.com/p/google-perftools/gperftools-2.1.tar.gz

    libunwind:http://download.savannah.gnu.org/releases/libunwind/libunwind-1.1.tar.gz

    二、libunwind安装

    64位操作系统请先安装 libunwind库,32位操作系统不要安装。libunwind库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API。

       1: #tar zxvf libunwind-1.1.tar.gz
       2: #cd libunwind-1.1
       3: #./configure
       4: #make
       5: #make install

    三、安装google-perftools:

       1: #tar zxvf tar zxvf gperftools-2.1.tar.gz 
       2: #cd gperftools-2.1
       3: #./configure
       4: #make
       5: #make install

    四、TCMalloc库加载到Linux系统中:

       1: echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
       2: /sbin/ldconfig

    五、使用

    在Makefile中 添加TCMalloc链接,注意:这里为了进行内存泄漏分析,一定要将TCMalloc链接在最后,官方文档里说:堆栈检查器可能误解列在它后面的链接库的一些内存。

       1: # funshion wuhan game studio
       2: # Created by zeng jun fei in 2013-08-08
       3:  
       4: CXX = g++
       5: # debug
       6: CXXFLAGS =  -g -I../BaseCode -I../../CommonSrc -Wall -D_POSIX_MT_ -O0
       7: CXXLFLAGS =  -g -Wall -L../bin -lBaseCode -lpthread  -lprotobuf -rdynamic -ltcmalloc
       8:  
       9: # release
      10: # CXXFLAGS =  -O3 -g -I../NetworkEngine -Wall
      11: # CXXLFLAGS =  -O3 -g -Wall -L../NetworkEngine -lnetwork
      12:  
      13: LIB_NETWORK = ../bin/libBaseCode.a
      14:  
      15: OBJS = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
      16: SRCS = $(OBJS:%.o=%.cpp)
      17: DEPS = $(OBJS:%.o=%.d)
      18:  
      19: ALL_TARGETS = ../bin/GateServer
      20:  
      21: all: $(ALL_TARGETS)
      22:  
      23: -include $(DEPS)
      24: $(DEPS): %.d: %.cpp
      25:     @$(CXX) -MM $(CXXFLAGS) $< > [email protected]$$$$; sed ‘s,\($*\)\.o[ :]*,\1.o [email protected] : ,g‘ < [email protected]$$$$ > [email protected]; rm -f [email protected]$$$$
      26:  
      27: $(OBJS): %.o: %.cpp
      28:     $(CXX) -c $(CXXFLAGS) $< -o [email protected]
      29:  
      30: $(ALL_TARGETS): $(OBJS) $(LIB_NETWORK)
      31:     $(CXX) $(OBJS) -o [email protected] $(CXXLFLAGS)
      32:  
      33: clean:
      34:     @rm -rf $(OBJS) $(ALL_TARGETS) *.d
      35:  

    六、堆栈检查和分析

    首先,设置pperf的环境变量:export PPROF_PATH=/usr/local/bin/pprof

    测试代码:

       1: #include <iostream>
       2: using namespace std;
       3:  
       4: int main()
       5: {
       6:         int *p = new int();
       7:         return 0;
       8: }

    编译:g++ main.cpp -o main -ltcmalloc -g -O0

    内存泄漏检查:   env HEAPCHECK=normal ./main

    结果:


    WARNING: Perftools heap leak checker is active -- Performance may suffer

    Have memory regions w/o callers: might report false leaks

    Leak check _main_ detected leaks of 4 bytes in 1 objects

    The 1 largest leaks:

    Using local file ./main.

    Leak of 4 bytes in 1 objects allocated from:

    @ 4007a6 main

    @ 7f1734263d1d __libc_start_main

    @ 4006d9 _start

    If the preceding stack traces are not enough to find the leaks, try running THIS shell command:

    pprof ./main "/tmp/main.54616._main_-end.heap" --inuse_objects --lines --heapcheck  --edgefraction=1e-10 --nodefraction=1e-10 --gv

    If you are still puzzled about why the leaks are there, try rerunning this program with HEAP_CHECK_TEST_POINTER_ALIGNMENT=1 and/or with HEAP_CHECK_MAX_POINTER_OFFSET=-1

    If the leak report occurs in a small fraction of runs, try running with TCMALLOC_MAX_FREE_QUEUE_SIZE of few hundred MB or with TCMALLOC_RECLAIM_MEMORY=false, it might help find leaks more repeatably

    Exiting with error code (instead of crashing) because of whole-program memory leaks

    上面的报告显示有4个字节的内存泄漏,并提示使用pprof进一步跟踪泄漏来源的方法。

    包括normal在内总共有4种泄漏检查方式:minimal,忽略进入main函数之前的初始化过程;normal,报告所有的无法再引用的内存对象;strick,在normal的基础上增加一些额外的检查;draconian,在程序退出的时候存在未释放的内存的情况下报错。

    根据《使用TCMalloc的堆栈检查》,除了前面使用env命令行的全局内存泄漏检查方式外,还可以作对代码段的更加细粒度的泄漏检查。这里需要先在源代码中包含头文件google/heap-checker.h。 实例代码如下:

       1: #include <cstdio>
       2: #include <cstdlib>
       3: #include <cassert>
       4: #include <google/heap-checker.h>
       5: int* fun(int n)
       6: {
       7:     int *p2;
       8:     HeapLeakChecker heap_checker("fun");
       9:     {
      10:         new int[n];
      11:         p2=new int[n];
      12:         //delete [] p1;
      13:     }
      14:     assert(!heap_checker.NoLeaks());
      15:     return p2;    
      16: }
      17: int main(int argc,char* argv[])
      18: {
      19:     int n;
      20:     scanf("%d",&n);
      21:     int *p=fun(n);
      22:     delete [] p;
      23:     return 0;
      24: } 

    此外,还可以忽略某些已知的内存泄漏:

       1: #include 
       2: ...
       3: void *mark = HeapLeakChecker::GetDisableChecksStart();
       4: <leaky code>
       5: HeapLeakChecker::DisableChecksToHereFrom(mark);

    感觉跟valgrind效果差不多,但是valgrind还能查出内存越界,更加优秀。

    七、总结

    本来研究TCMalloc是为了优化游戏服务器,解决游戏服务器后期玩家流失后,占用大量内存的浪费,结果发现由于我们游戏服务器为了防止内存碎片和频繁调用new和delete带来的性能损耗,使用了大量的内存池对象(如装备池、技能池、玩家池),这些池都不会调用delete还给系统,所以即使使用了TCMalloc也不会有内存释放,现在也明白了服务器维护的意义,当然这和服务器框架设计很有关系,如果没有这些缓冲池,直接调用new和delete,TCMalloc会是一个很好的选择。

    -

    Echo Chen:Blog.csdn.net/chen19870707

    -

  • 时间: 2025-01-02 20:04:54

    TCMalloc 安装和使用的相关文章

    针对 MySQL 的 Linux 优化

    1.OS文件系统的选择 使用Linux系统时,应选用 ext4 或 xfs 文件系统,业界资深人士推荐 xfs.查看文件系统方法如下: [[email protected] ~]# df -lhT Filesystem Type Size Used Avail Use% Mounted on /dev/sda2 ext4 62G 2.2G 57G 4% / tmpfs tmpfs 32G 0 32G 0% /dev/shm /dev/sda1 ext3 97M 26M 67M 28% /boot

    CentOS 6 安装最新的 Redis 2.8 ,安装 TCMalloc

    1,遇到的问题就是 redis 2.8 版本依赖 Google 的 TCMalloc TCMalloc(Thread-Caching Malloc)是google开发的开源工具──"google-perftools"中的成员.与标准的glibc库的malloc相比, TCMalloc在内存的分配上效率和速度要高得多,可以在很大程度上提高MySQL服务器在高并发情况下的性能,降低系统负载. 2,安装 TCMalloc 使用rpm 安装,下载 gperftools-libs 进行安装,这个

    TcMalloc的介绍以及Windows下安装使用

    下文转自http://www.cnblogs.com/xsln/p/Introduction_TcMalloc.html 需要注意的问题请直接看最后面. 介绍: TcMalloc(Thread-CachingMalloc)是google-perftools工具中的一个内存管理库,与标准的glibc库中malloc相比,TcMalloc在内存分配的效率和速度上要高很多,可以提升高并发情况下的性能,降低系统的负载. TcMalloc比glibc的malloc具有更高的效率.如在主频为2.84GH的p

    安装tcmalloc

    安装google-perftools:#tar zxvf google-perftools-1.6.tar.gz #cd google-perftools-1.6 #./configure#make#make install 3.运行以下二行命令 echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf/sbin/ldconfig

    centos6.5上安装淘宝tfs系统

    为了安装淘宝tfs文件系统,查了很多资料.若仅参考淘宝的官方文档,那么安装注定失败,因为在官方文档中很多依赖库并没有明确标出. 为了更方便的安装,我这里只写正确的安装过程,错误的解决就不详细描述了. 第一步:gcc降级 centos6.5上如果用yum安装gcc的话,默认是4.4.7版本.若以在gcc4.4.7的基础上安装tfs的话会出现许多莫名其妙的错,最后在网上 甚至搜索不到相关的错误信息.不过我们公司已经有大神安装成功,到时候看他能不能分享一下经验. yum install -y texi

    web站点系列------LNMP1.2的安装

    1 LNMP介绍 主要组件是Linux,Nginx,MySQL,PHP,另外可选有常用缓存组件入acceleraor是通过shell脚本自动安装,主要面向debian系和redhat系 2 LNMP安装 既然是写好的脚本,那安装就很简单了 2.1 下载官方的lnmp1.2-full.tar.gz文件 wget --no-check-certificate https://api.sinas3.com/v1/SAE_lnmp/soft/lnmp1.2-full.tar.gz 2.2 安装步骤 # 

    阿里云centos6.5实践编译安装LNMP架构web环境

    LNMP 代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构. 本次测试需求: **实践centos6.5编译安装 LNMP生产环境 架构 web生产环境 使用 ngx_pagespeed 优化前端 xcache 优化php 用 google_perftools 优化nginx 和 php内存分配 ** 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率. 作为负载均衡服务器:Nginx 既可以在内部直接支持Rail

    TCMalloc 对MYSQL 性能 优化的分析

    虽然经过研究发现TCMalloc不适合我们现有的游戏框架,但意外收获发现TCMalloc可以大幅度提高MYSQL 性能及内存占用,这里给出配置及测试的结果: 1.配置 关于TCMalloc的安装,在<Google perftools 安装手记(TCMalloc)> 一文中已经详细给出,下面给出将TCMalloc配置到MYSQL的步骤: 1.1 修改MySQL启动脚本(依据MySQL安装位置): 1 vi /usr/local/mysql/bin/mysqld_safe 在# executing

    Mint17下安装TFS(taobao file sysytem)(带gcc4.8.2版本)

    最近研究了一下淘宝的分布式文件系统TFS(Taobao file system). TFS(taobao file system)是一个高可扩展.高可用.高性能.面向互联网服务的分布式文件系统,其设计目标是支持海量的非结构化数据的存储:TFS使用C++语言开发,需要运行在64bit Linux OS上,本文介绍如何在Linux环境编译安装TFS. 在安装的过程中,遇到了许多奇葩的问题,在此吐槽一下淘宝的团队真是懒.TFS介绍里面提到他们团队是用的gcc4.1.2进行编译的,高版本可能会报错,不过