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

Как профилировать непоследовательные тайм-ауты H12 на Heroku

Мои пользователи видят случайные тайм-ауты запроса на Heroku. К сожалению, я не могу последовательно воспроизводить их, что затрудняет их отладку. Существует множество возможностей для повышения производительности. путем уменьшения огромного количества запросов к базе данных по запросу и путем добавления большего количества кеширования - но без профилирования этого снимка в темноте.

Согласно нашей новой аналитике Relic, на сервере требуется много запросов от 1 до 5 секунд. Я знаю, что это слишком медленно, но это далеко не 30 секунд, необходимых для таймаута.

Вкладка "Ошибка" в новой реликвии показывает мне несколько разных запросов к базе данных, в которых происходит тайм-аут, но это не особенно медленные запросы, и это может быть разные запросы для каждого сбоя. Также для того же URL-адреса он иногда делает и иногда не показывает запрос к базе данных.

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

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

4b9b3361

Ответ 1

Возможно, вы уже это видели, но Heroku имеет doc с хорошим фоном о тайм-аутах запроса.

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

Если вы используете Unicorn, возможно, этого не происходит, потому что запросы берут достаточно долго, чтобы они атаковали Unicorn timeout (после чего работники, обслуживающие эти запросы, будут насильственно убиты, не предоставив новому агенту Relic достаточно времени для отчета).

Я бы рекомендовал двухэтапный подход:

  • Настройте rack-timeout промежуточное программное обеспечение, чтобы иметь тайм-аут ниже таймаута Heroku 30s. Если это сработает, оно прекратит запросы, длительность которых превышает тайм-аут, подняв Timeout::Error, и такие запросы должны генерировать транзакционные следы в New Relic.
  • Если это не дает ничего (что может быть, потому что время ожидания в стойке зависит от класса Ruby stdlib Timeout, у которого некоторые ограничения) вы можете попытаться напасть на тайм-аут обработки запроса Unicorn до его 60-градусного значения (если вы используете Unicorn). Имейте в виду, что длительные запросы будут связывать работника Единорога в течение более длительного периода в этом случае, что может еще больше замедлить работу вашего сайта, поэтому используйте это как последнее средство.

Ответ 2

Два года здесь поздно. У меня есть минимальный опыт работы с Ruby, но для Django проблема с Gunicorn заключается в том, что она неправильно обрабатывает медленных клиентов на Heroku, потому что запросы не предварительно буферизованы, а это означает, что соединение с сервером может быть оставлено в ожидании (блокирование). Это может быть полезной статьей для вас, хотя это относится прежде всего к Gunicorn и Python.