Перейти к содержанию
Открыть мой план

Worker sizing в n8n: concurrency, RAM, CPU и очереди без перегруза

Обновлено: 2026-05-29

Worker sizing — это не “поставить побольше workers”. В n8n queue mode каждый worker выполняет jobs из Redis, использует PostgreSQL, ходит во внешние API и потребляет RAM/CPU. Если увеличить workers без расчёта, можно ускорить систему, а можно получить 429, таймауты, забитый connection pool и ещё более медленные executions.

Задача sizing — подобрать баланс: сколько jobs можно выполнять параллельно, сколько памяти нужно каждому типу workflow, где узкое место и когда нужен отдельный worker для тяжёлых задач.

Что влияет на размер worker

ФакторКак влияетЧто делать
HTTP/API workflowчасто упирается во внешний rate limitумеренная concurrency + Wait/retry
файлы и OCRсъедает RAM и дискменьше concurrency, binary storage, отдельный worker
AI/RAGдолгие ответы, большой контекстлимит контекста, fallback, отдельная очередь по смыслу
PostgreSQL-heavyмного insert/upsert/selectиндексы, batching, контроль connection pool
короткие webhooksважен быстрый ответотдельные webhook processors и быстрый Respond

Базовая схема queue mode

services:
  n8n:
    image: n8nio/n8n:latest
    environment:
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
  n8n-worker:
    image: n8nio/n8n:latest
    command: worker --concurrency=5
    environment:
      - EXECUTIONS_MODE=queue
      - QUEUE_BULL_REDIS_HOST=redis
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}

Начните с одного worker и --concurrency=5, затем измеряйте. Для тяжёлых файловых или AI workflow иногда лучше concurrency=1–3, чем много параллельных задач, которые конкурируют за память и внешний API.

Почему много маленьких workers не всегда лучше

Каждый worker создаёт подключения к PostgreSQL и Redis. Если запустить 20 workers с низкой concurrency на маленьком VPS, база может стать узким местом раньше, чем CPU. Поэтому масштабирование нужно проверять по четырём метрикам:

  • длина очереди Redis;
  • время ожидания job до старта;
  • CPU/RAM каждого worker;
  • PostgreSQL connections, locks и slow queries.

Если очередь растёт, но CPU свободен, можно добавить concurrency. Если CPU/RAM уже высокие — нужен отдельный сервер или оптимизация workflow. Если PostgreSQL упёрся в connections — увеличение workers навредит.

Практический sizing по типам задач

Тип workflowСтартовое значениеКомментарий
простые CRM/API sync1 worker × concurrency 5следите за 429 и временем API
webhook intakeбыстрый ответ + обработка отдельноне держите HTTP-клиента до конца тяжёлой цепочки
PDF/OCR/файлы1 worker × concurrency 1–2важнее стабильность памяти
AI/RAGconcurrency 1–3ограничьте tokens/context и таймауты
массовый importbatch + controlled concurrencyсохраняйте checkpoint

Concurrency control в regular mode

Если queue mode ещё не включён, но production executions запускаются слишком параллельно, можно ограничить concurrency на self-hosted инстансе:

N8N_CONCURRENCY_PRODUCTION_LIMIT=20

Это не замена queue mode, но хороший предохранитель для маленького инстанса: лишние production executions будут ждать свободного места, а не одновременно грузить event loop.

PostgreSQL и Redis как ограничения

Workers не существуют отдельно от базы. Проверьте:

SELECT count(*) FROM pg_stat_activity;

SELECT state, count(*)
FROM pg_stat_activity
GROUP BY state;

Если база забита активными запросами, workers будут ждать, даже если Redis и CPU выглядят нормально. Для Redis следите за memory, latency и доступностью. Потеря Redis в queue mode означает проблемы с доставкой jobs.

Как проводить нагрузочный тест

  1. Выберите один критичный workflow.
  2. Подготовьте 100–500 тестовых событий с реалистичным payload.
  3. Запустите на текущей concurrency.
  4. Замерьте p50/p95 времени execution, ошибки API, RAM, CPU, Postgres connections.
  5. Увеличьте concurrency на 2–5, повторите тест.
  6. Остановитесь не на максимальной скорости, а на устойчивом профиле без всплесков ошибок.

Для business-critical сценариев лучше иметь запас. Если система стабильно выдерживает 20 jobs/min, не обещайте 20 jobs/min как норму. Оставьте headroom для повторов, обновлений, внешних задержек и ручных запусков.

Ошибки sizing

  • увеличивать workers, когда проблема во внешнем API rate limit;
  • ставить одинаковую concurrency для лёгких webhooks и тяжёлых PDF;
  • держать main, worker, PostgreSQL, Redis и AI-модель на одном слабом VPS;
  • не учитывать manual executions и тесты команды;
  • не ставить healthchecks и restart policy для workers.

Операционный runbook для self-hosted

Для темы «Worker sizing в n8n» важно разделять настройку и эксплуатацию. Настройка отвечает на вопрос “запустилось ли”, эксплуатация — “сможем ли мы восстановиться, обновиться и расследовать инцидент без потери credentials и execution history”.

Перед изменениями проверьте бэкап базы, значение N8N_ENCRYPTION_KEY, состояние volume, логи web-процесса и worker-процесса. Главный риск — поменять настройку только в одном контейнере, забыть про worker или потерять volume/encryption key.

СлойЧто зафиксироватьЗачем
Входсостояние контейнеров, очередь, переменные окружения, volume и последние строки логовпозволяет повторить проблему без доступа к production-секретам
Контрольrestart_count, memory_usage, queue_depth, worker_concurrency, failed_executionsпоказывает деградацию раньше, чем пользователи начинают писать в поддержку
Безопасностьпоменять настройку только в одном контейнере, забыть про worker или потерять volume/encryption keyснижает риск скрытых дублей, утечки данных и неконтролируемых write-действий
Готовностьесть тест на happy path, пустой вход, повтор и сбой внешнего сервиса для «Worker sizing в n8n»делает статью пригодной для runbook, а не только для чтения

Пример безопасного входного контракта

docker compose ps
docker compose logs --tail=200 n8n
docker compose logs --tail=200 n8n-worker
printenv | grep -E 'N8N_|WEBHOOK_|DB_|QUEUE_'
# перед изменениями: backup базы + проверка N8N_ENCRYPTION_KEY

Критерий готовности

  • есть свежий backup базы и проверено значение N8N_ENCRYPTION_KEY
  • web, worker, queue и database используют согласованные переменные окружения
  • после изменения проверены логи, healthcheck и запуск критичных workflow
  • записан rollback-план с командами и ответственным

Связанные материалы

Ответы на частые вопросы

Сколько workers нужно для n8n?

Начните с одного worker и concurrency около 5, затем измеряйте очередь, время выполнения, RAM, CPU и PostgreSQL. Для тяжёлых файловых или AI workflow concurrency часто нужно снижать.

Почему больше workers стало медленнее?

Возможные причины: PostgreSQL connection pool, Redis latency, внешний API rate limit, слишком большие payload или недостаточно RAM.

Можно ли ограничить параллельность без queue mode?

Да, для self-hosted regular mode есть N8N_CONCURRENCY_PRODUCTION_LIMIT. Это предохранитель, но для масштабирования лучше queue mode.