Подтвердить что ты не робот

Странный выпуск TTFB (время до первого байта) на Heroku

Мы работаем над улучшением производительности нашего приложения rails, размещенного в Heroku (rails 3.2.8 и ruby ​​1.9.3). Во время этого мы столкнулись с одной тревожной проблемой, для которой источник кажется чрезвычайно трудным для отслеживания. Позвольте мне быстро объяснить, как мы сталкиваемся с проблемой и как мы пытаемся ее изолировать.

-

С июня мы испытали странное отставание от времени до первого байта по всему сайту. Проблемы очевидны из-за использования сайта (иногда приложение не отвечает в течение 10-20 секунд), и оно также присутствует в анализе водопада через webpagetest.org. Мы находимся в Дании, но получаем этот результат от любого хоста.

Чтобы подтвердить проблему, мы выполнили тестовый тест, в котором мы отправляем 300 одинаковых запросов на простую страницу и измеряем время отклика. Если мы отправляем 300 запросов на первую страницу, среднее время отклика составляет менее 1 секунды, что довольно хорошо. Что нас пугает, так это то, что 60 запросов занимают больше двух раз, и 40 из них занимают более 4 секунд. Некоторые запросы занимают до 16 секунд.

Ни один из этих медленных запросов не появляется в New Relic, который мы используем для мониторинга производительности. Нет очереди запросов, и результаты одинаковы независимо от того, насколько высоко мы масштабируем наши веб-процессы. Тем не менее, мы не могли отказаться от проблемы, вызванной кодом приложения, поэтому мы попробовали другой эксперимент, в котором мы ответили на запрос через промежуточное ПО стойки.

Поместив это промежуточное программное обеспечение (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

Затем мы запустили тот же script для документирования времени ответа и получили почти такой же результат. Среднее время отклика составляло около 130 мс (очевидно, быстрее, потому что оно не попадало в приложение. Но все же 60 запросов заняли более 400 мс, а 25 запросов заняли более 1 секунды. Опять же, с некоторыми запросами так же медленно, как 16 секунд.

Одно объяснение может быть связано с медленными перелетами в сети или настройкой DNS, но результаты traceroute выглядят отлично.

Этот результат был подтвержден при запуске ответа script на другие рельсы 3.2 и приложение ruby ​​1.9.3, размещенное на Heroku - вообще не странное поведение.

Настройка DNS следует рекомендациям Heroku.

-

Мы смущены, если не сказать больше. Может ли быть что-то подозрительное в маршрутной сети Heroku? Почему, черт возьми, мы видим это странное поведение? Как мы можем избавиться от него? И почему мы не можем увидеть это в Новой Реликвии?

4b9b3361

Ответ 1

Это оказалось, что это была своего рода очередь запросов. Иногда этот веб-сервер был занят, и поскольку героку просто случайно направляет входящие запросы произвольно на любой динамометр, я мог бы оказаться в очереди за динамою, которая была полностью застряла из-за, например, проблемы с базой данных. Странно то, что это было едва заметно в новой реликвии (неплохо было снять все остальные ресурсы при просмотре ребер в их диаграммах, затем неожиданно появляется очередь)

РЕДАКТИРОВАТЬ 21/2 2013: Оказалось, что причина, по которой это не было заметно в Ньюрелике, заключалась в том, что она не была измерена! http://rapgenius.com/Lemon-money-trees-rap-genius-response-to-heroku-lyrics

Мы находим это очень разочаровывающим, и мы закончили тем, что оставили Heroku в пользу выделенных серверов. Это дало нам в 20 раз лучшую производительность по 1/10 стоимости. Кроме того, я должен сказать, что мы разочарованы Хероку, который в то время это случилось, отрицал, что медлительность была связана с их инфраструктурой, хотя мы подозревали ее и несколько раз подчеркивали ее. Мы даже получили такие ответы:

Heroku 28/8 2012: "Если вы не видите очередность запросов или другую задержку, о которой сообщается в New Relic, то это скорее всего не проблема на стороне сервера. Внутренняя маршрутизация Heroku должна занимать не более 1 мс. системы указывают на любые проблемы маршрутизации в настоящее время."

Кроме того, мы поговорили с Newrelic, которые также, похоже, не знали об этой проблеме, хотя они, по их мнению, имеют очень тесные рабочие отношения с Heroku.

Newrelic 29/8 2012: "Похоже, что все происходит, прежде чем откроется видимость агента Ruby. Время очереди, которое агенты записывают с момента ввода запроса на дино, поэтому замедление происходит раньше то".

Суть в том, что в итоге мы потратили часы и часы на оптимизацию кода, который на самом деле не был узким местом. Кроме того, он работает со слишком высоким динамическим масштабом в отчаянной попытке повысить нашу производительность, но единственное, что мы получили от этого, - это большие поступления от Heroku и Newrelic - NOT COOL. Я рад, что мы изменились.

PS. В то время даже была ошибка, которая заставляла newrelic pro заряжаться на всех динамиках, даже если мы (согласно собственным советам Newrelics) отключили мониторинг на наших фоновых рабочих процессах. Потребовалось много времени и много писем, прежде чем ошибка была допущена обеими сторонами.

ПФС. Если вы не знаете текущую текущую дискуссию, вот ссылка http://rapgenius.com/James-somers-herokus-ugly-secret-lyrics

EDIT 26/2 2013 Heroku только что объявил в своем бюллетене, что Newrelic выпустил обновление , которое, по-видимому, должно ситуация в Хероку.

EDIT 8/4 2013 Heroku только что выпустила FAQ по теме

Ответ 2

traceroute не является хорошим показателем проблем в сети, его инструментом, который может обнаруживать сбои в сети, но он не покажет вам лучший вид.

Попробуйте просто поставить статическую веб-страницу и нажать на нее с IP-адресом от вашего тестера веб-страницы. Если он все еще медленный, обвините сеть.

Если по какой-то причине это быстро, тогда у вас другая проблема.