Я установил gunicorn с 3 рабочими, 30 рабочими соединениями и использую рабочий класс Eventlet. Это настройка позади Nginx. После каждых нескольких запросов я вижу это в журналах.
[ERROR] gunicorn.error: WORKER TIMEOUT (pid:23475)
None
[INFO] gunicorn.error: Booting worker with pid: 23514
Почему это происходит? Как я могу понять, что происходит не так?
Спасибо
Gunicorn==19.3.1
иgevent==1.0.1
Ответы:
У нас была та же проблема с использованием Django + nginx + gunicorn. Из документации Gunicorn мы настроили изящный таймаут, который почти не изменился.
После некоторых испытаний мы нашли решение, параметр для настройки: timeout (а не graceful timeout). Работает как часы ..
Ну действуй:
1) открыть файл конфигурации gunicorn
2) установите TIMEOUT на то, что вам нужно - значение в секундах
источник
pip install gevent
затемworker_class gevent
в вашем конфигурационном файле или-k gevent
в командной строке.command=/opt/env_vars/run_with_env.sh /path/to/environment_variables /path/to/gunicorn --timeout 200 --workers 3 --bind unix:/path/to/socket server.wsgi:application
В Google Cloud Просто добавьте
--timeout 90
к точке входа вapp.yaml
источник
Запустите Gunicorn с
--log-level=DEBUG
.Это должно дать вам трассировку стека приложений.
источник
--log-level debug
Может ли это быть так? http://docs.gunicorn.org/en/latest/settings.html#timeout
Другие возможности могут быть, ваш ответ занимает слишком много времени или застревает в ожидании.
источник
Вы должны Использовали другой класс типа работника в асинхр один как GEvent или торнадо увидеть это более подробное объяснение: Первый explantion:
Второй :
источник
У меня была очень похожая проблема, я также пытался использовать "runserver", чтобы посмотреть, смогу ли я найти что-нибудь, но все, что у меня было, это сообщение
Killed
Поэтому я подумал, что это может быть проблема с ресурсами, и я решил выделить больше оперативной памяти экземпляру, и это сработало.
источник
WORKER TIMEOUT
означает, что ваше приложение не может ответить на запрос в течение определенного периода времени. Вы можете установить это, используя настройки тайм-аута Gunicorn . Некоторое приложение требует больше времени для ответа, чем другое.Еще одна вещь, которая может повлиять на это, это выбор типа работника.
Когда у меня возникла та же проблема, что и у вас (я пытался развернуть свое приложение с помощью Docker Swarm), я попытался увеличить время ожидания и использовать другой тип рабочего класса. Но все не удалось.
И затем я внезапно понял, что ограничил свой ресурс слишком низким для службы внутри моего файла компоновки. Это вещь замедлила приложение в моем случае
Поэтому я предлагаю вам проверить, что замедляет работу вашего приложения.
источник
Эта конечная точка занимает слишком много времени?
Возможно, вы используете колбу без асинхронной поддержки, поэтому каждый запрос будет блокировать вызов. Чтобы создать асинхронную поддержку без трудностей, добавьте
gevent
рабочий.С Gevent новый вызов будет порождать новый поток, и ваше приложение сможет получать больше запросов
источник
У меня такая же проблема в Докере.
В Docker я держу обученную
LightGBM
модель +Flask
обслуживание запросов. В качестве HTTP-сервера я использовалgunicorn 19.9.0
. Когда я запускал свой код локально на своем ноутбуке Mac, все работало просто отлично, но когда я запустил приложение в Docker, мои запросы POST JSON на некоторое время зависали, а затемgunicorn
рабочий отказывал за[CRITICAL] WORKER TIMEOUT
исключением.Я перепробовал множество разных подходов, но единственное, что решило мою проблему - добавление
worker_class=gthread
.Вот мой полный конфиг:
источник
Если вы используете GCP, вы должны установить работников для каждого типа экземпляра.
Ссылка на лучшие практики GCP https://cloud.google.com/appengine/docs/standard/python3/runtime
источник
Тайм-аут является ключевым параметром этой проблемы.
Однако это не подходит для меня.
я обнаружил, что нет ошибки тайм-аута gunicorn, когда я установил работников = 1.
когда я смотрю через мой код, я обнаружил некоторое соединение с сокетом (socket.send & socket.recv) в init сервера.
socket.recv заблокирует мой код, и поэтому всегда, когда рабочие> 1
надеюсь дать некоторые идеи людям, которые имеют некоторые проблемы со мной
источник
Это сработало для меня:
Если у вас есть
eventlet
добавить:Если у вас есть
gevent
добавить:источник
Для меня решение было добавить
--timeout 90
к моей точке входа, но она не работала, потому что у меня были определены две точки входа, одна в app.yaml, а другая в моем Dockerfile. Я удалил неиспользованную точку входа и добавил--timeout 90
в другую.источник