这不是典型的问题,但我没有想法,也不知道还能去哪里。如果有更好的地方可以问这个,请在评论中指出我。感谢。
我们有一个使用 Zend Framework 的Web应用程序,因此在 Apache Web服务器上运行 PHP 。我们使用 MySQL 进行数据存储,使用 memcached 进行对象缓存。
该应用程序具有非常独特的用法和加载模式。它是一个移动Web应用程序,每隔一个小时cronjob通过数据库查看有一些信息等待或操作的用户,并将此信息发送到(外部)通知服务器,将这些通知推送给他们。用户收到这些通知后,转到应用程序并使用它,主要是在很短的时间内。一个小时后,同样的事情发生了。
在过去几周内,该应用程序的使用率开始增长。在过去的几天里,我们在发送这些通知期间和之后遇到了非常高的负载和应用响应时间加倍(所以基本上每小时)。服务器不会崩溃或停止响应请求,它会变得越来越慢,通常需要20分钟才能恢复 - 直到整个小时再次开始同样的事情。
我们有广泛的监控(New Relic,collectd),但我无法弄清楚什么是错的;我找不到瓶颈。这就是你进来的地方:
你能帮我弄清楚什么是错的,也许可以解决这个问题吗?
服务器是16核Intel Xeon(我认为有8个超线程核心)和运行Ubuntu 10.04(Linux 3.2.4-20120307 x86_64)的12GB RAM。 Apache是2.2.x,PHP是版本5.3.2-1ubuntu4.11。
如果任何配置信息有助于分析问题,只需发表评论即可添加。
(对不起,这些图是GIF而不是相同的时间段,但我认为最重要的信息就在那里)
答案 0 :(得分:2)
问题几乎可以肯定是基于MySQL的。如果查看最终图形mysql / mysql_threads,您可以在20:00看到线程数达到200(我假设是max_connections的设置)。一旦max_connections被击中,事情往往需要一段时间才能恢复。
使用mtop在一小时之前监控MySQL将真正帮助您弄清楚发生了什么,但如果您无法安装,则可以使用SHOW PROCESSLIST;
。在问题发生之前,您需要建立与mysql的连接。您可能会看到许多进程排队,当前只有1个进程正在执行。这将是最可能的罪魁祸首。
确定导致问题的查询后,您可以攻击代码。如果不了解应用程序的实际工作方式,我最好的猜测是使用围绕问题查询的显式事务可能会解决问题。
祝你好运!