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

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

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

PHP-FPM: WARNING [pool www] server reached pm.max_children setting — Решение

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

Архитектура диспетчеризации процессов FastCGI Process Manager (FPM)

Предупреждение WARNING: [pool www] server reached pm.max_children setting, consider raising it регистрируется в главном журнале php-fpm.log, когда все доступные дочерние рабочие процессы (worker processes), лимитированные директивой pm.max_children, заняты обработкой входящих HTTP-запросов. В этот момент менеджер master-процесса PHP-FPM не может создать новые воркеры. Входящие запросы от веб-сервера (Nginx/Apache) ставятся в системную очередь соединений сокета (listen.backlog). Если очередь переполняется или истекает таймаут ожидания, веб-сервер возвращает клиентам ошибки 502 Bad Gateway или 504 Gateway Time-out.

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

Медленная загрузка страниц сайта у пользователей, потеря заказов в интернет-магазинах, срыв рекламных кампаний из-за падения сайта при наплыве трафика, деградация SEO-позиций.

Таблица параметров управления пулом процессов PHP-FPM

Директива конфигаРежим pm = dynamicНазначение
pm.max_childrenОбязательный расчетМаксимальное число одновременно работающих дочерних процессов воркеров.
pm.start_serversРасчетныйКоличество воркеров, создаваемых мгновенно при старте службы PHP-FPM.
pm.min_spare_serversРасчетныйМинимальное количество свободных резервных процессов в ожидании запросов.
pm.max_spare_serversРасчетныйМаксимальное количество свободных резервных процессов.
pm.max_requests500 - 1000Число запросов до принудительного перезапуска воркера (защита от утечек RAM).

Инженерный расчет и пошаговая настройка пула PHP-FPM

Сценарий 1: Расчет безопасного значения pm.max_children по формуле

Никогда не ставьте случайные числа. Рассчитайте лимит исходя из реального потребления памяти одним процессом:

# 1. Определение среднего объема оперативной памяти одного процесса PHP-FPM (в МБ):
ps --no-headers -o rss -C php-fpm | awk '{ sum+=$1 } END { printf ("%.2f MB\n", sum/NR/1024) }'

# 2. Инженерная формула расчета:
# pm.max_children = (Общая RAM сервера - RAM для ОС, СУБД и Nginx) / Средний размер процесса PHP
# Пример: Сервер 8GB RAM. 3GB выделено под MySQL/Nginx/ОС. Свободно 5GB (5120MB). Средний процесс PHP = 60MB.
# pm.max_children = 5120 / 60 ≈ 85

Сценарий 2: Применение оптимизированной конфигурации пула

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

[www]
user = www-data
group = www-data
listen = /run/php/php8.2-fpm.sock

pm = dynamic
pm.max_children = 80
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30

# Защита от утечек памяти:
pm.max_requests = 1000

# Логирование медленных запросов:
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm-slow.log

Сценарий 3: Проверка конфигурации и перезапуск службы

Проверьте синтаксис перед перезапуском, чтобы исключить падение production-сайтов:

# Проверка синтаксиса конфигурационных файлов
php-fpm8.2 -t

# Мягкая перезагрузка службы без обрыва текущих сессий (Graceful Reload)
systemctl reload php8.2-fpm

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

  • Установка завышенного pm.max_children без учета памяти: Если выставить max_children = 300 на сервере с 4GB RAM, при наплыве трафика сервер моментально уйдет в Swap, сработает OOM Killer и уронит MySQL.
  • Игнорирование утечек памяти в коде: Если параметр pm.max_requests равен 0, один процесс с утечкой памяти будет расти до нескольких гигабайт, блокируя весь сервер.
Сайт падает с ошибками 502/504 при всплесках трафика и рекламе?
ITSTM проведет глубокую оптимизацию веб-стека (Nginx + PHP-FPM + MySQL/Redis), обеспечив максимальную скорость и стабильность под высокими нагрузками.
Практический опыт инженера: Для высоконагруженных проектов всегда включайте slowlog (request_slowlog_timeout = 3s). В 90% случаев нехватка max_children вызвана не нехваткой воркеров, а несколькими неоптимальными SQL-запросами, блокирующими процессы на десятки секунд.

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

В чем разница между режимами pm = static, dynamic и ondemand?

Static держит фиксированное число воркеров всегда в памяти (быстрее всего). Dynamic масштабирует процессы в заданных пределах. Ondemand создает воркер только при поступлении запроса (экономит RAM).

Как включить страницу статуса PHP-FPM для мониторинга?

Раскомментируйте pm.status_path = /status в конфиге пула и добавьте соответствующий location в Nginx для просмотра активных процессов.

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

Большее количество одновременных PHP-воркеров создает пропорционально большее количество одновременных соединений к базе данных MySQL, исчерпывая лимит max_connections.

Как защитить PHP-FPM от бесконечно зависших скриптов?

Настройте директивы request_terminate_timeout = 60s в конфиге пула и max_execution_time = 60 в php.ini.