Ответ 1
Я сам преследовал аналогичную проблему, пока не очень повезло.
Я полагаю, что первый порядок бизнеса - рекомендовать NewRelic. В этих случаях у вас может быть больше информации.
Во-вторых, я предлагаю вам посмотреть время в очереди: сколько времени ваш запрос был поставлен в очередь. Посмотрите на NewRelic для этого или сделайте это самостоятельно с заголовком HTTP "Начало времени", который Heroku добавляет к вашему входящему запросу (просто выведите сейчас() минус "время начала" в качестве времени очереди).
Когда мне это не удалось, я попытался придумать то, что может пойти не так, и вот список (неортодоксальный? странный?):
1) DNS - вы делаете какие-либо DNS-вызовы в своем представлении? Это может занять некоторое время. Даже DNS-запросы для разрешения имен хостов БД, имена узлов Redis, сторонние поставщики услуг и т.д.
2) Производительность журнала - Heroku собирает все ваши stdout с помощью своего "Logplex", который затем сливается с вашими собственными логдрами, такими услугами, как Papertrail и т.д. Документация об эффективности этого не существует и записывается в stdout из вашего процесса может теоретически блокировать периоды, в то время как Heroku очищает любые буферы, которые могут быть там.
3) Получение соединения с БД - не уверен, какую структуру вы используете, но, возможно, у вас есть пул соединений, из которого вы получаете соединения с БД, и это заняло много времени? Он не будет отображаться как время запроса, это будет блокировать время для вашего процесса.
4) Производительность Dyno - у Heroku есть функция надстройки, которая будет печатать каждые несколько секунд некоторые показатели сервера (load avg, memory) в stdout. Я использовал Graphite для их графического отображения и поиска корреляции между метриками и временем, когда я видел увеличенные экземпляры "спорадических медленных запросов". Это не помогло мне, но могло бы помочь вам:)
Сообщите нам, что вы придумали.