利用TCMalloc替换Nginx和Redis默认glibc库的malloc内存分配
TCMalloc的全稱為Thread-Caching Malloc,是谷歌開發的開源工具google-perftools中的一個成員。與標準的glibc庫的Malloc相比,TCMalloc庫在內存分配效率和速度上要高很多,這在很大程度上提高了服務器在高并發情況下的性能,從而降低了系統的負載。
1.安裝libunwind庫
?可以從http://download.savannah.gnu.org/releases/libunwind下載相應的libunwind版本
#wget http://ftp.twaren.net/Unix/NonGNU//libunwind/libunwind-1.1.tar.gz
#tar zxvf libunwind-1.1.tar.gz
#cd libunwind-1.1
#CFLAGS=-fPIC ./configure?
#make CFLAGS=-fPIC?
#make CFLAGS=-fPIC install
?
2.安裝google-perftools
#wget http://gperftools.googlecode.com/files/gperftools-2.1.tar.gz
#tar zxvf gperftools-2.1.tar.gz
#cd gperftools-2.1
# ./configure?
#make && make install?
#echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf?
# ldconfig
?
3.編譯安裝nginx
# wget http://nginx.org/download/nginx-1.4.2.tar.gz
# tar -zvxf nginx-1.4.2.tar.gz
# cd ./nginx-1.4.2
注意需要添加--with-google_perftools_module
#./configure --with-google_perftools_module --prefix=/usr/local/nginx?
參考:Linux環境Nginx安裝與調試(Nginx+PHP/phpfpm)
#make
#make install
?
4.修改Nginx主配置文件
修改nginx.conf文件,在pid這行的下面添加如下代碼:
#pid??????? logs/nginx.pid;?
google_perftools_profiles /tmp/tcmalloc;
同時我們設置nginx啟動2個工作進程
worker_processes? 2;
daemon on;
master_process? on;
?
5.為google-perftools添加線程目錄
創建一個線程目錄,將文件放在/tmp/tcmalloc下。
#mkdir /tmp/tcmalloc
#chmod 0777 /tmp/tcmalloc
?
6.啟動Nginx
#/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
?
7.驗證運行狀態
為了驗證google-perftools已經正常加載,可通過如下命令查看:
# lsof -n | grep tcmalloc?
?
8.安裝redis
Redis并沒有自己實現內存池,沒有在標準的系統內存分配器上再加上自己的東西。所以系統內存分配器的性能及碎片率會對Redis造成一些性能上的影響。
在Redis的 zmalloc.c 源碼中,我們可以看到如下代碼:
/* Explicitly override malloc/free etc when using tcmalloc. */
#if defined(USE_TCMALLOC)
#define malloc(size) tc_malloc(size)
#define calloc(count,size) tc_calloc(count,size)
#define realloc(ptr,size) tc_realloc(ptr,size)
#define free(ptr) tc_free(ptr)
#elif defined(USE_JEMALLOC)
#define malloc(size) je_malloc(size)
#define calloc(count,size) je_calloc(count,size)
#define realloc(ptr,size) je_realloc(ptr,size)
#define free(ptr) je_free(ptr)
#endif
注意:redis-2.4以上自帶jemalloc,你不需要加任何參數,通過zmalloc.c源碼中我們可以看到,Redis在編譯時,會先判斷是否使用tcmalloc,如果是,會用tcmalloc對應的函數替換掉標準的libc中的函數實現。其次會判斷jemalloc是否使得,最后如果都沒有使用才會用標準的libc中的內存管理函數。所以用tcmalloc優化請謹慎使用,這兩著分配器碎片率相差不大,建議用自帶jemalloc。
如果要安裝tcmalloc可以這樣:
注意需要刪除原先的redis的解壓文件,不然安裝無效!
# make USE_TCMALLOC=yes
# make install
檢測tcmall信息
使用info命令查看內存信息:
更多參考:
使用Google的開源TCMalloc庫,提高MySQL在高并發情況下的性能[張宴原創]
輕量級HTTP服務器Nginx(Nginx性能優化技巧)
TCMalloc:線程緩存的Malloc
TCMalloc優化MySQL、Nginx、Redis內存管理
2012年tcmalloc學習筆記之一
總結
以上是生活随笔為你收集整理的利用TCMalloc替换Nginx和Redis默认glibc库的malloc内存分配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈无缓存I/O操作和标准I/O文件操作
- 下一篇: ldconfig动态链接库管理以及修改l