如何找出是什么原因导致该服务器上的应用程序变慢?

这不是典型的服务器故障问题,但是我没有想法,也不知道要去哪里。 如果有更好的地方可以提出这个问题,请在评论中指出。 谢谢。


情况

我们有这个使用Zend Framework的 Web应用程序,所以在Apache Web服务器上运行PHP 。 我们使用MySQL进行数据存储,使用memcached进行对象caching。

该应用程序有一个非常独特的使用和加载模式。 这是一个移动的web应用程序,cronjob每过一个小时,通过数据库查看有一些信息等待或行动的用户,并将这些信息发送给(外部)通知服务器,将这些通知推送给他们。 在用户得到这些通知之后,转到应用程序并使用它,大多数时间很短。 一个小时后,同样的事情发生。

问题

在过去的几个星期里,应用程序的使用真正开始增长。 在过去几天里,我们在发送这些通知的过程中和之后 (基本上每个小时)遇到了非常高的负载和应用程序响应时间的两倍。 服务器不会崩溃或停止响应请求,它会变得越来越慢,往往需要20分钟才能恢复 – 直到同样的事情在整个小时再次启动。

我们有广泛的监测(New Relic,collectd),但是我弄不清楚有什么问题; 我找不到瓶颈。 这就是你进来的地方:

你能帮我弄清楚什么是错的,也许如何解决它?


附加信息

该服务器是一个16核心的英特尔至强(8核与超线程,我认为)和12GB内存运行Ubuntu 10.04(Linux 3.2.4-20120307 x86_64)。 Apache是​​2.2.x,PHP是5.3.2-1ubuntu4.11。

如果有任何configuration信息可以帮助分析问题,只需发表评论,我会添加它。

图表

信息

  • phpinfo()函数
  • APC状态
  • memcache状态

collectd

  • stream程
  • 中央处理器
  • 阿帕奇
  • 加载
  • MySQL的
  • 平Vmem
  • 磁盘

新的遗物

  • 应用性能
  • 服务器概述
  • stream程
  • networking
  • 磁盘

(对不起,图表是GIF和不同的时间段,但我认为最重要的信息在那里)

不幸的是,很难find你的问题的直接解决scheme,特别是没有系统pipe理员。 这说我认为你至less可以解决(从长远来看)内存饥饿的Apache – 从你的遗物报告似乎 – 与Nginx的+ Apache + PHP的扩大你的应用程序的速度相当见http:// http://www.richweb.com/nginx或简单search谷歌/问你的系统pipe理员。 当你使用Zend框架时,你也可以考虑Zend Server http://www.zend.com/en/products/server/

对不起,如果这些想法似乎有点通用,并没有解决你的眼前的问题,但从长远来看,这可以为您提供一个很好的解决scheme。

另一个build议是,如果你的应用程序在将来会扩展,你可能会考虑testing你在amazon EC2 http://aws.amazon.com/ec2/上的相同设置。这会给你一些好处,比如:

  1. 可伸缩性:您可以运行一个主实例并将其克隆到第二个实例,以便在需要时随时运行(例如,某些操作比较慢,您希望查看它是否与第二个实例相同),或者使用两个实例和一个负载平衡。
  2. 克隆:使用传统的服务器克隆所有内容并在几分钟内启动并运行相当复杂。 有了EC2,你就有了这个优势。
  3. 简单:使用新的基于EC2网页的界面,你不需要你的系统pipe理员启动一个新的实例,并用一个新的IP(可以随时分配)进行testing。

这可能听起来像是一个随机的build议,不能解决你的问题,但是从个人经验来看,有时可能扩大规模成为你生意成长的关键。

只需一个系统pipe理员可以帮助你,立即为你提供帮助。 如果你想雇佣一个,你可能会考虑https://www.odesk.com,但你需要select一个可靠的,有很好的反馈。 如果你只想要一个顾问而不需要pipe理员进入你的服务器,我相信你可以find几个非常合理的价格(20/30美元/小时),给你一些反馈。

一般来说,Serverfault并不是IT外包的顾问。 我们设置回答技术性问题,这些问题既具体可以回答),也可以回答一般性问题 (因为提供的答案可能对未来有同样问题的人有用,并可能在互联网上search他们的问题,并会发现你的问题,答案将帮助他们)。 不幸的是,你的问题在两方面都失败了。

我会给你一定数量的信用,至less提供一个有用的诊断信息块,这使得你在问这样的问题的人最高的1%。 但是,这并不能改变这个问题基本上是“为我做我的工作”,这是相当粗鲁的事实。

我唯一有用的答案就是找一个顾问。 根据你对问题的描述,我的期望是,你最终需要重新构build你的应用程序,可能涉及到拆分一个数据库读取从属,并使用一个单独的机器来处理asynchronous通知。 我还会考虑切换到实时工作队列,以便应用程序不需要漫游整个数据库,或者至lessconfiguration数据库中的一些索引和/或重新进行查询以检索该数据库信息更有效率。 有能力的顾问应该能够通过绩效衡量标准来分析你的情况,并且检查代码和系统操作,并且提供实施它们的build议和帮助。 我为托pipe公司提供所有这些服务作为我们支持包的一部分,但仅限于托pipe给我们的客户,所以我不能自己提供这些types的特别约定(除非您要切换您的托pipe…)