Heim  >  Artikel  >  Datenbank  >  TCMalloc优化MySQL、Nginx、Redis内存管理

TCMalloc优化MySQL、Nginx、Redis内存管理

WBOY
WBOYOriginal
2016-06-07 15:34:501439Durchsuche

Tcmalloc概述: TCMalloc (Thread-Caching Malloc)与标准glibc库的malloc实现一样的功能,但是TCMalloc在效率和速度效率都比标准malloc高很多。TCMalloc是google-perftools工具中的一个(gperftools四个工具分别是:TCMalloc、heap-checker、heap-profiler和

Tcmalloc概述:

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

与标准的glibc库的malloc相比,TCMalloc在内存的分配效率和速度要高,可以在高并发的情况下很好的控制内存的使用,提高服务器的性能,降低负载。TCMalloc的实现原理和测试报告请见一篇文章:《TCMalloc:线程缓存的Malloc》


tcmalloc将内存请求分为两类,大对象请求和小对象请求,大对象为>=32K的对象。|
tcmalloc会为每个线程分配线程局部缓冲
对于小对象请求,可以直接从线程局部缓冲区获取,如果线程局部缓冲区没有空闲内存,则从central heap中一次性获取一连串小对象。
tcmalloc对于小内存,按8的整数次倍分配,对于大内存,按4K的整数次倍分配。
这样做有两个好处,一是分配的时候比较快。二是短期的收益比较大,分配的小内存至多浪费7个字节,大内存则4K
当某个线程缓存当缓存中所有对象的总共大小超过2MB的时候,会对他进行垃圾收集。垃圾收集阈值会自动根据线程数量的增加而减少,这样就不会因为程序有大量线程而过度浪费内存。

内存泄露检测
使用Tcmalloc的程序,用valgrind无法检测内存泄露,可以使用google-perftools提供的heap checker
使用方法:
export  HEAPCHECK=TYPE
TYPE可以为:minimal、normal、strict、draconian

tcmalloc作为可选项已经添加到《lnmp最新源码一键安装包》

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

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

<span>wget http</span><span>://</span><span>download</span><span>.</span><span>savannah</span><span>.</span><span>gnu</span><span>.</span><span>org</span><span>/</span><span>releases</span><span>/</span><span>libunwind</span><span>/</span><span>libunwind</span><span>-</span><span>1.1</span><span>.</span><span>tar</span><span>.</span><span>gz
tar zxf libunwind</span><span>-</span><span>1.1</span><span>.</span><span>tar</span><span>.</span><span>gz
cd libunwind</span><span>-</span><span>1.1</span><span>
CFLAGS</span><span>=-</span><span>fPIC </span><span>./</span><span>configure
make CFLAGS</span><span>=-</span><span>fPIC
make CFLAGS</span><span>=-</span><span>fPIC install
cd </span><span>../</span>

gperftools的安装:

<span>wget http</span><span>://</span><span>gperftools</span><span>.</span><span>googlecode</span><span>.</span><span>com</span><span>/</span><span>files</span><span>/</span><span>gperftools</span><span>-</span><span>2.1</span><span>.</span><span>tar</span><span>.</span><span>gz
tar xzf gperftools</span><span>-</span><span>2.1</span><span>.</span><span>tar</span><span>.</span><span>gz
cd gperftools</span><span>-</span><span>2.1</span>

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

<span>./</span><span>configure </span>

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

<span>./</span><span>configure </span>--enable-frame-pointers 
<span>make </span><span>&&</span><span> make install</span>

编译安装后,输入以下命令:

<span>echo </span><span>'/usr/local/lib'</span><span>></span><span>/</span><span>etc</span><span>/</span><span>ld</span><span>.</span><span>so</span><span>.</span><span>conf</span><span>.</span><span>d</span><span>/</span><span>local</span><span>.</span><span>conf
ldconfig </span><span>#必须执行</span>

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

<span>--</span><span>with</span><span>-</span><span>mysqld</span><span>-</span><span>ldflags</span><span>=-</span><span>ltcmalloc</span>

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

<span>-</span><span>DCMAKE_EXE_LINKER_FLAGS</span><span>=</span><span>"-ltcmalloc"</span><span>-</span><span>DWITH_SAFEMALLOC</span><span>=</span><span>OFF</span>

采用动态加载

<span>sed </span><span>-</span><span>i </span><span>'s@executing mysqld_safe@executing mysqld_safe\nexport LD_PRELOAD=/usr/local/lib/libtcmalloc.so@'</span><span>/</span><span>usr</span><span>/</span><span>local</span><span>/</span><span>mysql</span><span>/</span><span>bin</span><span>/</span><span>mysqld_safe
service mysqld restart</span>

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

<span>lsof </span><span>-</span><span>n </span><span>|</span><span> grep tcmalloc</span>

使用TCMalloc优化Nginx
为了使nginx支持google-perftools,需要在安装过程中添加”–with-google_perftools_module”选项重新编译nginx。安装如下:

cd lnmp/src/nginx-1.4.2
make clean
<span>./</span><span>configure </span>--prefix=/usr/local/nginx --user=www --group=www \
--with-http_stub_status_module --with-http_ssl_module --with-http_flv_module \
--with-http_gzip_static_module --with-google_perftools_module
make && make install

为添加线程目录:

<span>mkdir </span><span>/</span><span>tmp</span><span>/</span><span>tcmalloc
chown </span><span>-</span><span>R www</span><span>.</span><span>www </span><span>/</span><span>tmp</span><span>/</span><span>tcmalloc
vi </span><span>/</span><span>usr</span><span>/</span><span>local</span><span>/</span><span>nginx</span><span>/</span><span>conf</span><span>/</span><span>nginx</span><span>.</span><span>conf </span><span>#pid下一行添加</span><span>
google_perftools_profiles </span><span>/</span><span>tmp</span><span>/</span><span>tcmalloc</span><span>;</span>

验证tcmalloc是否在Nginx中生效

<span>lsof </span><span>-</span><span>n </span><span>|</span><span> grep tcmalloc</span>

每个线程(work_processes的值)会有一行记录。每个线程文件后面的数字值就是启动的nginx的pid值。

使用TCMalloc优redis 
注意:redis-2.4以上自带jemalloc,你不需要加任何参数,通过zmalloc.c源码中我们可以看到,Redis在编译时,会先判断是否使用tcmalloc,如果是,会用tcmalloc对应的函数替换掉标准的libc中的函数实现。其次会判断jemalloc是否使得,最后如果都没有使用才会用标准的libc中的内存管理函数。所以用tcmalloc优化请谨慎使用,这两着分配器碎片率相差不大,建议用自带jemalloc

<span>cd lnmp</span><span>/</span><span>src</span><span>/</span><span><span>redis</span></span><span>-</span><span>2.6</span><span>.</span><span>16</span><span>
make USE_TCMALLOC</span><span>=</span><span>yes FORCE_LIBC_MALLOC</span><span>=</span><span>yes
</span><span>/</span><span>bin</span><span>/</span><span>cp src</span><span>/{</span><span>redis</span><span>-</span><span>benchmark</span><span>,</span><span>redis</span><span>-</span><span>check</span><span>-</span><span>aof</span><span>,</span><span>redis</span><span>-</span><span>check</span><span>-</span><span>dump</span><span>,</span><span>redis</span><span>-</span><span>cli</span><span>,</span><span>redis</span><span>-</span><span>sentinel</span><span>,</span><span>redis</span><span>-</span><span>server</span><span>}</span><span>/</span><span>usr</span><span>/</span><span>local</span><span>/</span><span>redis</span><span>/</span><span>bin</span>


其他参考:

http://blog.csdn.net/chosen0ne/article/details/9338591


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn