Tcmalloc优化MySQL内存管理

2014-11-24 17:16:32 · 作者: · 浏览: 0

TCMalloc是什么?


TCMalloc(Thread-Caching Malloc)与标准glibc库的malloc实现一样的功能,但是TCMalloc在效率和速度效率都比标准malloc高很多。TCMalloc是google-perftools工具中的一个(gperftools四个工具分别是:TCMalloc、heap-checker、heap-profiler和cpu-profiler),这个工具是开源的,以源码形式发布。如果觉得自己维护一个内存分配器麻烦的话,可以考虑将TCMalloc静态库连接到你的程序中。使用的时候和glibc中的malloc调用方式一模一样。你需要做的只是把TCMalloc的动态库或者静态库连接进你的程序中,你就可以获得一个高效,快速,安全的内存分配器。


1、安装libunwind库:
如果系统是64位的需要先安装libunwind库,32位系统则不需要安装。


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


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


# tar zxf libunwind-1.1.tar.gz


# cd libunwind-1.1CFLAGS=-fPIC ./configure


# make CFLAGS=-fPIC


# make CFLAGS=-fPIC install


# cd ..



注意:这里是使用默认配置安装的,默认路径为/usr/local,libunwind库应该是安装在/usr/local/lib目录下


2、gperftools的安装:


# wget http://gperftools.googlecode.com/files/gperftools-2.1.tar.gz


# tar xzf gperftools-2.1.tar.gz


# cd gperftools-2.1



可以加入参数只编译tcmalloc(./configure –enable-minimal、–disable-cpu-profiler、–disable-heap-profiler、–disable-heap-checker、–disable-debugalloc),64位操作系统不安装libunwind也不会报错,注意生成的库文件是libtcmalloc_minimal.*
64位操作系统,如下


# ./configure



32位系统,不需要安装libunwind,但是一定要添加–enable-frame-pointers参数,如下


# ./configure --enable-frame-pointers



然后, make && make install


# make && make install


注意:这里也是使用默认配置安装的,默认路径为/usr/local,且Tcmalloc库也是是安装在/usr/local/lib目录下


安装完成之后,建议TCmaloc库加载到Linux系统中,具体操作如下:


# echo '/usr/local/lib' > /etc/ld.so.conf.d/local.conf


# /sbin/ldconfig #必须执行


3、使用TCMalloc优化MySQL
使用tcmalloc优化Mysql可以通过两种方法来实现,分别为:动态加载、静态编译


采用静态编译:


MySQL 5.1静态编译方法,./configure预编译时假设下面参数


--with-mysqld-ldflags=-ltcmalloc



MySQL 5.5静态编译方法,cmake预编译时加上下面参数


-DCMAKE_EXE_LINKER_FLAGS="-ltcmalloc" -DWITH_SAFEMALLOC=OFF


采用动态加载:


动态加载比较方便,不需要重新安装mysql,只需要修改在mysqld_safe添加一条语句然后重启就行。具体操作如下:


# vim /usr/local/mysql/bin/mysqld_safe


···


export LD_PRELOAD="/usr/local/lib/libtcmalloc.so"


···



# service mysqld restart



注意:这里必须在LD_PRELOAD前面加上export,否则不生效。


或者采用以下方式


# sed -i 's@executing mysqld_safe@executing mysqld_safe\nexport LD_PRELOAD=/usr/local/lib/libtcmalloc.so@' /usr/local/mysql/bin/mysqld_safe


# service mysqld restart



验证加载tcmalloc在MySQL中是否生效,如下:


[root@localhost bin]# lsof -n | grep tcmalloc


mysqld 3166 mysql mem REG 8,2 1853298 32406 /usr/local/lib/libtcmalloc.so.4.1.2