Heroku队列时间

时间:2013-05-24 13:48:49

标签: ruby-on-rails performance heroku

我昨天对我的Rails应用程序进行了负载测试,运行8个dynos,每个都有3个并发的Unicorn进程。这是New Relic输出:

newrelic

正如您所看到的,我的Rails堆栈本身具有相当好的响应时间(DB,Web等),但队列时间非常糟糕。

我该怎么办?这是Heroku性能中固有的,还是只是意味着我需要添加更多的dynos?

任何建议表示赞赏。

2 个答案:

答案 0 :(得分:4)

基本上,将问题分解为部分并测试每个部分。简单地在一群独角兽上抛出一堆请求不一定是衡量吞吐量的好方法。您必须考虑许多变量(旁注:"Programmers Need To Learn Statistics Or I Will Kill Them All"结帐Zed Shaw

此外,你要从你的问题中遗漏关键信息以解开这个谜团。

  • 每秒处理每个独角兽的请求数是多少?
  • 总测试有多长时间,你是否有时间为你必须预热的任何缓存?
  • 集合处理的请求总数是多少?
  • 我在图表中看到排队时间从图表左侧的最初峰值显着下降 - 任何想法为什么?这是创业时间吗?这个缓存变暖了吗?是否在测试开始时不成比例地提出大量请求?

你是唯一能回答这些问题的人。

排队时间,如果我正确理解Heroku的设置,基本上是新请求等待可用独角兽的时间(或者对于独角兽更准确,请求在被独角兽抓住之前需要多长时间)。如果您正在加载测试并为系统提供的功能超出了它的处理能力,那么当您的应用程序本身我的服务请求它已经准备好快速处理时,仍会有积压的请求等待可用的独角兽处理它。 / p>

根据您的原始设置,请在测试中尝试以下变量:

  • 相同数量的总请求,但运行时间更长,以查看缓存是否更热,并加快响应时间(即独角兽每秒处理更多请求)
  • 将每秒请求数量调整为可用的独角兽总数,包括向上和向下,并观察排队时间越来越差的阈值
  • 简化测试。首先,只测试一个单独的独角兽进程并计算出预热所需的时间,它可以处理的每秒请求数,以及排队时间因积压而开始增加的时间点。然后,添加独角兽进程并重复测试,试图找出是否有3个独角兽,你获得3倍的性能,或者是否有一些%的开销增加更多的独角兽(例如负载平衡传入请求的开销),以及是否开销可以忽略不计等等。
  • 确保请求非常相似。如果您有一些请求只是返回包含100%缓存和非动态内容的首页,那么您的处理时间将比需要生成可变数量的动态内容的请求短得多,这会使您的测试结果失效相当。

另外,请查看上面显示的测试结果图表是an average,还是带有95th percentilestandard deviations或其他测量结果。

只有在您将问题分解为其组成部分之后,您才知道是否有任何可预测性,是否添加更多的独角兽会有所帮助。看看这张基本图表并问:“我应该添加更多独角兽吗?”就像拥有一台慢速计算机并问:“我应该在我的机器上添加更多内存吗?”。虽然它可以帮助你跳过实际理解为什么某些东西很慢的步骤,并添加更多的东西,虽然它可能会有所帮助,但不会让你更深入地理解为什么它变慢。因为这个(特别是在heroku上),当你不需要它们时,你可能会为更多的dynos付出过高的代价,只要你能找到导致的根源的时间长于预期的排队时间你会变得更好。

这种方法当然不是heroku独有的。尝试实验,调整变量和记录结果测量将允许您挑选出这些性能数字内部的内容。理解“为什么”将使您能够采取特定的,受过良好教育的步骤,这些步骤应该对整体绩效产生可预测的影响。

在所有这些之后你可能会发现是的,在你的特定情况下提高性能的最好方法是添加更多的独角兽,但至少你会知道为什么和什么时候这样做,以及一个非常可靠的猜测要添加多少

答案 1 :(得分:0)

我基本上写了另一个问题,然后坐下来,意识到我刚刚在一周之前编辑过这个问题,并且知道两者的答案。

jefflunt说的基本上是100%真实,但是,因为我在这里,我在这里拼出来。

有2个解决方案:

  1. 添加更多Unicorn Workers。
  2. 减少请求的总交易时间。
  3. 它们基本上归结为相同的概念,但是:

    • 如果您每分钟有15k个交易,那么您每秒有250笔交易。
    • 如果您的平均交易时间为100毫秒,则每个工作人员每秒可执行10笔交易(其中1000毫秒/(100毫秒/交易))。
    • 如果你有8个dynos和3个工人,你就有24个工人。
    • 每秒10笔交易的24名工人意味着您当前的设置每秒可以产生大约240笔交易。

    当然,这只是如何衡量问题的最粗略的框架,特别是因为流量总是以某种方式加权,并且取平均值(超过中位数)通常是更好的衡量标准,因为你需要更多考虑到95%的要求,但是你要接近正确的数字,以了解你需要什么样的容量。