我昨天对我的Rails应用程序进行了负载测试,运行8个dynos,每个都有3个并发的Unicorn进程。这是New Relic输出:
正如您所看到的,我的Rails堆栈本身具有相当好的响应时间(DB,Web等),但队列时间非常糟糕。
我该怎么办?这是Heroku性能中固有的,还是只是意味着我需要添加更多的dynos?
任何建议表示赞赏。
答案 0 :(得分:4)
基本上,将问题分解为部分并测试每个部分。简单地在一群独角兽上抛出一堆请求不一定是衡量吞吐量的好方法。您必须考虑许多变量(旁注:"Programmers Need To Learn Statistics Or I Will Kill Them All"结帐Zed Shaw)
此外,你要从你的问题中遗漏关键信息以解开这个谜团。
你是唯一能回答这些问题的人。
排队时间,如果我正确理解Heroku的设置,基本上是新请求等待可用独角兽的时间(或者对于独角兽更准确,请求在被独角兽抓住之前需要多长时间)。如果您正在加载测试并为系统提供的功能超出了它的处理能力,那么当您的应用程序本身我的服务请求它已经准备好快速处理时,仍会有积压的请求等待可用的独角兽处理它。 / p>
根据您的原始设置,请在测试中尝试以下变量:
另外,请查看上面显示的测试结果图表是an average,还是带有95th percentile的standard deviations或其他测量结果。
只有在您将问题分解为其组成部分之后,您才知道是否有任何可预测性,是否添加更多的独角兽会有所帮助。看看这张基本图表并问:“我应该添加更多独角兽吗?”就像拥有一台慢速计算机并问:“我应该在我的机器上添加更多内存吗?”。虽然它可以帮助你跳过实际理解为什么某些东西很慢的步骤,并添加更多的东西,虽然它可能会有所帮助,但不会让你更深入地理解为什么它变慢。因为这个(特别是在heroku上),当你不需要它们时,你可能会为更多的dynos付出过高的代价,只要你能找到导致的根源的时间长于预期的排队时间你会变得更好。
这种方法当然不是heroku独有的。尝试实验,调整变量和记录结果测量将允许您挑选出这些性能数字内部的内容。理解“为什么”将使您能够采取特定的,受过良好教育的步骤,这些步骤应该对整体绩效产生可预测的影响。
在所有这些之后你可能会发现是的,在你的特定情况下提高性能的最好方法是添加更多的独角兽,但至少你会知道为什么和什么时候这样做,以及一个非常可靠的猜测要添加多少。
答案 1 :(得分:0)
我基本上写了另一个问题,然后坐下来,意识到我刚刚在一周之前编辑过这个问题,并且知道两者的答案。
jefflunt说的基本上是100%真实,但是,因为我在这里,我在这里拼出来。
有2个解决方案:
它们基本上归结为相同的概念,但是:
当然,这只是如何衡量问题的最粗略的框架,特别是因为流量总是以某种方式加权,并且取平均值(超过中位数)通常是更好的衡量标准,因为你需要更多考虑到95%的要求,但是你要接近正确的数字,以了解你需要什么样的容量。