← Назад к вопросам

Сколько воркеров можно запустить на одну задачу?

1.7 Middle🔥 92 комментариев
#Инфраструктура и DevOps#Очереди и брокеры сообщений

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Оптимизация количества PHP-FPM Worker процессов

В контексте PHP-FPM (FastCGI Process Manager) — одного из самых распространенных режимов исполнения PHP в веб-серверах (например, Nginx или Apache) — понятие "воркеров на одну задачу" подразумевает количество child worker процессов, которые могут обслуживать HTTP-запросы параллельно. Ответ зависит от множества факторов и не является фиксированным числом.

Ключевые параметры настройки в PHP-FPM

Основные директивы в конфигурационном файле php-fpm.conf или пула (например, www.conf), которые определяют количество и поведение воркеров:

  • pm (process manager): режим управления процессами (static, dynamic, ondemand).
  • pm.max_children: максимальное количество child процессов, которые могут быть запущены одновременно. Это верхний лимит.
  • pm.start_servers: количество процессов, запускаемых при старте FPM (для режима dynamic).
  • pm.min_spare_servers / pm.max_spare_servers: минимальное и максимальное количество idle (ожидающих запроса) процессов (для режимов dynamic и ondemand).
# Пример секции пула в www.conf
[www]
user = php-user
group = php-group
listen = /run/php/php8.2-fpm.sock

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

Как определить оптимальное количество (pm.max_children)

Правильный расчет является балансом между производительностью и ресурсами сервера. Слишком мало воркеров — запросы будут ждать в очереди. Слишком много — система исчерпает память или CPU.

  1. Анализ потребления памяти одним воркером (memory_per_worker):
    *   Запустите несколько типичных запросов к вашему приложению.
    *   Используйте инструменты (`ps`, `top`, `smem`) или мониторинг FPM для определения среднего потребления памяти одним процессом PHP-FPM. Например, ~50 MB.

```bash
# Пример оценки через ps
ps aux | grep php-fpm | grep -v grep | awk '{sum += $6} END {print sum/NR " kB"}'
```

2. Расчет на основе доступной памяти (available_memory):

    *   Определите объем памяти, который можно выделить под PHP-FPM. Учитывайте, что на системе также работают другие службы (Nginx, база данных, система).
    *   Базовая формула: `pm.max_children ≈ (available_memory - memory_for_other_services) / memory_per_worker`
    *   Пример: Если сервер имеет 4 GB RAM, под другие службы выделено 1 GB, а один воркер потребляет 50 MB: `(4096 MB - 1024 MB) / 50 MB ≈ 61`. Таким образом, `pm.max_children` можно установить около **60**.

  1. Учет пиковой нагрузки и профиля запросов:
    *   Если запросы часто блокирующие (тяжелые вычисления, внешние API-вызовы), может потребоваться больше воркеров для поддержания параллелизма.
    *   Используйте мониторинг (например, **Prometheus** + **Grafana** с экспортером для PHP-FPM) для наблюдения за метриками в реальной нагрузке: `active children`, `idle children`, `queue length`.

Рекомендации по режимам управления (pm)

  • static: Фиксированное количество процессов, заданное pm.max_children. Простота управления, постоянное потребление памяти. Подходит для стабильных, предсказуемых нагрузок или серверов с избыточными ресурсами.
  • dynamic: Процессы создаются и уничтожаются динамически между min_spare_servers и max_spare_servers, но не превышая pm.max_children. Наиболее популярный и гибкий режим для переменной нагрузки.
  • ondemand: Процессы запускаются только при входящем запросе и могут быть остановлены после периода бездействия. Экономит память на системах с очень низкой или нерегулярной нагрузкой, но может добавлять небольшую задержку на "старт" процесса при всплеске трафика.

Практический пример расчета

Предположим, у нас есть сервер с 2 GB RAM, предназначенный преимущественно для PHP-приложения.

# 1. Оцениваем память на воркер через нагрузочный тест.
# После теста: средний размер процесса (RSS) = 40 MB.

# 2. Определяем доступную память.
# Выделяем 500 MB для Nginx, OS и т.д. Доступно для PHP: 2048 MB - 500 MB = 1548 MB.

# 3. Рассчитываем pm.max_children.
1548 MB / 40 MB ≈ 38.7

# 4. Устанавливаем конфигурацию в www.conf.
pm = dynamic
pm.max_children = 40
pm.start_servers = 8
pm.min_spare_servers = 4
pm.max_spare_servers = 16

Вывод

Количество воркеров PHP-FPM на "одну задачу" (сервирование приложения) — это динамическая величина, оптимизируемая под конкретные условия. Ключевой лимит pm.max_children рассчитывается исходя из:

  • Потребления памяти одним процессом.
  • Общего объема доступной памяти сервера.
  • Ожидаемой пиковой нагрузки и параллелизма.

Не существует универсального значения. Регулярный мониторинг (активные процессы, очередь, память) и периодическая настройка конфигурации FPM в соответствии с изменениями в трафике и приложении — обязательные практики для поддержания высокой производительности и стабильности backend-сервиса.