Случайная медленная Rack:: MethodOverride # вызов в режиме rails на Heroku

Окружающая среда:

  • Ruby: 2.1.2

  • Rails: 4.1.4

  • Heroku

В нашем приложении rails, размещенном на Heroku, есть моменты, когда запросы выполняются долго. Это всего лишь 1% раз или меньше, но мы не можем понять, что это происходит.

У нас установлен новый резидентный агент, и он говорит, что это не очередь запросов, сама транзакция занимает все это время для выполнения.

Однако трассировка транзакции показывает это:

enter image description here

(этот самый запрос в большинстве случаев занимает всего 100 мс)

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

Rack::MethodOverride#call

и это то, что мы не можем понять.

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

Кто-нибудь испытал это? Любые советы о том, как продолжать изучать эту проблему, приветствуются.

Спасибо заранее!

Ответ 1

Поскольку агент Ruby начал использовать промежуточное программное обеспечение в версии 3.9.0.229, мы видели, что этот вопрос возникает для некоторых пользователей. Одной из возможных причин более длительных таймингов является то, что Rack:: MethodOverride необходимо проверить тело запроса на POST, чтобы определить, содержат ли параметры POST переопределение метода. Он вызывает Rack:: Request # POST, который заканчивается запуском чтения, которое читает во всем теле запроса.

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

Ответ 2

Если кто-то испытывает это:

Наконец, мы сделали переход от единорога к пассажиру, и этот вопрос был решен:

https://github.com/phusion/passenger-ruby-heroku-demo

Я не уверен, но проблема может иметь какое-то отношение к запросам POST на медленных клиентах. Пассажир /nginx говорит:

Буферизация запросов/ответов. Включенные запросы буферов Nginx и ответов, тем самым защищая ваше приложение от медленных клиентов (например, мобильных устройств в мобильных сетях) и повышения производительности.

Так что это может быть причиной.