Медленный запрос postgres на Heroku не прерывается по истечении времени ожидания - PullRequest
7 голосов
/ 15 декабря 2011

Мне не очень повезло с поиском информации через Google, возможно, у кого-то здесь была похожая проблема.

На Heroku работает приложение rails с базой данных Postgres.У нас очень медленный запрос (да, мы работаем над исправлением запроса), но в ходе отладки этой проблемы я заметил, что наш гем стойка не убивает запрос за 15 секунд.Я выполнил побочный тест, вставив спящий режим (50), и, конечно же, в этом случае время ожидания в стойке работает правильно.

Вот отредактированная копия наших журналов, показывающая, что время в стойке (времяup!) происходит через несколько минут, и мы все еще видим тайм-аут запроса H12 через 30 секунд.

    2011-12-14T21:15:16+00:00 app[web.2]: Started GET "/search?utf8=%E2%9C%93&terms=foo" for 173.164.186.205 at Wed Dec 14 13:15:16 -0800 2011
    2011-12-14T21:15:16+00:00 app[web.2]: search query elapsed time => [0.000365018844604492]
    2011-12-14T21:15:46+00:00 heroku[router]: Error H12 (Request timeout) -> GET /search dyno=web.2 queue= wait= service=30000ms status=503 bytes=0
    2011-12-14T21:18:47+00:00 app[postgres]: [6-1] [removed] [COBALT] LOG:  duration: 211241.725 ms  statement: SELECT  [truncated]
    2011-12-14T21:18:47+00:00 app[web.2]: 
    2011-12-14T21:18:47+00:00 app[web.2]: ActionView::Template::Error (Timeout::Error: time's up!: SELECT  [truncated]):

Любое понимание того, почему и как применять тайм-аут стойки?

Ответы [ 2 ]

4 голосов
/ 15 декабря 2011

Да, здесь происходит то, что я называю зомби-динамо. 30-секундный тайм-аут происходит в сетке маршрутизации, которая находится над вашим Dyno. Теоретически, ваш dyno может работать часами, но через 30 секунд пользователь увидит ошибку непосредственно из сетки маршрутизации.

Итак. что происходит, это:

  1. Ваш запрос сделан на 21:15:16
  2. В 21:15:46 сетка маршрутизации возвращает ошибку, но ваш dyno все еще обрабатывает
  3. В 21:18:47 ваш запрос завершается.

Что касается того, что происходит с Rack :: Timeout и вашим долгосрочным запросом, то, возможно, дело в том, что pg gem, который вы используете в качестве Rack :: Timeout, зависит от потоков для правильной работы. Это объясняет, почему вы получаете тайм-аут в тот момент, когда база данных возвращается.

Больше информации о зомби-динамах: http://neilmiddleton.com/avoiding-zombie-dynos-with-heroku/

1 голос
/ 01 мая 2012

Пока не выйдет postgres 9.2 (у которого улучшенная система тайм-аута), с гемом rack-timeout не будет простого решения - postgres только проверяет прерывание соединения между операторами, и поэтому в этом отношении время ожидания в стойке несколько ограничено.Его руки связаны ... Если бы у вас был суперпользовательский доступ к postgres, вы могли бы попробовать некоторые настройки, но, поскольку вы находитесь на heroku, это не вариант.

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

...