Gunicorn: WORKER TIMEOUT в журнале службы
Gunicorn убивает рабочий процесс, если тот не отвечает главному дольше таймаута. Это защита от зависаний, но при медленных запросах она срабатывает на исправной работе, и запросы обрываются на середине.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Запрос обрабатывается дольше таймаута
Значение по умолчанию — 30 секунд. Выгрузка отчёта или тяжёлый запрос к базе в него не укладываются.
-
Блокирующий вызов в асинхронном обработчике
При асинхронном типе обработчика синхронный вызов блокирует весь процесс, и он перестаёт отвечать главному.
-
Процессов меньше, чем нужно для нагрузки
Все процессы заняты, новые запросы ждут и не успевают. Убийство по таймауту довершает картину.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Убийства процессов и их частота.
journalctl -u myapp.service -n 40 --no-pager | grep -iE "worker timeout|booting"Действующие параметры запуска.
systemctl cat myapp.service | grep -iE "timeout|workers|worker-class"Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Значение по умолчанию — 30 секунд. Выгрузка отчёта или тяжёлый запрос к базе в него не укладываются.
- Как проверить
-
Посмотрите таймаут и записи об убийстве процессов.
systemctl cat myapp.service | grep -i timeout journalctl -u myapp.service -n 30 --no-pager | grep -i "worker timeout"
- Как исправить
- Поднимите таймаут для нужного развёртывания либо вынесите долгие операции в фоновые задачи. Второе правильнее: запрос не должен занимать минуты.
- Почему происходит
- При асинхронном типе обработчика синхронный вызов блокирует весь процесс, и он перестаёт отвечать главному.
- Как проверить
-
Посмотрите тип обработчика.
systemctl cat myapp.service | grep -iE "worker-class|-k "
- Как исправить
- Либо используйте синхронный тип с большим числом процессов, либо уберите блокирующие вызовы из асинхронного кода.
- Почему происходит
- Все процессы заняты, новые запросы ждут и не успевают. Убийство по таймауту довершает картину.
- Как проверить
-
Посмотрите число процессов и нагрузку.
systemctl cat myapp.service | grep -iE "workers|-w " systemctl status myapp.service --no-pager | grep -i tasks
- Как исправить
- Считайте число процессов от числа ядер и характера нагрузки, а не на глаз.
Пример вывода
Рабочий процесс убит по таймауту на долгом запросе. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
gunicorn[1200]: [CRITICAL] WORKER TIMEOUT (pid:4112)
gunicorn[1200]: [ERROR] Worker (pid:4112) was sent SIGKILL! Perhaps out of memory?
gunicorn[1200]: [INFO] Booting worker with pid: 4180
Связанные ошибки
- nginx 504 Gateway Time-out: upstream timed out nginx не дождался ответа приложения. Разбор таймаутов proxy_read_timeout и fastcgi_read_timeout, поиск медленных мест.
- Failed with result 'timeout' Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
- signal=KILL (status=9/KILL) в systemd Процесс службы убит сигналом KILL. Кто мог его послать: OOM-killer, таймаут остановки systemd, администратор.
- A start job is running: загрузка висит на одной службе Загрузка останавливается с обратным отсчётом: служба не укладывается в таймаут. Как найти виновника и не ждать.
- A stop job is running: выключение висит Перезагрузка останавливается с обратным отсчётом: служба не завершается. Как найти и сократить ожидание.
- Celery: обработчик работает, но задачи не берутся Служба обработчика активна, очередь растёт: не та очередь, недоступный брокер, префикс имён.
- Connection timed out в журнале службы Соединение не устанавливается по таймауту: пакеты отбрасываются, узел недоступен, перегружен сервер на другой стороне.
- Job for … failed because a timeout was exceeded Задание на запуск прервано по таймауту. Как отличить медленный старт от заблокированного и правильно настроить TimeoutStartSec.
Где встречается чаще всего
Источники
- Документация Gunicorn: настройки
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено обработчиком с задержкой 60 секунд при таймауте 30.