确定 MySQL 设置

确定 MySQL 设置

我们现在正在运行一个服务器,MySQL 数据库经常崩溃。我们知道我们需要为 MaxClients 和 MaxRequestsPerChild 找到良好的设置,因为我们有大量的流量,当流量激增时,数据库就会崩溃。

是否存在一个好的经验法则或公式可以帮助我们解决这个问题?

答案1

我认为肯定存在一些混淆。MaxClients 和 MaxRequestsPerChild 是 Apache 设置,而不是 MySQL。MySQL 有 max_connections,它类似于 MaxClients,但没有与 MaxRequestsPerChild 等效的设置。

您所说的“关闭”是什么意思?如果 mysqld 死机(您在 mysql 错误日志中看到了什么?),那么您应该调低某些设置(可能是您在 Apache 中谈论的设置)。如果 mysqld 只是因为连接太多而拒绝连接,您可以尝试调高 max_connections(它的默认值仅为 100;如果您使用的是默认值,也许可以尝试 200)。

答案2

如果您的站点很繁忙,需要建立大量连接,则需要密切关注 MySQL 中的线程数和连接数。(它们几乎相同,但不完全相同。)

如果运行SHOW PROCESSLIST显示大量“休眠”线程,并且持续时间为几秒,则需要降低变量wait_timeout,可能要降低很多,因为它默认为几分钟,而大多数网页在几秒钟内就结束。

查看状态threads_created并查看它是否随着时间的推移而快速上升会很好。如果是这样,您需要提高变量thread_cache_size。我也会查看状态Opened_tables。如果它不断上升,您应该提高变量Table_cache。这两者都是 MySQL 中繁忙数据库的基本性能改进。

您还应该在 Apache 和 MySQL 上设置 Munin 或 Cacti 或其他性能监控工具。Apache 还有一个扩展状态监控页面,可帮助您了解如何调整其子/线程设置。

答案3

我只是在这里猜测,但是您是否运行了具有太多连接的 32 位操作系统?

MySQL 是多线程的,每个连接使用一个线程。每个线程使用一些内存作为其堆栈和各种其他缓冲区(数量众多且大部分可调)。

地址空间耗尽将导致 32 位系统中的 MySQL 崩溃。

解决方案是:

  1. 将最大连接数设置为合理的水平,以免耗尽地址空间
  2. 运行 64 位服务器

如果可能的话,我建议使用第二种方法,除了米老鼠的情况。如果可以的话,不要在 32 位操作系统上部署任何新应用程序。

答案4

您需要确定数据库达到最大连接数的原因。通常,问题不是 MySQL 达到最大连接数,而是其他问题的征兆。

使用 Apache 和 MySQL 设置很容易过度使用内存资源。查看mysqltuner阿帕奇伙伴了解您是否可能内存不足。如果您的服务器必须进行交换,这表明您需要加快数据库查询和应用程序的执行速度、添加更多内存或将 MySQL 和 Apache 拆分到单独的服务器上(如果您还没有这样做)。

您可能有 sar 日志可以为您提供有关服务器资源利用率的一些信息。

显示处理器利用率:

# sar

显示内存利用率:

# sar -r

您还可以使用该-f /var/log/sa/sa##标志指定前一天的 sar 日志。

最后,当数据库连接达到最大值时,您应该登录 MySQL 并查看发生了什么。

mysql> SHOW FULL PROCESSLIST;

这将为您提供 MySQL 在给定时间处理的所有进程的列表。特别是,您想查看是否有一堆“休眠”连接。如果有,那么您的应用程序很可能没有正确关闭连接。如果您使用的是持久连接,请停止它。如果您看到很多查询显示“已锁定”或“正在等待表”,则需要查看是否可以将表从 MyISAM 转换为 InnoDB。最后,如果您只有一些运行时间超过几秒钟的查询,则需要考虑优化这些查询(一个完全不同的问题)并确保您的查询有足够的索引。发现需要索引的地方的一个好方法是查看您的 WHERE 条件并使用 运行SELECT查询EXPLAIN

相关内容