sse*_*nse 5 mysql php apache-2.2
首先,这里有一些上下文。
我们有一个自定义构建的 PHP 应用程序,它在 Apache 下运行并支持我们的网站。
我们目前在我们的网站上遇到高流量。这是我们当前的设置: - 负载均衡器后面的 10 个 linux Web 服务器(每个服务器有 8 个 CPU,30Go RAM) - 1 个 linux mysql 数据库服务器(30 个 CPU,120 个 Go RAM)
大部分时间流量保持良好,但有时出于不确定的原因,我们看到活动 mysql 连接总数激增。它一直在泄漏,直到达到最大值并最终导致我们的 Web 用户无法使用该应用程序。
发生这种情况时,在平均负载、内存、CPU 使用率、磁盘交换方面,所有服务器都很好。他们有很多可用的资源。
我们确实注意到有许多 Apache 进程具有 CLOSE_WAIT 连接状态。我们在其中一台 Web 服务器中看到了大约 600 个处于该状态的进程。
这似乎是我们遇到的问题的征兆。但是,我们很难深入挖掘。这是我的问题:
提前感谢您的帮助,
小智 7
我认为您有一个查询正在锁定其他 mysql 连接尝试更新的表/某些行的时间比应有的更长。当这种情况发生时,所有传入的请求都会堆积在它后面,直到达到最大连接数为止。
由于请求传入但未收到响应(由于查询在数据库上被阻止),Apache 端也会发生同样的情况。PHP 有一个到数据库的开放连接;它已提出查询,但尚未收到答复。Apache 在这一点上“挂起”是您期望它做的事情,因为它正在等待答案。
Apache 似乎从外部(您的浏览器/移动应用程序/等)挂起,因为所有服务器上可用的所有子项都在等待数据库回复。实际上没有更多可用的连接。(这也可能是您的负载均衡器上设置的连接限制)。如果您还没有,请开始记录负载均衡器上的状态更改。您可能会看到您的每台 Web 服务器在出现“雷鸣般的群”问题(稍后解释)时反复启动和关闭。
我相信您在 CLOSE_WAIT 中的连接是一种症状,而不是问题。在我解决了更明显的可能问题(数据库)之前,我不会花任何时间尝试解决该角度的问题。很有可能一旦您修复了大量 CLOSE_WAIT 就会消失。
要开始在数据库端进行故障排除,您应该启用慢查询日志(如果您还没有这样做的话)。让它记录请求超过 1 秒左右,看看出现问题时会显示什么。
注意:在查询完成之前,慢查询日志不会记录查询。不要假设问题开始时出现的第一个查询就是问题查询。它可能是也可能不是。
现在,一旦阻止其他查询的有问题的查询完成,您可能希望网站恢复正常......
不是这样。如果您有 500 个请求/秒定期进入并且可以处理总共 1000 个请求/秒并且您的查询将数据库锁定 10 秒。现在有 5,000 个请求 WAITING 需要处理,此外还有 500 个/秒的请求仍在进入。这被称为Thundering Herd 问题。
您的问题可能完全是其他问题,但这些症状与我多次处理过的问题完全相同,在大多数情况下,问题是数据库查询阻塞了其他查询。我唯一一次遇到这个不是由于数据库引起的问题是在 CentOS 上(RHEL 也有这个问题) 6. 不幸的是,Red Hat 有讨论这个问题的知识库文章仅供订阅者使用,但还有其他参考资料如果你搜索他们。如果您认为可能是这种情况,那么测试起来非常容易。您只需要在 resolv.conf 中添加一行。
如果问题似乎在当天的同一时间/接近同一时间出现,您应该检查您的 cron 作业(或其他任何按既定计划运行的作业),以查看是否正在从该作业发送问题查询.
最后,如果您确实确定自己被雷鸣般的羊群问题所困扰,我建议您对负载均衡器设置限制。您应该对服务器进行基准测试,以确定它可以同时处理的最大请求数,并限制负载平衡器超过与每个后端 Web 服务器的连接数。
祝你好运。
| 归档时间: |
|
| 查看次数: |
6064 次 |
| 最近记录: |