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

如何找到“问题”的根本原因;“连接太多”;MySQL/PHP中的错误,php,mysql,performance,Php,Mysql,Performance,我正在运行一个web服务,它运行的算法每天为数百万个调用提供服务,并运行一些后台处理。 在尝试连接MySQL的几秒钟中,我不时会看到“连接太多”的错误。然而,这并不一定是由于高流量时间或任何我可以指出的原因 我想找出导致它的瓶颈。除了在特定的时间发生这种情况外,服务器的CPU和内存没有太大的负载,并且有2-3个连接(线程)打开,并且一切工作都很顺利。(我使用Zabbix进行监视) 关于如何跟踪它有什么创造性的想法吗?当出现这种情况时,尝试打开mysql控制台,并发出一个命令,查看执行的是什么查询

我正在运行一个web服务,它运行的算法每天为数百万个调用提供服务,并运行一些后台处理。 在尝试连接MySQL的几秒钟中,我不时会看到“连接太多”的错误。然而,这并不一定是由于高流量时间或任何我可以指出的原因

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


关于如何跟踪它有什么创造性的想法吗?

当出现这种情况时,尝试打开mysql控制台,并发出一个命令,查看执行的是什么查询。
SHOW PROCESSLIST;
或者,您可以启用日志记录慢速查询(在my.cnf中插入此行:

log-slow-queries=/var/log/mysql-log-slow-queries.log

在[mysqld]部分中,使用set variable=long\u query\u time=1定义一个查询被认为是慢的最短时间。(记住重新启动mysql以便更改生效)

您使用的mysql表类型是什么?MyISAM或InnoDB(或其他)?MyISAM将使用表级锁定,因此您可能会遇到这样一种情况,即运行大量select,然后更新同一个表和大量select查询。最后一个select查询将不得不等待更新完成(这反过来又必须等待第一个-大量-select完成)

set-variable=long_query_time=1 对于InnoDB,像innotop这样的工具可能有助于找到死锁的原因(请参阅)


顺便说一句,导致锁定发生的查询应该是未处于锁定状态的查询之一。

该命令将显示MySQL中所有表的锁定状态。如果一个或多个查询导致连接反向锁定,则组合
SHOW PROCESSLIST
,打开的表应缩小范围,以确定要执行的查询暂停工作。

不太了解您的实现和PHP,但您确定延迟的DB连接没有任何问题吗?例如,即使在处理请求后仍保持打开的连接


在PHP中,当脚本结束或调用
mysql\u close($conn);
时,连接通常会自动关闭,但如果使用任何一种自制的连接池,这可能会带来问题。

可能与mysql全文搜索中的此错误有关:


在本例中,全文初始化实际上挂起了MySQL。不幸的是,似乎没有解决方案。

旧主题。但是,我刚刚遇到了这个问题,这是因为我有一个mysqldump脚本,每天计划3次。在这些时候,如果我的web应用程序也得到了相当多的使用,那么所有的web应用程序都会被删除当mysqldump锁定数据库中的所有表时,eries只是将自己排在彼此的最前面。最好的选择是在单独的机器上设置复制从机,并从从从机而不是从生产服务器获取备份。

您能在非生产机器上重现此问题吗?您有压力吗ss测试环境,具有合适的硬件盒和可以模拟生产负载的驱动程序系统?如果没有,请尽快获得一个。否则,您将不得不尝试在生产中调试它,这将涉及到执行高风险操作,如打开general query log.Update-我已成功运行SHOW PROCESSLIST,而出现连接问题。我得到的是:总共151个查询的列表(my num connections设置为150)。其中2个来自我的电脑(show processlist)其余的都是时间值为374-395的查询命令,它们的状态是锁定的,除了一个状态是全文的3个查询是更新的,其余的都是选择的。我怎么能理解是什么导致了锁定?很难说问题的原因是什么,但我很确定这是一个占用系统的查询。试着看看是哪个在这之后,只需要创建正确的索引和优化查询,但是这里没有人能够在不查看模式和查询的情况下确切地告诉您该怎么做MyISAM中的My表+一些内存表。SHOW PROCESSLIST给了我很多问题处于锁定状态的查询和处于全文初始化状态的查询。后者具有最低的进程id。是否确定与此进程关联的查询是锁定的查询?应该是,处于锁定状态的查询正在等待其他查询完成。在错误发生时,我已经显示了打开的表。我得到了表名148 0,对吗t假设该表是锁定的表?并且所有连接在查询该表时都被阻塞?'148'表示该特定表上有148个锁处于活动状态和/或挂起状态。如果是InnoDB,这没什么大不了的,因为该引擎可以执行行级锁定,但如果是MyISAM,这是一个大问题,因为它只能执行表级锁定。如果是InnoDB,则是y您可以通过
显示INNODB状态
查看活动查询/锁定的内容。部分输出是查询和错误/锁定列表。