成功将性能更新到 Web 应用,但不知道原因。如何找出答案?


这是一个

奇怪的标题,所以让我解释一下:

我们有一个非常成功的Web应用程序(PHP,Zend Framework(。随着时间的推移,流量增长,性能下降(数十个请求(80 毫秒的数十个请求到平均>600 毫秒的数万个请求(。我们在最初设计应用程序时没想到会有这么多流量,所以没有什么大不了的惊喜。我们决定研究许多可以提高性能的东西。

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

但是,是的,它在生产中做到了。我们的图表几乎为零,我们完全被摧毁了,更新以某种方式使所有流量消失。但当我们仔细观察时,图表又回到了80毫秒,在600毫秒的山脉旁边几乎看不见;)

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

您将如何解决这个问题?

一些背景:

  • PHP应用程序使用Zend Framework,MySQL作为数据库,Memcache进行缓存。
  • 我们从 NewRelic.com 那里获得了性能图表和对应用程序的见解,但我真的找不到那里性能更好的原因。
  • 使用 jMeter,我们可以在我们的开发服务器上重现糟糕的性能,并且或多或少可以重现更新版本的更好性能。

我现在唯一的想法是从旧版本开始,对其进行负载测试,添加一个提交,对其进行负载测试,添加另一个功能,对其进行负载测试......但这听起来并不有趣或非常有效。


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


更新2:将添加解决方案和查找它作为答案的方法。

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

通过探查器运行它将显示执行流的细分、调用的所有方法、它们花费的时间以及您使用的内存量。 探查器应显示某些代码块是否被多次调用,或者是否有某些代码有时只需要很长时间才能执行。

如果您确实看到来自探查器的 20 毫秒响应,那么我会在后台运行负载测试器,同时在另一台机器上进行分析,看看重负载是否似乎解释了某些时间增加,如果是这样,究竟需要什么时间更长。

对我来说,这是查看什么需要这么长时间的最简单方法,而不是加载不同版本的代码并查看它们需要多长时间。 这样做,你至少知道哪个分支有速度问题,但是你仍然需要寻找为什么它需要这么长时间,因为它可能不像某些代码被更改或优化那么简单。 它可能是事物的组合。

我使用Zend Studio进行分析,该功能可以节省大量时间。 XDebug的剖析器非常相似。

文档:

http://files.zend.com/help/Zend-Studio/profiling.htmhttp://xdebug.org/docs/profiler

理想情况下,您需要使用相同的实际数据分析旧版本的应用程序和新版本的应用程序,但我不知何故怀疑您是否有时间或倾向这样做。

您可以做的是首先将您重写的数据库查询的效率与以前的版本进行比较,同时查看它们的调用频率等,以及您引入的缓存对此有何影响。

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

那么问题出在哪里呢?MySQL 查询中的两个附加 '。他们意外地进入方法的数字值是一个字符串,所以ORM在它周围使用了'。通常这些问题会被优化器捕获,但在这种情况下,它是一个相当复杂的 JOIN 组合,也许这就是它被遗漏的原因。因为这也是最常用的查询,所以每次执行它的速度都慢一点 - 但这最终使一切变得不同。

当您根本无法再优化和本地扩展时,请查看此处:

http://www.zend.com/en/products/php-cloud/

相关内容

最新更新