星期四, 三月 29, 2007
Linux MySQL 使用 TCMalloc
之前看 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)
- 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
發表迴響
PS: 若無法留言, 請先確認是否有打開 JavaScript, 造成您的困擾, 實在萬分對不起 Orz...(如果無法留言, 勞煩可以發信給我好嗎? 謝謝.)
PS2: 若您的留言被誤判, 我都會再自行看過, 不需要一直重覆張貼~
PS2: 若您的留言被誤判, 我都會再自行看過, 不需要一直重覆張貼~





