Странная проблема с 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

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

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

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

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

--

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


person Niels Kristian    schedule 29.08.2012    source источник
comment
Heroku завершает работу ваших экземпляров из-за бездействия (если вы используете бесплатный план)?   -  person Frederick Cheung    schedule 29.08.2012
comment
Нет к сожалению нет. Мы запускаем 3 динамометра   -  person Niels Kristian    schedule 30.08.2012
comment
Являются ли запросы, которые вы отправляете для тестирования своего приложения, последовательными или параллельными? т.е. вы когда-нибудь отправляли более 3 запросов одновременно (что может привести к очереди?)   -  person jakeonrails    schedule 19.09.2012
comment
Попробуйте удалить настройку dns из цепочки — нажмите на приложение с xxxx.herokuapp.com (или что там на бамбуке) вместо собственного домена. Если это не поможет, я думаю, пришло время поговорить с поддержкой херкоу.   -  person Jody    schedule 02.10.2012


Ответы (2)


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

РЕДАКТИРОВАТЬ 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 должна занимать ‹1 мс. Ни одна из наших систем мониторинга указывают на какие-либо проблемы с маршрутизацией в настоящее время."

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

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

Суть в том, что мы потратили часы и часы на оптимизацию кода, который на самом деле не был узким местом. Кроме того, мы использовали слишком высокую шкалу динамометра в отчаянной попытке повысить нашу производительность, но единственное, что мы действительно получили от этого, — это большие поступления как от Heroku, так и от Newrelic — НЕ КРУТО. Я рад, что мы изменились.

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

ППС. Если вы не в курсе текущего обсуждения, то вот ссылка http://rapgenius.com/James-somers-herokus-ugly-secret-lyrics

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

EDIT 8/4 2013 Компания Heroku только что выпустила часто задаваемые вопросы по тема

person Niels Kristian    schedule 31.10.2012
comment
Нас это очень расстраивает, и в итоге мы отказались от Heroku в пользу выделенных серверов. Это дало нам в 20 раз лучшую производительность при 1/10 стоимости. - это риторическое преувеличение или несколько точные приближения? Если это не преувеличение, не могли бы вы предоставить больше информации о результатах тестов / журналов, сколько dynos / серверов вы использовали / используете? - person Maciek Sawicki; 10.03.2013
comment
Это близко к точному. С тех пор мощность наших серверов выросла еще больше, поэтому трудно сравнивать сейчас с тем временем. Однако я помню, что наша ср. время загрузки сервера в новой реликвии снизилось с в среднем. 1 сек + все задержки, вызванные плохой маршрутизацией (которая часто составляла 30 сек) до стабильных 150 мс в среднем. Вдобавок к этому у нас теперь есть огромные избыточные мощности для фоновой обработки, где я могу легко запустить во много раз больше помощников, чем раньше с 8-10 динамометрами. Моя установка работает на Hetzner, смотрите сами. Мы используем их среди прочего hetzner.de/hosting/produkte_rootserver/ex6s - person Niels Kristian; 10.03.2013
comment
Я должен упомянуть, что за все приходится платить - в Hetzner не так много помощи, если у вас есть проблемы - с точки зрения программного обеспечения вы полностью предоставлены сами себе, с точки зрения оборудования это немного лучше, но время отклика не очень хорошее (часто 1 час). Таким образом, вам решать, иметь ли больше серверов и иметь хорошую настройку аварийного переключения. Однако до сих пор все было намного более стабильно и намного лучше для нас, чем это когда-либо было на Heroku тогда. Однако я должен сказать, что мне не хватает поддержки Herokus, всей их хорошей документации и отличных инструментов. В конце концов, у них действительно есть классный продукт для многих вещей. - person Niels Kristian; 10.03.2013

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

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

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

person Michael    schedule 28.10.2012