Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
PHP-FPM-ERR-POOL-BUSY Linux / DevOps

PHP-FPM Ошибка: [pool www] pool seems busy (pm.start_servers / pm.max_children)

Обновлено: 21.08.2026  ·  Официальная база знаний

Архитектура управления процессами Process Manager (PM) в PHP-FPM

Менеджер процессов PHP-FPM (FastCGI Process Manager) отвечает за динамическое создание и поддержание пула дочерних рабочих процессов (Worker processes) для обработки входящих HTTP-запросов от веб-серверов Nginx или Apache. Предупреждение «WARNING: [pool www] pool www seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)» или «server reached pm.max_children setting» генерируется мастер-процессом PHP-FPM в моменты пикового трафика, когда количество свободных процессов-воркеров (Idle workers) падает ниже установленного порога, а скорость создания новых воркеров не успевает за входящим потоком соединений.

Бизнес-риски

Ошибки HTTP 502 Bad Gateway и HTTP 504 Gateway Time-out у конечных пользователей, резкий рост времени отклика веб-сайта, деградация конверсии при маркетинговых рассылках.

Сравнение режимов Process Manager в PHP-FPM

Режим (pm)Принцип работыРекомендуемый сценарий использования
dynamicДинамически масштабирует пул от min_spare до max_children.Универсальный режим для большинства серверов с переменным трафиком.
staticВсегда держит запущенными ровно pm.max_children процессов.Highload-проекты на выделенных серверах (исключает оверхед на fork).
ondemandПроцессы запускаются только при поступлении запроса и завершаются по таймауту.Низконагруженные среды и микросервисы с редкими обращениями.

Регламент расчета и тюнинга конфигурации пула PHP-FPM

Шаг 1: Расчет среднего объема памяти одного процесса PHP-FPM

Перед увеличением лимитов определите, сколько оперативной памяти потребляет один воркер:

# Определение среднего потребления памяти процессом php-fpm (в МБ):
ps -C php-fpm8.2 -o rss= | awk '{sum+=$1} END {print "Средний размер воркера: " sum/NR/1024 " MB; Всего занято: " sum/1024 " MB"}'

# Пример расчета:
# Если на сервере 16 GB RAM, из них 4 GB выделено под ОС, MySQL и Nginx, доступно 12 GB (12288 MB).
# При среднем весе воркера 60 MB: pm.max_children = 12288 / 60 ≈ 200 процессов.

Шаг 2: Корректировка директив Process Manager в конфигурации пула

Отредактируйте конфигурационный файл пула (например, /etc/php/8.2/fpm/pool.d/www.conf):

sudo nano /etc/php/8.2/fpm/pool.d/www.conf

# Оптимизированные параметры для режима dynamic:
pm = dynamic
pm.max_children = 200
pm.start_servers = 40
pm.min_spare_servers = 20
pm.max_spare_servers = 60
pm.max_requests = 1000

# Включение расширенного лога статуса для диагностики:
pm.status_path = /status

# Проверка синтаксиса и перезапуск службы:
sudo php-fpm8.2 -t
sudo systemctl restart php8.2-fpm

Шаг 3: Мониторинг заполненности пула в реальном времени

# 1. Проверка текущих активных и простаивающих процессов через статус-страницу:
curl -s http://127.0.0.1/status?full

# 2. Мониторинг предупреждений в реальном времени:
sudo tail -f /var/log/php8.2-fpm.log | grep -E "seems busy|reached max_children"

Типовые ошибки администраторов

  • Установка pm.max_children = 500 при 4 ГБ RAM: При всплеске нагрузки процессы PHP-FPM займут всю физическую память, приведя к агрессивному своппингу и уничтожению процессов утилитой Linux OOM-Killer.
  • Отсутствие директивы pm.max_requests: Если параметр установлен в 0, утечки памяти в PHP-скриптах накапливаются, приводя к постепенному разрастанию процессов до гигабайтных размеров.
Сайт выдает 502/504 ошибки при росте посетителей?
Инженеры ITSTM рассчитают точные лимиты пулов PHP-FPM, ликвидируют узкие места в PHP-скриптах и настроят кластерную балансировку.
Практический опыт инженера: При использовании режима dynamic всегда рассчитывайте pm.start_servers по формуле: min_spare_servers + (max_spare_servers - min_spare_servers) / 2. Это предотвращает шторм создания процессов сразу после планового перезапуска пула.

Частые вопросы (FAQ)

Почему после увеличения pm.max_children сервер стал работать еще медленнее?

Если количество одновременно работающих процессов превышает количество процессорных ядер в десятки раз, процессор тратит все ресурсы на переключение контекста (Context Switching) и конкуренцию за диск.

Что делает параметр pm.max_requests = 1000?

Он указывает воркеру завершиться и освободить всю занятую память после обработки 1000 запросов, что защищает сервер от утечек памяти в сторонних библиотеках.

Как настроить Nginx для отдачи страницы /status PHP-FPM?

Добавьте в блок server директиву: location = /status { include fastcgi_params; fastcgi_pass unix:/run/php/php-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; allow 127.0.0.1; deny all; }.

В чем преимущество pm = static перед dynamic?

В режиме static воркеры создаются один раз при старте службы, что исключает задержки ядра на fork() процессов при внезапных всплесках запросов.