之前看 DK 長輩寫了這篇Linux 上 MySQL Scalability 的問題
, 看完後, 沒什麼好說的, 當然就是裝裝看 TCMalloc(Thread-Caching Malloc) 囉~
以下來記錄 Debian 安裝 TCMalloc 並使用在 MySQL 上的步驟...
首先前置作業是抓 TCMalloc, 先到 Google Performance Tools
, 然後找到 google-perftools-0.8.tar.gz 下載.
再來 Debian 也要建置基本環境, 步驟如下:
- apt-get install devscripts pbuilder(若 /usr/bin/debuild 不存在, 就安裝 devscripts, pbuilder 這兩個 package)
然後安裝 TCMalloc:
- tar zxvf google-perftools-0.8.tar.gz
- cd google-perftools-0.8
- make dist
- cd packages
- ./deb.sh # 產生 debian package
- dpkg -i packages/debian-4.0/libgoogle-perftools0_0.1-1_i386.deb
- dpkg -L libgoogle-perftools0 # 看一下到底裝了什麼東西
- ln -s /usr/lib/libtcmalloc.so.0 /usr/lib/libtcmalloc.so
- vim /usr/bin/mysqld_safe # 修改 mysql 啟動, 讓他使用 TCMalloc
- 修改 第 387 行, 於此行最前面加入
LD_PRELOAD="/usr/lib/libtcmalloc.so"
(在 mysql 啟動前先載入環境變數(mysql 啟動的 script 就是 /usr/bin/mysqld_safe), 讓 tcmalloc = glibc 的 malloc(), 於最前面加入環境變數即可)
387 行就是 mysql start 的那行命令, 此行修改完成如下:LD_PRELOAD="/usr/lib/libtcmalloc.so" $NOHUP_NICENESS $ledir/$MYSQLD $defaults --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR $USER_OPTION --pid-file =$pid_file --skip-external-locking 2>&1 | $ERR_LOGGER -t mysqld & wait
- /etc/init.d/mysql restart # 看看能不能順利啟動吧.. XD
- 要注意每次 apt-get upgrade, dist-upgrade 時如果有 upgrade mysql, 此 script 要自行修改(不過不修改也是不會有問題, 只是就會變回使用原本 gnu 的 malloc() 而已)
PS: 不要將 TCMalloc 整個拿來取代 malloc, 會出問題(不要將環境變數整個設下去)
測試程式:
#include <stdlib.h> int main(int argc, char** argv) { int times = 10000; int i = 0; if (argc == 2) times = atoi(argv[1]); for (i = 0; i < times; i++) { char *ptr = malloc(1024); /*printf(%d\n, i);*/ free(ptr); } }
- cc -o malloc malloc.c -lpthread # compile
- time ./malloc 100000000 # 測試 gnu malloc 速度(測試跑完是 13.392 secs)
- time LD_PRELOAD="/usr/lib/libtcmalloc.so" ./malloc 100000000 # 測試 TCMalloc 速度(測試跑完是 9.558 secs)
結論就是, TCMalloc 會比較快.. XD, 要不要用的話, 自己再看著辦吧... XD
相關網頁