MySQL在Linux上使用 LinuxThreads 。如果你正在使用一個沒有glibc2的老的Linux版本,你必須在嘗試編譯MySQL前安裝LinuxThreads。你可以從 http://dev.mysql.com/downloads/os-linux.html獲得LinuxThreads。
注意:當你執行INSERT DELAYED時,所用的包括2.1.1及以前的glibc版本在pthread_互斥_timedwait()處理上有一個致命錯誤,如果你正在使用INSERT DELAYED,我們建議先升級glibc。
請注意Linux 內核和LinuxThreads庫默認情況下最多可以處理1,024個線程。如果你計劃使用超過1,000個并行連接,需要對LinuxThreads進行一些更改,如下所示:
· 將sysdeps/unix/sysv/linux/bits/local_lim.h中的PTHREAD_THREADS_MAX 增加到4096,將LinuxThreads/internals.h 中的STACK_SIZE減少到256KB。路徑相對于glibc的根目錄。(請注意如果STACK_SIZE為默認值2MB,MySQL有600-1000個連接時不穩定)。
· 重新編譯LinuxThreads,生成新的libpthreads.a庫,并重新連接MySQL。
可以從http://www.volano.com/linuxnotes.html 查閱關于LinuxThreads線程限制的詳細信息。
還有一個問題會嚴重影響MySQL的性能,特別是在SMP系統中。在glibc 2.1的LinuxThreads中,對于擁有很多只是短時間內占有互斥體的線程的程序,不能很好地執行互斥。結果出現荒謬的現象:在許多情況下,如果你使用未修改的LinuxThreads連接MySQL,從SMP中去掉卸載處理器實際上會提高MySQL的性能。我們提供了一個glibc 2.1.3的補丁來糾正該行為(http://www.mysql.com/Downloads/Linux/linuxthreads-2.1-patch )。
在glibc 2.2.2中,MySQL使用修改后的互斥,這樣甚至比打了補丁的glibc 2.1.3還要好得多。但是,需要注意的是在某些條件下,當前glibc 2.2.2中的互斥代碼會高旋,影響了MySQL的性能。通過優化mysqld進程到最高優先級,可以降低在這種情況下出現這種問題的可能性。我們還可以通過補丁來糾正高旋問題,可以從http://www.mysql.com/Downloads/Linux/linuxthreads-2.2.2.patch下載。它集成高旋的糾正、線程最大數目和堆棧空間于一體。你需要用補丁patch -p0 </tmp/linuxthreads-2.2.2.patch在LinuxThreads目錄下使用。我們 希望在將來的glibc 2.2發布中能以某種形式將它包括進來。在任何情況下,如果你連接glibc 2.2.2,仍然需要糾正STACK_SIZE和 PTHREAD_THREADS_MAX。我們希望在將來能將默認值糾正到某種程度上可以接受的值,適合高負荷MySQL設置,因此用來產生你自己的構建的 命令可以簡化到到./configure; make; make install。
我們建議你使用這些補丁來構建專用的libpthreads.a靜態版本,并只使用它同MySQL實現靜態鏈接。我們知道這些補丁對于MySQL很安全 并大大改善了它的性能,但是我們還不能斷言它在其它應用程序上的效果如何。如果你需要將其它使用LinuxThreads的應用程序同打了補丁的靜態版本的庫連接,或構建一個打了補丁的共享版本,并將它安裝到系統中,你將自己承擔風險。
如果你在安裝MySQL的過程中遇到任何奇怪的問題,或一些常用實用工具被懸掛起來,很可能是庫或編譯器相關問題。在這種情況下,使用我們的二進制來解決。
如果你連接你自己的MySQL客戶端程序,運行時你會看見下面的錯誤:
ld.so.1: fatal: libmysqlclient.so.#:
open failed: No such file or directory
使用下面的方法可以避免該問題:
· 用-Wl,r/full/path/to/libmysqlclient.so標記連接客戶端,不要使用-Lpath)。
· 將libmysqclient.so復制到/usr/lib。
· 運行客戶端程序前,將libmysqlclient.so所在目錄的路徑名增加到LD_RUN_PATH環境變量。
如果使用Fujitsu編譯器 (fcc/FCC),編譯MySQ時可能會出現一些問題,因為Linux頭文件主要面向gcc。以下的configure行應當結合fcc/FCC使用:
CC=fcc CFLAGS="-O -K fast -K lib -K omitfp -Kpreex -D_GNU_SOURCE
-DCONST=const -DNO_STRTOLL_PROTO"
CXX=FCC CXXFLAGS="-O -K fast -K lib
-K omitfp -K preex --no_exceptions --no_rtti -D_GNU_SOURCE
-DCONST=const -Dalloca=__builtin_alloca -DNO_STRTOLL_PROTO
'-D_EXTERN_INLINE=static __inline'"
./configure
--prefix=/usr/local/mysql --enable-assembler
--with-mysqld-ldflags=-all-static --disable-shared
--with-low-memory