Gunicorn застрял в тупике для службы python django, запущенной в контейнере docker
Я запускаю приложение python django webhook, которое работает через сервер gunicorn. Моя конфигурация - nginx + Gunicorn + Django. Вот как выглядит конфигурация:
gunicorn app1.wsgi:application --bind 0.0.0.0:8000 --timeout=0
Приложение отлично работает в течение ~1 -2 миллионов запросов, но после нескольких часов работы gunicorn переходит в состояние сна и больше не получает никаких событий от webhook.
root 3219 1.3 0.0 256620 61532 ? Sl 14:04 0:19 /usr/local/bin/python /usr/local/bin/gunicorn app1.wsgi:application --bind 0.0.0.0:8000 --timeout=0
Служба работает в 4 различных контейнерах, и в течение нескольких часов такое поведение наблюдается для одного контейнера, а затем оно возникает для одного или нескольких контейнеров в последующие часы.
Я попробовал отправить сигнал на перезагрузку конфигурации gunicorn, который способен привести процесс gunicorn в запущенное состояние.
Что любопытно, когда я запускаю 4 контейнера django, для нескольких запросов все работает отлично. Но постоянный прием трафика вызывает тупик в состоянии одного из рабочих gunicorn, и он продолжает ждать триггера, чтобы снова начать принимать трафик, в то время как остальные три рабочих gunicorn здоровы и работают!
Вопрос - Почему рабочий процесс gunicorn переходит в состояние сна (Sl)? Как можно исправить такое поведение?
Попробуйте поставить Nginx в качестве reverse-proxy перед gunicorn. Возможно, gunicorn некорректно обрабатывает недействительных клиентов, что приводит к тупику. Nginx сам по себе обеспечивает буферизацию, которая спасает gunicorn от таких неприятностей, как вечно открытые TCP-соединения.
См. документацию gunicorn о правильном развертывании - https://docs.gunicorn.org/en/stable/deploy.html
Смотрите этот выпуск для обсуждения проблемы - https://github.com/benoitc/gunicorn/issues/2917