Performance 已成功更新web应用程序的性能,但不';我不知道为什么。如何找到答案?

Performance 已成功更新web应用程序的性能,但不';我不知道为什么。如何找到答案?,performance,zend-framework,optimization,jmeter,Performance,Zend Framework,Optimization,Jmeter,这是一个奇怪的标题,让我解释一下: 我们有一个非常成功的web应用程序(PHP、Zend Framework)。随着时间的推移,流量不断增长,性能不断下降(数十个请求的平均时间为80毫秒到十分之一,请求的平均时间>600毫秒)。在第一次设计应用程序时,我们没有预料到会有这么多的流量,所以没有什么大的意外。我们决定研究许多可以提高性能的东西 经过几天的努力,出现了一个需要修复的生产缺陷。由于我们为清理一些查询和缓存代码所做的第一次更改已经完成并经过测试,我们认为我们可以将它们添加到更新中。在本地测

这是一个奇怪的标题,让我解释一下:

我们有一个非常成功的web应用程序(PHP、Zend Framework)。随着时间的推移,流量不断增长,性能不断下降(数十个请求的平均时间为80毫秒到十分之一,请求的平均时间>600毫秒)。在第一次设计应用程序时,我们没有预料到会有这么多的流量,所以没有什么大的意外。我们决定研究许多可以提高性能的东西

经过几天的努力,出现了一个需要修复的生产缺陷。由于我们为清理一些查询和缓存代码所做的第一次更改已经完成并经过测试,我们认为我们可以将它们添加到更新中。在本地测试和登台过程中,所有这些更改都没有真正提高性能,但无论如何

但是,是的,它在生产中起了作用。我们的图表几乎为零,我们完全被破坏了,因为更新不知何故使所有的流量消失了。但当我们走近观察时,这些图又回到了80毫秒,在600毫秒的山脉旁边几乎看不见;)

所以我们通过一些改变完全解决了性能问题,我们甚至认为这不会有什么不同。完全成功,但我们当然想了解这些变化中的哪一个造成了不同

你将如何解决这个问题

一些背景:

  • PHP应用程序使用Zend框架,MySQL作为数据库,Memcache作为缓存
  • 我们从NewRelic.com获得了性能图和对应用程序的深入了解,但我无法真正找到性能更好的原因
  • 使用jMeter,我们可以在我们的开发服务器上重现糟糕的性能,也可以或多或少地重现更新版本的更好性能
我现在唯一的想法是从旧版本开始,loadtest it,添加一个commit,loadtest it,添加另一个特性,loadtest it。。。但这听起来既不有趣也不十分有效


更新:我们找到了性能问题的原因,稍后我将添加一个答案来解释我们做了什么以及原因是什么。(或如何处理此类问题的更新和解决方案?)



更新2:将添加解决方案和找到答案的方法。

我认为最简单的方法是使用XDebug或Zend Studio调试应用程序

在分析器中运行它将显示执行流的分解,以及调用的所有方法,它们花费了多长时间,以及使用了多少内存。探查器应该揭示某个代码块是否被多次调用,或者是否有某些东西有时只是需要很长时间才能执行

如果您确实看到探查器发出20毫秒的响应,那么我会在后台运行负载测试仪,同时在另一台机器上进行探查,以查看重载是否可以解释某些时间增加的原因,如果是的话,到底需要多长时间

对我来说,这是最简单的方法来了解什么花费了这么长的时间,而不是加载不同版本的代码并查看它们花费了多长时间。这样做,您至少知道哪个分支存在速度问题,但您仍然需要找出原因,因为它可能不像某些代码被更改或优化那样简单。这可能是多种因素的结合

我使用Zend Studio进行评测,这项功能大大节省了时间。XDebug的分析器与AFIK非常相似

文档:


当您无法再进行优化和本地扩展时,请查看以下内容:


理想情况下,您需要使用相同的真实数据来分析旧版本的应用程序和新版本的应用程序,但我怀疑您是否有时间或意愿这样做

您可以做的是,首先比较您编写的DB查询与以前版本的效率,还可以查看它们被调用的频率等,以及您引入的缓存对此有何影响


我还想做的是改变未来的流程,以便将更改作为一个流程(持续集成/部署样式)引入,以便您可以更清楚地看到单个更改的影响。

那么问题出在哪里?MySQL查询中的两个额外的'。他们意外地将数值输入到方法中是一个字符串,因此ORM在其周围使用了“环绕”。通常情况下,优化器会发现这些问题,但在本例中,这是一个相当复杂的连接组合,也许这就是它被忽略的原因。因为这也是最常用的查询,它的每次执行都会稍微慢一点——但这最终会造成所有的不同。

分析是最明显的答案之一,问题是我们不知道哪些请求更快——根据我们的渲染时间统计,所有请求都更快!所以我不认为这会在事后有所帮助。我会把一个旧版本放回去,它有一些缓慢的请求,看看你是否能确定有时花了这么长时间的原因。顺便说一句,图表时间只是用来计时PHP执行所需的时间,还是用来计算到某个服务器的往返时间?我想知道你是不是在网络上遇到了瓶颈或者其他什么。我们看了旧版本,但是当然有很多不好的地方。即使在更好的版本中,也有很多可怕的事情。这就是大海捞针:(我们有几个指标,一个是应用程序渲染时间(php+mysql+memcache),另一个是终端用户监控(网络时间等等),当然还有对所有服务器组件(mem、cpu、磁盘和网络)的监控)。没有任何东西可以说明为什么它现在快了这么多。感谢链接,但实际上扩展一点问题都没有。请看,我们这样做甚至是偶然的:P我们的问题有时是,了解许多更改中的哪些触发了更好的性能。我们正是根据彼此分析2版本