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