我们在改善我们的轨道在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的?