ITEEDU

2.12.1.4. Linux后期安装注意事项

在MySQL安装目录或MySQL源码树下的support-files目录下可以找到mysql.server。你可以将它安装为/etc/init.d/mysql,以便自动启动和关闭MySQL。请参见2.9.2.2节,“自动启动和停止MySQL”

如果MySQL不能打开足够的文件或连接,可能是你没有将Linux配置为处理足够的文件。

在Linux 2.2及以上版本中,你可以检查分配的文件的数目:

shell> cat /proc/sys/fs/file -max
shell> cat /proc/sys/fs/dquot-max
shell> cat /proc/sys/fs/super-max

如果有超过16MB的内存,应当在启动脚本中增加如下内容(例如,在SuSE Linux中:/etc/init.d/boot.local):

echo 65536 > /proc/sys/fs/file-max
echo 8192 > /proc/sys/fs/dquot-max
echo 1024 > /proc/sys/fs/super-max

还可以用root从命令行运行echo命令,但是下一次重新启动计算机时这些设定值会丢掉。

另外,可以使用许多Linux分发版使用的sysctl工具设置启动参数(包括SuSE Linux 8.0和以后版本)。将下面的值放到文件 /etc/sysctl.conf中:

# Increase some values for MySQL
fs.file-max = 65536
fs.dquot-max = 8192
fs.super-max = 1024

你还应将以下内容加入/etc/my.cnf:

[mysqld_safe]
open-files-limit=8192

这样服务器连接和打开文件的总数目可以达到8,192。

LinuxThreads的STACK_SIZE常数控制在寻址空间中线程堆栈的占用空间。它需要足够大,以保证每个线程堆栈有足够的空间,但是应足够小,防止某些线程的堆栈运行全局mysqld数据。遗憾的是,根据我们的发现,如果你用mmap()映射目前正使用的寻址,Linux成功运行  后不会映射映射区,将会清空整个地址页上的数据而不会返回错误信息。因此,mysqld或其它线程应用程序的安全依靠创建线程的代码的“绅士”行为。用户必须采取措施以确保在任何时间运行线程的数目相对线程堆栈应足够低,以防止全局堆内存。使用mysqld时,你应当为max_connections变量设置合理的值强制该行为。

如果你自己构建MySQL,你可以为LinuxThreads打补丁以便更好地使用堆栈。请参见2.12.1.3节,“Linux源码分发版说明”。如果你不想为LinuxThreads打补丁,你应当将max_connections的值设置为不超过500。如果你有大的关键字缓冲区、大的堆内存表,或其它使mysqld分配大量内存的东西,或如果你用2GB的补丁运行2.2内核,max_connections的值应当更低。如果你正使用我们的二进制或RPM版本,可以安全地将max_connections设置为1500(假定没有大的关键字缓冲区或有大量数据的堆内存表。将LinuxThreads中的STACK_SIZE降低得越低,可以安全地创建越多的线程。我们推荐的值的范围为128KB到256KB。

如果你正使用大量的并行连接,在2.2内核中你可能会遇到一个“特性”,即通过对进程的分支或克隆子进程的行为进行罚分,来试图防止轰炸攻击。这样你增加并行客户端的数量时,MySQL不能正确响应。在单CPU系统中,我们已经发现该现象,即线程创建地很慢;连接MySQL的时间很长(长达1分钟),并且关闭的时间也很长。在多CPU系统中,我们已经观察到随着客户端数目的增加,查询速度逐渐下降。在寻求解决办法的过程中,我们收到了一个用户的内核补丁,他声称该补丁可以解决他的问题。从http://www.mysql.com/Downloads/Patches/linux-fork.patch可以下载该补丁。我们已经在开发和生产系统上对该补丁进行了广泛的测试。它可以大大改善MySQL的性能,而不会造成任何问题,我们向仍然在2.2内核运行高负荷服务器的用户推荐它。

在2.4内核中已经对该问题进行了修复,因此如果你不满意当前系统的性能,不要为2.2 内核打补丁,在SMP系统中升级到2.4版要容易地多,升级不仅可以修复错误,还可以使SMP更好地加速。

我们已经在双CPU机器上在2.4内核中对MySQL进行了测试,发现MySQL的比例要好得多。1,000名客户查询时,还看不到速度有实质上的下降,MySQL的比例因子(最大吞吐量与一个客户端的吞吐量的比例)为180%。我们在四-CPU系统中也观察到了类似的结果:当客户数目上升到1,000名时还没有实质上的减慢, 比例因子为300%。根据这些结果,对于使用2.2内核的高负荷SMP服务器,我们绝对建议升级到 2.4内核。

我们已经发现,在2.4内核中应使用可能的最高优先级来运行mysqld进程,以获得最佳性能。可以通过为mysqld_safe加renice -20 $$命令来实现。在四-CPU系统中的测试中,提高优先级在400个客户时会使吞吐量增加60%。

我们目前还想搜集关于MySQL在four-way和eight-way系统上用2.4内核执行的性能的更详细信息。如果你访问了这些系统并进行了一些基准测试,请将结果用email发送到<benchmarks@mysql.com>。我们将对它们进行审查以包括进手册中。

如果用ps运行mysqld服务器进程时发现进程死掉了,一半是MySQL中有缺陷或数据库表崩溃了。请参见A.4.2节,“如果MySQL依然崩溃,应作些什么”

如果mysqld死掉并给出SIGSEGV信号,要想在Linux中对内核进行调试,你可以用--core-file选项启动mysqld。注意你还可能需要通过向mysqld_safe添加ulimit -c 1000000或用--core-file-size=1000000启动mysqld_safe来加大内核文件的大小。请参见5.1.3节,“mysqld_safe:MySQL服务器启动脚本”