这是一个奇怪的标题,所以让我解释一下:
我们有一个非常成功的Web应用程序(PHP,Zend Framework)。随着时间的推移,流量增加,性能下降(数十个请求,80毫秒到数万个请求,平均值> 600毫秒)。在第一次设计应用程序时,我们没有想到这么多的流量,所以没什么大惊喜。我们决定研究许多可以改善性能的事情。
经过几天努力后,出现了需要修复的生产错误。由于我们为清理一些查询和缓存代码所做的第一次更改已经完成并经过测试,我们认为我们可以将这些添加到更新中。在本地测试和分期中,这些变化都没有真正改善性能,但无论如何。
但是,它确实在生产上。我们的图形几乎为零,我们完全被破坏,更新以某种方式使所有流量消失。但是当我们仔细观察时,图表会回到80毫秒,而在600毫米山脉旁边几乎看不见;)
所以我们通过一些变化完全解决了性能问题,我们甚至认为不会有所作为。总的来说,但当然我们想要了解这些变化中的哪些因素有所不同。
你会如何解决这个问题?
一些背景知识:
我现在唯一的想法是从旧版本开始,加载测试,添加一个提交,加载测试,添加另一个功能,加载测试...但这听起来没有任何乐趣或非常有效。< / p>
更新:我们找到了性能问题的原因,我稍后会添加一个答案来解释我们做了什么以及原因是什么。 (或者如何处理这些问题的更新和解决方案?)
更新2:将添加解决方案并将其作为答案进行查找。
答案 0 :(得分:1)
我认为最简单的方法是使用XDebug或Zend Studio调试您的应用程序。
通过分析器运行它将显示执行流程的细分,所有调用的方法,花费的时间以及使用的内存量。探查器应该揭示是否多次调用某些代码块,或者是否有时需要很长时间才能执行。
如果你确实看到了来自探查器的20毫秒响应,那么我会在后台运行一个负载测试器,而我在不同的机器上进行分析,看看是否有重负载可以解释一些时间的增加,如果是,那么确实需要更长时间。
对我来说,这是查看花费这么长时间的最简单方法,而不是加载不同版本的代码并查看它们需要多长时间。这样做,你至少知道哪个分支有速度问题,但是你仍然需要寻找它为什么需要它,只要它可能不像一些代码被改变或优化那么简单。它可能是一种组合。
我使用Zend Studio进行性能分析,并且使用该功能节省了大量时间。 XDebug的剖析器与AFIK非常相似。
文档:
http://files.zend.com/help/Zend-Studio/profiling.htm
http://xdebug.org/docs/profiler
答案 1 :(得分:1)
理想情况下,您需要使用相同的实际数据来分析应用程序的旧版本和应用程序的新版本,但我怀疑您是否有时间或倾向于这样做。
您可以做的是首先将您重写的数据库查询的效率与之前的版本进行比较,还要查看它们被调用的频率等等,以及您引入的缓存有什么影响在那。
我还要做的是改变流程,以便您将更改作为流程(持续集成/部署样式)引入,以便您可以更清楚地看到各个更改的影响。
答案 2 :(得分:1)
那是什么问题? MySQL查询中的另外两个'。它们在方法中的数值意外地是一个字符串,因此ORM使用了它。通常情况下,优化器会捕获这些问题,但在这种情况下,它是一个非常复杂的JOIN组合,也许这就是错过它的原因。因为这也是最常用的查询,所以每次执行它都会慢一点 - 但这最终会产生很大的不同。
答案 3 :(得分:0)
如果您无法再进行优化和本地扩展,请查看此处: