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