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