我认为你有一个查询,锁定一个表/一些其他mysql连接尝试更新的行超过它应该更新.当发生这种情况时,所有传入的请求都会叠加在它后面,直到你达到最大连接数.
由于请求进入并且没有收到响应(由于数据库上的查询被阻止),Apache端也发生了同样的情况. PHP与数据库有一个开放的连接;它已经提出了一个查询,但尚未收到回复. Apache正在等待答案,因此你可以期待它做什么.
Apache似乎挂在外面(您的浏览器/移动应用程序/等),因为所有服务器上可用的所有子服务器都在等待数据库回复.实际上没有更多可用的连接. (这也可能是您的负载均衡器上设置的连接限制).如果您还没有,请在负载均衡器上开始记录状态更改.当“雷鸣般的群体”问题(稍后解释)发生时,您可能会看到每个Web服务器反复上下移动.
我相信您在CLOSE_WAIT中的连接是一种症状,而不是问题.在我处理更明显的可能问题(数据库)之前,我不会花费任何时间来解决这个问题.一旦你解决了大量CLOSE_WAIT将会消失的可能性.
要在数据库端开始故障排除,您应该启用slow query log(如果尚未启用).让它记录请求超过1秒左右,看看出现问题时会出现什么.
注意:在查询完成之前,慢查询日志不会记录查询.不要假设问题开始时出现的第一个查询是问题查询.它可能是也可能不是.
现在,一旦有问题的查询阻止其他查询完成,您可能会期望网站恢复正常…
不是这样.如果您有500个请求/秒定期进入并且可以处理总共1000个请求/秒,并且您的查询将数据库锁定10秒钟.除了500 /秒之外,现在还有5,000个请求处理等待处理.这被称为Thundering Herd problem.
您的问题可能完全不同,但这些问题与我多次处理的问题完全相同,在大多数情况下,问题是阻止其他查询的数据库查询.唯一的另一次我遇到这个问题不是由于数据库是在CentOS上(RHEL也有问题)6.不幸的是,Red Hat有知识库文章讨论这个问题仅供订阅者使用,但还有其他参考如果你搜索他们周围.如果你认为这种情况可能就是这样的话,那就很容易测试了.你只需要add a single line to your resolv.conf.
如果问题似乎出现在相同/接近当天发生的同一时间
你应该检查你的cron作业(或其他任何按照设定的时间表运行)以查看是否正在从中发送问题查询.
最后,如果您确定您被雷鸣般的群体问题所困扰,我建议您对负载均衡器设置限制.您应该对服务器进行基准测试,以大致确定它可以同时处理的最大请求数,并限制负载均衡器超过每个后端Web服务器的连接数.
祝好运.