以下の glibc
に関する注釈は MySQL
をご自身でビルドする際にのみ適用します。Linux
を x86
マシンで使用している場合、弊社のバイナリが多くのケースで最適です。弊社では弊社のバイナリを弊社が知り得るかぎりベストパッチの
glibc
バージョンにリンクし最高のコンパイラオプションを使用して、高負荷のサーバーに最適なソリューションを目指しています。一般的なユーザーにとって、多数の同時接続あるいは
2 GB
の制限を越えるテーブルでの設定においてさえ、弊社のバイナリはそのほとんどのケースで最適な選択といます。以下のテキストを読まれたあとで、それでも何をすべきか分からない場合には、まず弊社のバイナリを試してみてお客様のニーズに合うか決めてください。もし要求を十分満たすことができない場合には、ご自身でビルドしてみることもできます。そのような場合、お客様のご意見を寄せて頂ければ弊社はさらによいバイナリをビルドするための参考にさせて頂きます。
MySQL は Linux に LinuxThread
を使用しています。glibc2
を実装していない旧 Linux
バージョンを使用している場合には、MySQL
をコンパイルする前に LinuxThread
をインストールする必要があります。LinuxThreads
は、http://dev.mysql.com/downloads/os-linux.html
から入手できます。
INSERT DELAYD
ステートメントが発行されるときに使用されるバージョン
2.1.1 を含む以前の
glibc
のバージョンには
pthread_mutex_timedwait()
の処理で致命的なバグがあります。glibc
をアップグレードする前に
INSERT DELAYED
を使用しないでください。
Linux kernel および LinuxThread ライブラリはデフォルトで最大 1,024 スレッドを扱うことができます。1,000 以上の同時接続を計画している場合には、以下のように LinuxThread を変更する必要があります。
PTHREAD_THREADS_MAX
を
sysdeps/unix/sysv/linux/bits/local_lim.h
で 4096 に増やし
STACK_SIZE
を
linuxthreads/internals.h
で 256KB に減らします。パスは
glibc
のルートに関連しています。(MySQL は
STACK_SIZE
がデフォルトの 2MB の場合には 600-1000
接続では安定しません)。
Recompile LinuxThreads to produce a new
libpthread.a
library,
and relink MySQL against it.
MySQL
のパフォーマンスに大きな影響を与える別の問題が、特に
SMP
システム上であります。glibc
2.1 の LinuxThreads の mutex の実装が mutex
をほんの短時間保持する多くのスレッドを使用するプログラムで非常に貧弱です。このことは逆説的な結果を生みます。MySQL
を無修正の LinuxThreads にリンクさせる際、SMP
からプロセッサを削除すると MySQL
パフォーマンスが実質的に多くのケースで改善されます。この動作を修正する
glibc
2.1.3
のパッチが利用できるようになっています
(http://dev.mysql.com/Downloads/Linux/linuxthreads-2.1-patch)。
glibc
2.2.2
を使用する際、MySQL に adaptive の mutex
を使用することによって
glibc
2.1.3
にパッチ版を使用するよりはるかによくなります。しかし、使用条件によっては、glibc
2.2.2 の現在の mutex code
はオーバースピンし、MySQL
パフォーマンスを低下さるので、その点注意が必要です。この現象の再現を
mysqld
のプロセスを最高度まで再調整することで減らすことができます。http://dev.mysql.com/Downloads/Linux/linuxthreads-2.2.2.patch
で入手できるパッチを使って、オーバースピン動作を修正することもできます。そのパッチでオーバースピン、スレッドの最大数、およびスタックのスペースをすべて
1
つにまとめるなどの修正を加えています。そのパッチは
linuxthreads
ディレクトリに patch -p0
</tmp/linuxthreads-2.2.2.patch
を適用します。そのパッチを何らかの形で
glibc
2.2
の今後のリリースに含めることを希望しています。いずれにしても、glibc
2.2.2
に対してリンクを設定する場合でも、STACK_SIZE
および
PTHREAD_THREADS_MAX
を修正する必要があります。弊社ではデフォルトの値が、今後
MySQL
の高負荷設定に対応できるように修正され、お客様ご自身でビルドする際に必要なコマンドが
./configure; make; make
install
まで減少できるように期待しています。
これらのパッチを使用して特別な静的バージョンの
libpthread.a
を構築する場合は、MySQL
に静的にリンクする場合にのみ使用してください。これらのパッチは
MySQL
に使用する際は安全でそのパフォーマンスを大幅に改善しますが、ほかのアプリケーションに対する影響についてはなにも言う立場にありません。LinuxThreads
をライブラリのパッチ版の静的ベージョンが必要なほかのアプリケーションにリンクする、あるいはパッチ共有バージョンをビルドしそれをお客様のシステムにインストールすることは、お客様ご自身のリスクで行うことになります。
MySQL のインストールの最中に予想外の問題に遭遇した場合、あるいはそれに一般的なユーティリティーのハンギングが伴う場合、それらの問題はライブラリあるいはコンパイラにいずれかに起因するものである確立が高いといえます。このような場合には、弊社のバイナリがその問題を解決します。
お客様ご自身の MySQL クライアントプログラムをリンクさせる場合、ランタイムで以下のエラーが表示される場合があります。
ld.so.1: fatal: libmysqlclient.so.#: open failed: No such file or directory
この問題は以下のメソッドのいずれかで回避できます。
富士通のコンパイラ
(fcc/FCC
)
を使用する場合、Linux のヘッダーファイルは
gcc
に特化したものですので MySQL
のコンパイルで問題が発生する場合があります。以下の
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