SystemdDoctor
служба не работает python нагрузка таймауты

Gunicorn: WORKER TIMEOUT в журнале службы

Gunicorn убивает рабочий процесс, если тот не отвечает главному дольше таймаута. Это защита от зависаний, но при медленных запросах она срабатывает на исправной работе, и запросы обрываются на середине.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Запрос обрабатывается дольше таймаута

    Значение по умолчанию — 30 секунд. Выгрузка отчёта или тяжёлый запрос к базе в него не укладываются.

  2. Блокирующий вызов в асинхронном обработчике

    При асинхронном типе обработчика синхронный вызов блокирует весь процесс, и он перестаёт отвечать главному.

  3. Процессов меньше, чем нужно для нагрузки

    Все процессы заняты, новые запросы ждут и не успевают. Убийство по таймауту довершает картину.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Убийства процессов и их частота.

journalctl -u myapp.service -n 40 --no-pager | grep -iE "worker timeout|booting"

Действующие параметры запуска.

systemctl cat myapp.service | grep -iE "timeout|workers|worker-class"

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Запрос обрабатывается дольше таймаута
Почему происходит
Значение по умолчанию — 30 секунд. Выгрузка отчёта или тяжёлый запрос к базе в него не укладываются.
Как проверить
Посмотрите таймаут и записи об убийстве процессов.
systemctl cat myapp.service | grep -i timeout
journalctl -u myapp.service -n 30 --no-pager | grep -i "worker timeout"
Как исправить
Поднимите таймаут для нужного развёртывания либо вынесите долгие операции в фоновые задачи. Второе правильнее: запрос не должен занимать минуты.
2. Блокирующий вызов в асинхронном обработчике
Почему происходит
При асинхронном типе обработчика синхронный вызов блокирует весь процесс, и он перестаёт отвечать главному.
Как проверить
Посмотрите тип обработчика.
systemctl cat myapp.service | grep -iE "worker-class|-k "
Как исправить
Либо используйте синхронный тип с большим числом процессов, либо уберите блокирующие вызовы из асинхронного кода.
3. Процессов меньше, чем нужно для нагрузки
Почему происходит
Все процессы заняты, новые запросы ждут и не успевают. Убийство по таймауту довершает картину.
Как проверить
Посмотрите число процессов и нагрузку.
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

Связанные ошибки

Где встречается чаще всего

Источники

  • Документация Gunicorn: настройки документация программы
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено обработчиком с задержкой 60 секунд при таймауте 30.
    собственная проверка, systemd 255
    сверено 15 сентября 2026