我们现在正在运行一个服务器,MySQL数据库经常崩溃。 我们知道,我们需要为MaxClients和MaxRequestsPerChildfind良好的设置,因为我们正在获取大量的stream量,当我们得到一个尖峰数据库下降。
有一个很好的经验法则或公式可以帮助我们理解这一点吗?
我想一定有一些困惑。 MaxClients和MaxRequestsPerChild是Apache设置,而不是MySQL。 MySQL有max_connections,类似于MaxClients,但不等于MaxRequestsPerChild。
你的意思是“下降”? 如果mysqld死了(你在mysql错误日志中看到了什么?),那么你应该关掉一些东西(可能是你在Apache中讨论的设置)。 如果mysqld只是拒绝连接,因为它太多了,你可以尝试打开max_connections(它默认为100,如果你在默认情况下,也许尝试200)。
如果你有一个繁忙的网站build立了很多连接,你需要关注MySQL中的线程和连接数。 (他们几乎一样,但不完全。)
如果运行SHOW PROCESSLIST显示很多很多“睡眠”的线程,那么需要wait_timeout很长时间来降低variableswait_timeout ,因为它缺省为几分钟,而且大多数网页都在几秒钟之内结束。
看看threads_created状态是否好,看看它是否随着时间的推移而快速上升。 如果是这样,你需要提高variablesthread_cache_size 。 我也看看状态Opened_tables 。 如果它不断上升,你应该提高variablesTable_cache 。 这些都是MySQL在繁忙数据库中的基本性能改进。
您还应该在Apache和MySQL上安装Munin或Cacti或其他性能监视工具。 Apache还有一个扩展状态监视页面,它将帮助你看到如何调整它的子/线程设置。
我只是猜测在这里,但你是否运行一个32位的操作系统连接太多?
MySQL是multithreading的,每个连接使用一个线程。 每个线程使用一些内存作为其堆栈和各种其他缓冲区(这些缓冲区很多,大部分是可调的)。
地址空间不足会导致你的32位系统崩溃。
解决scheme是:
第二个是我build议如果可能的话,除了米奇鼠标的情况。 如果可以帮助,请不要在32位操作系统上部署任何新的应用程序。
如果mysqld实际上正在死亡,那么您可能会遇到1024个文件描述符限制…“过多打开文件”是该errno的典型消息。 您应该configurationulimit和/或pam_limits,以便将守护进程angular色帐户的打开文件的硬限制和软限制提高到更高的级别,为正在打开这么多连接的数据库用户设置max_connectionsvariables,并修复应用程序以抛出当这种情况发生时,鲸鱼
你需要确定为什么数据库正在打最大的连接。 一般来说,问题不在于MySQL正在达到最大连接数,而是其他问题的症状。
使用Apache和MySQL设置可以轻松过度使用内存资源。 检查mysqltuner和apachebuddy ,以了解是否可能内存不足。 如果你的服务器不得不进行交换,这意味着你需要加快数据库查询和你的应用程序的执行速度,增加更多的内存,或者在不同的服务器上分割MySQL和Apache(如果你还没有的话) 。
你可能有sar日志可以给你一些关于服务器资源利用率的信息。
要显示处理器利用率:
# sar
显示内存利用率:
# sar -r
您还可以使用-f /var/log/sa/sa##标志指定前一天的sar日志。
最后,当数据库连接完成时,您应该login到MySQL,看看发生了什么。
mysql> SHOW FULL PROCESSLIST;
这会给你一个MySQL在给定时间处理的所有进程的列表。 特别是,你想看看是否有一堆“睡眠”连接。 如果你这样做,那么你的应用程序可能没有正确closures连接。 如果您使用持续连接,请停止它。 如果你看到很多查询说“locking”或“等待表”,你需要看看是否将表从MyISAM转换到InnoDB是一个选项。 最后,如果你只是有一些查询运行了几秒钟,你需要考虑优化这些(一个完全不同的问题),并确保你有足够的查询索引。 find需要索引的好方法是查看WHERE条件并使用EXPLAIN运行SELECT查询。
我看到的一个问题是在繁忙的站点上,而不是检查,并更新可供服务器使用的内存分配。
如果你只有一个简单的数据库(字面意思是几兆字节),那么你需要将innodb_buffer_pool_size从专用数据库服务器的默认值8MB更新到70-80%。 12G的16GB盒子是一个合理的build议,但是如果你的数据库只有几GB的磁盘空间,那么除非你认为数据量可能会显着增长,
Myisam表也有类似的设置,尽pipe很多人主要有innodb表(但是mysql内部的数据库通常只有myisam,所以它需要一些myisam key_buffer设置)。
添加一些关于数据库有多大的详细信息,以及数据库运行的服务器的规格(以及是否专用于该任务)将能够获得更多的帮助。