我正在运行一个web服务,它运行每天服务数百万次调用的算法,还运行一些后台处理。每隔几秒钟,我就会在尝试连接到MySQL机器时看到“连接太多”的错误。然而,这并不一定是由于高流量时间或任何我能确定的原因。
我想找出导致它的瓶颈。除了发生这种情况的特定时间外,服务器在CPU和内存方面的负载不是太高,并且有2-3个连接(线程)打开,一切工作顺利。(我使用Zabbix进行监控)
如何追踪它有什么创造性的想法吗?
发布于 2010-04-26 17:27:58
您使用的MySQL表类型是什么?MyISAM还是InnoDB (或另一个)?MyISAM将使用表级锁定,因此您可能会遇到这样一种场景:运行繁重的select操作,然后对同一个表执行update操作,并执行大量select查询。然后,最后一个select查询将必须等待,直到更新完成(而更新又必须等待,直到first - heavy select完成)。
对于InnoDB来说,像innotop这样的工具可能有助于找到死锁的原因(参见http://www.xaprb.com/blog/2006/07/31/how-to-analyze-innodb-mysql-locks/)。
顺便说一句,导致锁定发生的查询应该是未处于锁定状态的查询之一。
发布于 2010-04-28 20:36:00
SHOW OPEN TABLES命令将显示MySQL中所有表的锁定状态。如果您的一个或多个查询导致了连接死锁,那么结合使用SHOW PROCESSLIST和打开的表应该可以缩小范围,找出是哪个查询阻止了工作。
发布于 2011-04-26 05:16:30
这是个老话题。然而,我只是遇到了这个问题,这是因为我有一个mysqldump脚本,每天安排3次。在这些时候,如果我的web应用程序也获得了相当多的使用量,那么所有的web应用程序查询都只是在mysqldump锁定数据库中的所有表的同时,将自己一个接一个地排成队列。最好的选择是在单独的机器上设置一个复制从属服务器,并从从属服务器而不是生产服务器获取备份。
https://stackoverflow.com/questions/2644132
复制相似问题