在網上看到不少資料說,用google-perftools裡的tcmalloc替代glibc的malloc,可以極大改善MySQL在高並發下的效能。在這些資料裡提到,有兩種辦法可以讓tcmalloc生效。一是編譯連結時加上-ltcmalloc參數;二是使用LD_PRELOAD環境變數,載入libtcmalloc.so動態庫檔案,替換掉glibc中的malloc。大部分資料似乎都是用第二種辦法,看似簡單,但是據我所知,很多人在編譯安裝MySQL的時候,都會加上這樣的參數:
--with-mysqld-ldflags=-all-static,也就是會採用靜態連結的方式,目的是提高程式的執行效率,這樣一來,LD_PRELOAD還能起作用嗎?
穩妥起見,還是在編譯時間加進去比較好。但是編譯的時候又碰到問題,試了好幾次才成功,記錄在這裡方便自己,也方便以後同樣碰到這個問題的人。
以前的configure執行的指令碼
CFLAGS="-O3" CXX=gcc CXXFLAGS="-O3 -felide-constructors /
-fno-exceptions -fno-rtti" ./configure /
--prefix=/usr/local/mysql --enable-assembler /
--with-charset=utf8 /
--with-extra-charsets=gbk,gb2312,latin1 /
--localstatedir=/opt/mysql-data /
--with-mysqld-user=mysql --enable-large-files --with-big-tables /
--without-debug /
--with-mysqld-ldflags=-all-static /
--with-client-ldflags=-all-static /
--enable-thread-safe-client
現在執行的指令碼
CFLAGS="-O3" CXX=g++ CXXFLAGS="-O3 -felide-constructors /
-fno-exceptions -fno-rtti" ./configure /
--prefix=/usr/local/mysql --enable-assembler /
--with-charset=utf8 /
--with-extra-charsets=gbk,gb2312,latin1 /
--localstatedir=/opt/mysql-data /
--with-mysqld-user=mysql --enable-large-files --with-big-tables /
--without-debug /
--with-mysqld-ldflags="-all-static -ltcmalloc -lstacktrace"/
--with-client-ldflags=-all-static /
--enable-thread-safe-client