Это очень специфично, но я постараюсь быть кратким:
Мы запускаем приложение Django на Heroku. Три сервера:
- test (1 web, 1 celery dyno)
- обучение (1 веб-сайт, 1 сельдерей дино)
- prod (2 веб-магазина, 1 сельдерей-дино).
Мы используем Gunicorn с gevents и 4 сотрудниками на каждом диновере.
Мы испытываем спорадические высокие времена обслуживания. Вот пример из Logentries:
High Response Time:
heroku router - - at=info
method=GET
path="/accounts/login/"
dyno=web.1
connect=1ms
service=6880ms
status=200
bytes=3562
Я уже много недель прорабатывал это в Google. Мы не можем воспроизвести по желанию, но испытываем эти оповещения от 0 до 5 раз в день. Известные точки:
- Происходит во всех трех приложениях (все работает с похожим кодом)
- Происходит на разных страницах, включая простые страницы, такие как 404 и /admin
- Происходит случайное время
- Происходит с различной пропускной способностью. Один из наших экземпляров включает только 3 пользователя в день. Это не связано со спящими динамиками, потому что мы пингом с New Relic, и проблема может произойти в середине сеанса.
- Невозможно воспроизвести по желанию. Я лично столкнулся с этой проблемой. Щелчок на странице, которая обычно выполняется в 500 мс, привела к задержке в 30 секунд и, в конечном счете, к экрану ошибок приложения с тайм-аутом Heroku 30s
- Высокое время отклика варьируется от 5000мс до 30000 мс.
- Новая реликвия не указывает на конкретную проблему. Вот несколько последних транзакций и времен:
- RegexURLResolver.resolve
4,270ms
- SessionMiddleware.process_request
2,750ms
- Render login.html
1,230ms
- WSGIHandler
1,390ms
- Вышеприведенные простые вызовы и обычно не занимают такого количества времени.
- RegexURLResolver.resolve
Что я сузил до:
-
Эта статья о Gunicorn и медленных клиентах- Я видел эту проблему с медленными клиентами, но также и в нашем офисе, где у нас есть оптоволоконная связь.
-
Gevent и асинхронные рабочие не играют красиво- Мы переключились на сотрудников-бункерных синхронизаторов, и проблема все еще сохраняется.
- Отключение рабочего времени Gunicorn
- Возможно, что работники каким-то образом остаются живыми в нулевом состоянии.
-
Недостаточно работников/динамиков- Отсутствие индикатора избыточности CPU/памяти/db и New Relic не отображает никаких признаков задержки БД
- Шумные соседи
- Среди моих многочисленных писем с Heroku, представитель службы поддержки упомянул, по крайней мере, один из моих длинных запросов был вызван шумным соседом, но не был уверен, что это проблема.
-
Субдомен 301- Запросы проходят через штраф, но случайно попадают в приложение.
-
Перезагрузка Dynos- Если это так, многие пользователи будут затронуты. Кроме того, я вижу, что наши динамики не перезапускались недавно.
- Проблема маршрутизации/обслуживания Heroku
- Возможно, услуга Heroku меньше, чем рекламируется, и это просто недостаток использования их сервиса.
У нас была эта проблема в течение последних нескольких месяцев, но теперь, когда мы масштабируемся, ее нужно исправлять. Любые идеи будут высоко оценены, поскольку я исчерпал почти все ссылки SO или Google.