TCMalloc最佳化Nginx、MySQL、Redis記憶體管理

來源:互聯網
上載者:User

標籤: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記憶體管理

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.