歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> TCMalloc優化MySQL、Nginx、Redis內存管理

TCMalloc優化MySQL、Nginx、Redis內存管理

日期:2017/2/27 15:57:54   编辑:Linux教程
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作為可選項已經添加到《lnmp最新源碼一鍵安裝包》

安裝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.1
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
cd ../
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
編譯安裝後,輸入以下命令:
echo '/usr/local/lib' > /etc/ld.so.conf.d/local.conf
ldconfig #必須執行
使用TCMalloc優化MySQL
MySQL 5.1靜態編譯方法,./configure預編譯時假設下面參數
--with-mysqld-ldflags=-ltcmalloc
MySQL 5.5靜態編譯方法,cmake預編譯時加上下面參數
-DCMAKE_EXE_LINKER_FLAGS="-ltcmalloc" -DWITH_SAFEMALLOC=OFF
采用動態加載
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中是否生效,如下(靜態看不到):
lsof -n | grep tcmalloc
使用TCMalloc優化Nginx
為了使nginx支持google-perftools,需要在安裝過程中添加"--with-google_perftools_module"選項重新編譯nginx。安裝如下:
cd lnmp/src/nginx-1.4.2
make clean
./configure --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
為添加線程目錄:
mkdir /tmp/tcmalloc
chown -R www.www /tmp/tcmalloc
vi /usr/local/nginx/conf/nginx.conf #pid下一行添加
google_perftools_profiles /tmp/tcmalloc;
驗證tcmalloc是否在Nginx中生效
lsof -n | grep tcmalloc
每個線程(work_processes的值)會有一行記錄。每個線程文件後面的數字值就是啟動的nginx的pid值。

使用TCMalloc優化redis
注意:redis-2.4以上自帶jemalloc,你不需要加任何參數, 通過zmalloc.c源碼中我們可以看到,Redis在編譯時,會先判斷是否使用tcmalloc,如果是,會用tcmalloc對應的函數替換掉標准 的libc中的函數實現。其次會判斷jemalloc是否使得,最後如果都沒有使用才會用標准的libc中的內存管理函數。所以用tcmalloc優化請 謹慎使用,這兩著分配器碎片率相差不大,建議用自帶jemalloc
cd lnmp/src/redis-2.6.16
make USE_TCMALLOC=yes FORCE_LIBC_MALLOC=yes
/bin/cp src/{redis-benchmark,redis-check-aof,redis-check-dump,redis-cli,redis-sentinel,redis-server} /usr/local/redis/bin
原文:http://blog.linuxeye.com/355.html
Copyright © Linux教程網 All Rights Reserved