-->

在Heroku奇怪TTFB(时间到第一个字节)的问题(Strange TTFB (time to f

2019-07-31 06:35发布

我们在改善我们的轨道在Heroku的应用程序托管的性能的过程(3.2.8导轨和Ruby 1.9.3)。 在此期间,我们已经遇到其源似乎是非常难以追踪一个令人担忧的问题。 让我赶紧解释我们是如何遇到问题,我们已经如何试图将其隔离。

-

自六月左右,我们已经经历了时间第一个字节怪异行为滞后各地的网站。 这些问题是从使用本网站(有时应用程序没有为10-20秒响应)明显,而且它也是目前在瀑布分析通过webpagetest.org。 我们总部设在丹麦,但得到来自任何主机的这个结果。

为了证实我们已经进行了基准测试的问题,我们发送给一个简单的页面300名相同的请求,并测量响应时间。 如果我们发送300个请求头版正中响应时间小于1秒,这是相当不错的。 是什么让我们害怕的是,60个请求需要两个多两倍的时间和那些40的时间超过4秒。 有些请求需要多达16秒。

这些缓慢的请求没有新文物,我们使用性能监控显示出来。 无请求排队显示出来,结果都是一样的,不管我们有多高,扩展我们的网络进程。 尽管如此,我们无法拒绝这个问题是由应用程序代码造成的,所以我们尝试了另一项实验中,我们回应了通过机架中间件的请求。

通过在机架堆叠的开始将这种中间件(TestMiddleware),我们返回的请求之前就击中了应用程序,确保不会影响下面的中间件或Rails应用程序可能会导致延迟。

Middleware setup:
$ heroku run rake middleware
use Rack::Cache
use ActionDispatch::Static
use TestMiddleware
use Rack::Rewrite
use Rack::Lock
use Rack::Runtime
use Rack::MethodOverride
use ActionDispatch::RequestId
use Rails::Rack::Logger
use ActionDispatch::ShowExceptions
use ActionDispatch::DebugExceptions
use ActionDispatch::RemoteIp
use Rack::Sendfile
use ActionDispatch::Callbacks
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
use ActionDispatch::Cookies
use ActionDispatch::Session::DalliStore
use ActionDispatch::Flash
use ActionDispatch::ParamsParser
use ActionDispatch::Head
use Rack::ConditionalGet
use Rack::ETag
use ActionDispatch::BestStandardsSupport
use NewRelic::Rack::BrowserMonitoring
use Rack::RailsExceptional
use OmniAuth::Builder
run AU::Application.routes

然后,我们在同一个脚本来记录响应时间,得到了几乎相同的结果。 平均响应时间约为130MS(显然更快,因为它没有击中的应用程序,但仍然60请求了超过400个毫秒和25个请求花了超过1秒。同样,一些16秒钟缓慢请求。

一种解释可能减缓对网络或DNS设置啤酒花有关,但跟踪路由的结果看起来完全确定。

根本没有怪异的行为 - 这个结果是从另一个轨道3.2和红宝石1.9.3应用程序托管在Heroku上运行处理脚本证实。

该DNS设置如下Heroku的建议。

-

我们很困惑,至少可以说。 莫不是与Heroku的路由网络有鬼? 见鬼,为什么我们都看到了这个怪异的行为? 我们如何摆脱它? 为什么我们不能看到它在New Relic的?

Answer 1:

事实证明,这是一种请求排队的。 有时,Web服务器很忙,而且由于Heroku的只是击溃随机随机传入请求任何赛道,那么我可以在测功机,这是完全卡住,由于如数据库问题后面的队列中结束的。 奇怪的是,这是在新的遗物几乎察觉不到(这是在他们的图表观察变薄时,取消所有其他资源是一个好主意,然后突然出现排队)

编辑21/2 2013:它已经证明,那为什么它是不是很难NewRelic的明显的原因是,它并没有测量! http://rapgenius.com/Lemon-money-trees-rap-genius-response-to-heroku-lyrics

我们发现这非常令人沮丧,我们最终离开的Heroku赞成专用服务器。 这给了我们20次更好的性能,而成本的1/10。 此外,我必须说,我们是通过谁的Heroku在发生这种情况时,否认缓慢是由于他们的基础设施,即使我们怀疑它并强调了好几次失望。 我们甚至得到了这样的答案回:

Heroku的28/8 2012:“如果你没有看到要求排队或New Relic的报道等缓慢,那么这很可能不是一个服务器端的问题,Heroku的内部路由应该<1ms的我们的监测系统中没有被任何指示。目前路由问题“。

此外,我们采访了NewRelic的谁也似乎没有意识到这个问题的,即使他们根据他们异体已与Heroku的一个非常密切的工作关系。

NewRelic的八分之二十九2012:“它看起来像什么导致这种情况发生的红宝石代理的知名度开始前的排队时间,该代理记录是从请求进入赛道的时候,所以在减速之前然后发生。”

底线是,我们最终花了几个小时的优化代码,这不是真正的瓶颈。 另外有过高的赛道规模运行在一个绝望的尝试,以提高我们的表现,但我们真的从此拥有的唯一的事情是来自Heroku的和更大的NewRelic的收入 - 不冷静。 我很高兴,我们改变了。

PS。 当时甚至有是造成不收取ALL DYNOS即使我们亲NewRelic的,(根据Newrelics自己的建议)中的错误,禁用了对我们的后台工作进程的监控。 我花了很多时间和很多的邮件之前,错误是由双方承认。

PPS。 如果你不知道当前正在进行的讨论,那么这里是链接http://rapgenius.com/James-somers-herokus-ugly-secret-lyrics

编辑26/2 2013的Heroku刚刚宣布在他们的通讯,这已经NewRelic的发布了一个更新 ,显然应该在投在Heroku的情况的一些情况。

编辑8/4 2013 Heroku上刚刚发布的FAQ过的话题



Answer 2:

Traceroute是没有的网络,它是一个工具,可以找到沿着网络故障的问题的一个很好的措施,但它不会告诉你的最佳视角。

尽量只把一个静态的网页,并与您的网页测试的IP地址打它。 如果仍然缓慢,怪网络。

如果由于某种原因,它是速度快,那么你有一个不同的问题。



文章来源: Strange TTFB (time to first byte) issue on Heroku