PHP-FPM Linux

PHP-FPM: server reached pm.max_children setting

  • Обновлено
  • Чтение ≈ 4 минуты
  • Нужны права администратора

Краткий ответ

Предупреждение PHP-FPM «server reached pm.max_children setting» означает, что все процессы заняты. Рассчитайте max_children по памяти, найдите долгие запросы через slowlog, добавьте кэш и защиту от ботов.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение

#Что означает ошибка

Сообщение
WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

PHP-FPM запускает ограниченное число рабочих процессов (pm.max_children). Когда все заняты, новые запросы встают в очередь, а в журнале появляется server reached pm.max_children setting. Для посетителей это выглядит как медленные ответы и 502/504. Бездумное увеличение числа процессов может исчерпать память и привести к OOM-killer, поэтому сначала считайте, сколько памяти занимает один процесс.

#Причины и решения

Возможная причинаКак узнатьЧто делать
Слишком мал max_childrenЛимит ниже реальной нагрузки.Постоянные предупреждения при нормальной нагрузке.Рассчитайте и увеличьте.
Долгие запросыМедленные скрипты занимают воркеры.В slowlog видны долгие вызовы.Оптимизируйте код и запросы.
Нехватка памятиПроцессы занимают много RAM.free -m почти пусто, OOM.Уменьшите процессы или добавьте RAM.
Всплеск трафика или ботыПик посещаемости или парсеры.В логе доступа много запросов от одних IP.Ограничьте ботов, включите кэш.

#Пошаговое решение

  1. Найдите конфигурацию пулаПодключитесь по SSH с правами администратора и определите фактический пул из сообщения server reached pm.max_children: имя пула есть в журнале PHP-FPM. В Debian/Ubuntu настройки часто находятся в /etc/php/ВЕРСИЯ/fpm/pool.d/, но хостинги могут хранить их отдельно. Сохраните копию файла конкретного пула и выведите значения pm, pm.max_children, а не правьте все пулы одновременно.
  2. Узнайте память процессаВо время нагрузки выполните ps -eo rss,comm,args | grep "[p]hp-fpm" и посмотрите расход памяти дочерних процессов именно нужного пула; вывод rss дан в килобайтах. Параллельно проверьте free -h и доступную память под другие службы, MySQL и систему. Одна средняя цифра может скрывать пики: учитывайте самые тяжёлые запросы, а не только среднее потребление.
  3. Рассчитайте max_childrenОцените доступный объём RAM после резерва для ОС, базы и других сайтов, разделите его на реалистичный размер одного процесса PHP-FPM при высокой нагрузке. Пример «2 ГБ / 50 МБ» не является универсальным значением: если процессы потребляют по 200 МБ, такой лимит приведёт к нехватке памяти. Сначала устраните медленные запросы и проверьте пиковую память.
  4. Настройте менеджер процессовВ файле нужного пула проверьте режим pm: dynamic, ondemand или static. Для dynamic согласуйте pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers с учётом памяти; для ondemand часть этих параметров не действует. После правки выполните sudo php-fpm8.2 -t (замените версию) и штатную перезагрузку конфигурации, сохранив старые значения.
  5. Включите slowlogЧтобы найти причину занятости процессов, добавьте в конфигурацию конкретного пула request_slowlog_timeout = 5s и путь slowlog к доступному для записи службой каталогу. Проверьте синтаксис PHP-FPM и примените его конфигурацию. Воспроизведите медленный URL и посмотрите трассировку; запись после пяти секунд помогает выявить долгий вызов, но не доказывает, что надо увеличивать число процессов.
  6. Найдите медленные скриптыПрочитайте несколько трассировок slowlog, сопоставьте их с журналами PHP и медленными запросами MySQL. Если в большинстве задержек одна функция или SQL-запрос, исправляйте его на тестовой копии приложения. Изменять pm.max_children без устранения повторяющихся зависаний не поможет: очередь запросов только вырастет при увеличении нагрузки.
  7. Включите кэшированиеЕсли CMS поддерживает страничный/объектный кэш, настройте его через её документацию и проверьте, какие страницы можно кэшировать. Не кэшируйте персональные страницы и авторизацию одинаково для всех; для Redis/APCu проверьте доступность расширений, ограничение памяти и изоляцию данных между сайтами. Сравните нагрузку и время ответа до и после на конкретном URL.
  8. Ограничьте ботовЕсли причиной перегрузки являются автоматические запросы, проверьте журналы Nginx по IP, URL и времени; не блокируйте целую подсеть без оценки легитимных посетителей. Используйте точечные ограничения частоты на действительно проблемном маршруте с исключениями для авторизации, платежей и веб-хуков. После настройки проверьте nginx -t и влияние на обычных пользователей.
  9. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Оценка памяти процессов и текущего состояния пула.
    Linux · Терминал (Bash)КомандаНужен sudo
    Оценка памяти процессов и текущего состояния пула.
    ps --no-headers -o rss -C php-fpm8.2 | awk '{sum+=$1} END {print sum/NR/1024 " MB avg"}'
    free -m
    sudo systemctl status php8.2-fpm
    sudo tail -n 20 /var/log/php8.2-fpm.log
    Вариант 2Пример настройки пула (подберите значения под свою память).
    INI
    Пример настройки пула (подберите значения под свою память).
    pm = dynamic
    pm.max_children = 40
    pm.start_servers = 8
    pm.min_spare_servers = 4
    pm.max_spare_servers = 12
    pm.max_requests = 500
    request_slowlog_timeout = 5s
    slowlog = /var/log/php-fpm-slow.log

Параметр pm.max_requests перезапускает процесс после N запросов и защищает от утечек памяти. Для сайтов с редкими пиками подойдёт pm = ondemand, который запускает процессы по требованию, но при резких всплесках даёт задержку старта. Если сервер на 1 ГБ RAM, не ставьте больше 10–15 процессов: нехватка памяти хуже очереди. Проверьте также, что база данных и диск не стали узким местом: iostat, top, mysqladmin processlist. Документация — php.net: FPM.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.