標籤:tcmalloc nginx mysql redis
TCMalloc(Thread-Caching Malloc)與標準glibc庫的malloc實現一樣的功能,但是TCMalloc在效率和速度效率都比標準malloc高很多。TCMalloc是google-perftools工具中的一個(gperftools四個工具分別是:TCMalloc、heap-checker、heap-profiler和cpu-profiler),這個工具是開源的,以源碼形式發布。如果覺得自己維護一個記憶體 Clerk麻煩的話,可以考慮將TCMalloc靜態庫串連到你的程式中。使用的時候和glibc中的malloc調用方式一模一樣。你需要做的只是把TCMalloc的動態庫或者靜態庫串連進你的程式中,你就可以獲得一個高效,快速,安全的記憶體 Clerk。
與標準的glibc庫的malloc相比,TCMalloc在記憶體的分配效率和速度要高,可以在高並發的情況下很好的控制記憶體的使用,提高伺服器的效能,降低負載。TCMalloc的實現原理和測試報告請見一篇文章:《TCMalloc:線程緩衝的Malloc》
tcmalloc作為可選項已經添加到《lnmp最新源碼一鍵安裝包》
安裝libunwind庫:
如果系統是64位的需要先安裝libunwind庫,32位系統則不需要安裝。
libunwind庫為基於64位CPU和作業系統的程式提供了基本的堆棧輾轉開解功能,其中包括用於輸出堆疊追蹤的API用於以編程方式輾轉開解堆棧的API以及支援C++異常處理機制的API。
tar xf libunwind-1.1.tar.gzcd libunwind-1.1CFLAGS=-fPIC ./configuremake CFLAGS=-fPICmake CFLAGS=-fPIC install
gperftools的安裝:
tar xzf gperftools-2.1.tar.gzcd 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.confldconfig
使用TCMalloc最佳化Nginx
為了使nginx支援google-perftools,需要在安裝過程中添加”–with-google_perftools_module”選項重新編譯nginx。安裝如下:
tar xf nginx-1.4.7.tar.gzcd nginx-1.4.7./configure > --user=nginx > --group=nginx > --prefix=/usr/local/nginx > --with-pcre=../pcre-8.33 > --with-zlib=../zlib-1.2.8 > --with-openssl=../openssl-1.0.0l > --with-http_stub_status_module > --error-log-path=/var/log/nginx/error.log > --http-log-path=/var/log/nginx/access.log > --pid-path=/var/run/nginx/nginx.pid > --lock-path=/var/lock/nginx.lock > --with-http_gzip_static_module > --http-proxy-temp-path=/var/tmp/nginx/proxy/ > --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ > --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi > --http-scgi-temp-path=/var/tmp/nginx/scgi > --with-google_perftools_modulemake && make install
為添加線程目錄:
mkdir /tmp/tcmallocchown -R www.www /tmp/tcmallocchmod 0777 /tmp/tcmalloc vi /usr/local/nginx/conf/nginx.conf #pid下一行添加google_perftools_profiles /tmp/tcmalloc;
重啟nginx服務
/etc/init.d/nginx restart
驗證tcmalloc是否在Nginx中生效
yum -y install lsoflsof -n | grep tcmalloc
每個線程(work_processes的值)會有一行記錄。每個線程檔案後面的數字值就是啟動的nginx的pid值。
使用TCMalloc最佳化MySQL
MySQL 5.1靜態編譯方法,./configure先行編譯時假設下面參數
--with-mysqld-ldflags=-ltcmalloc
MySQL 5.5靜態編譯方法,cmake先行編譯時加上下面參數
-DCMAKE_EXE_LINKER_FLAGS="-ltcmalloc" -DWITH_SAFEMALLOC=OFF
採用動態載入
sed -i ‘[email protected] [email protected] mysqld_safe\nexport LD_PRELOAD=/usr/local/lib/[email protected]‘ /usr/local/mysql/bin/mysqld_safeservice mysqld restart
驗證載入tcmalloc在MySQL中是否生效,如下:
lsof -n | grep tcmalloc
使用TCMalloc優化redis
注意:redis-2.4以上內建jemalloc,你不需要加任何參數,通過zmalloc.c源碼中我們可以看到,Redis在編譯時間,會先判斷是否使用tcmalloc,如果是,會用tcmalloc對應的函數替換掉標準的libc中的函數實現。其次會判斷jemalloc是否使得,最後如果都沒有使用才會用標準的libc中的記憶體管理函數。所以用tcmalloc最佳化請謹慎使用,這兩著分配器片段率相差不大,建議用內建jemalloc
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://467754239.blog.51cto.com/4878013/1558266
TCMalloc最佳化Nginx、MySQL、Redis記憶體管理