X

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)

然後安裝 TCMalloc:

  1. tar zxvf google-perftools-0.8.tar.gz
  2. cd google-perftools-0.8
  3. make dist
  4. cd packages
  5. ./deb.sh # 產生 debian package
  6. dpkg -i packages/debian-4.0/libgoogle-perftools0_0.1-1_i386.deb
  7. dpkg -L libgoogle-perftools0 # 看一下到底裝了什麼東西
  8. ln -s /usr/lib/libtcmalloc.so.0 /usr/lib/libtcmalloc.so
  9. vim /usr/bin/mysqld_safe # 修改 mysql 啟動, 讓他使用 TCMalloc
  10. 修改 第 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

相關網頁

Tsung: 對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.