如何找到MySQL / PHP中“太多连接”错误的根本原因

时间:2010-04-15 09:33:10

标签: php mysql performance

我正在运行一项Web服务,该服务运行的算法每天为数百万次调用提供服务,并运行一些后台处理。 现在每次都看到“太多连接”错误试图连接到MySQL框“几秒钟。然而,这不一定归因于高流量时间或任何我可以把手指放在上面。

我想找到导致它的瓶颈。除了在特定时间发生这种情况之外,服务器在CPU和内存方面没有太多负载,并且有2-3个连接(线程)打开,一切运行顺利。 (我使用Zabbix进行监控)

有关如何追踪它的任何创意吗?

6 个答案:

答案 0 :(得分:6)

尝试在发生这种情况时安装一个开放的mysql控制台并发出

SHOW PROCESSLIST;
以查看正在执行的查询。 或者,您可以启用日志记录慢查询(在my.cnf中插入此行:

log-slow-queries=/var/log/mysql-log-slow-queries.log
并使用

set-variable=long_query_time=1
来定义查询应该采取的最短时间,以便将其视为慢速。 (记得重新启动mysql以使更改生效)

答案 1 :(得分:3)

您使用的是哪种MySQL表类型? MyISAM或InnoDB(或另一个)? MyISAM将使用表级锁定,因此您可能会遇到运行繁重的选择,然后在同一个表和许多选择查询上进行更新的情况。然后,最后的选择查询必须等到更新完成(这反过来必须等到第一个 - 重 - 选择完成)。

对于InnoDB,像innotop这样的工具可以帮助找到死锁的原因(参见http://www.xaprb.com/blog/2006/07/31/how-to-analyze-innodb-mysql-locks/)。

BTW导致锁定发生的查询应该是未处于锁定状态的查询之一。

答案 2 :(得分:2)

SHOW OPEN TABLES命令将显示MySQL中所有表的锁定状态。如果您的一个或多个查询导致连接重新锁定,则组合SHOW PROCESSLIST和打开的表应该缩小范围,以确切地确定哪个查询阻止了工作。

答案 3 :(得分:2)

老话题。但是,我刚刚遇到这个问题,因为我每天安排3次mysqldump脚本。在这些时候,如果我的Web应用程序也获得了相当多的使用量,那么当mysqldump锁定数据库中的所有表时,所有Web应用程序查询都将自己排在彼此之上。最好的选择是在单独的计算机上设置复制从站,并从从站而不是从生产服务器获取备份。

答案 4 :(得分:1)

可能与MySQL中针对FULLTEXT搜索的此错误有关: http://bugs.mysql.com/bug.php?id=37067

在这种情况下,FULLTEXT初始化实际上会挂起MySQL。不幸的是,似乎没有解决方案。

答案 5 :(得分:0)

一般情况下,不了解太多的实现和PHP,但是您确定对延迟的数据库连接没有任何问题吗?即使在请求处理完毕后仍保持打开的连接?

在PHP中,连接通常在脚本结束或调用mysql_close($conn);时自动关闭,但如果使用任何类型的本地连接池,则可能会引入问题。