Uvicorn не обрабатывает некоторые запросы randamly - PullRequest
1 голос
/ 27 апреля 2020

Мы запускаем веб-приложение Fastapi + Uvicorn, используя gunicorn в качестве диспетчера процессов и Nginx в качестве обратного прокси-сервера. Приложение работает в асинхронном режиме c для большинства операций ввода-вывода (вызов БД, Rest apis). Вся установка выполняется в контейнере Docker в Ubuntu 16.04.

Установка работает в большинстве случаев, но иногда она вообще не обрабатывает запрос и время ожидания истекает в конце Nginx. Мы также попытались вывести Nginx из настройки и заметили, что немногие запросы обрабатываются после очень длительного времени (например, через 15 минут). Это очень случайно, но обычно это происходит 2-3 раза в час.

Ниже приводится конфигурация gunicorn, которую мы используем -

host = os.getenv("HOST", "0.0.0.0")
port = os.getenv("PORT", "80")

# Gunicorn config variables
workers = web_concurrency
bind = f"{host}:{port}"
keepalive = 2

timeout = 60  
graceful_timeout = 30
threads = 2
worker_tmp_dir = "/dev/shm"
# Logging mechanism
capture_output = True
loglevel = os.getenv("LOG_LEVEL", "debug") 

И gunicorn вызывается командой exec gunicorn -k uvicorn.workers.UvicornWorker -c "$GUNICORN_CONF" "$APP_MODULE"

Мы попробовали несколько изменений конфигурации, например -

  1. Изменение количества рабочих, время ожидания рабочего
  2. Изменение диспетчера процессов с gunicorn на supervisord
  3. Выгрузка задачи с интенсивным использованием ЦП в Celery вместо потоков
  4. Привязка приложения uvicorn к unix сокету вместо прокси-сервера
...