PHP-FPM Linux

PHP-FPM: как рассчитать pm.max_children по памяти

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

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

Предупреждение pm.max_children reached в PHP-FPM означает исчерпание пула процессов. Рассчитайте max_children по доступной памяти и среднему размеру процесса, выберите режим pm, настройте start_servers и spare, проверьте журнал и перезапустите службу.

В этой статье
  1. Что означает предупреждение
  2. Как рассчитать
  3. Пояснение режимов
  4. Наблюдение и тесты
pm.max_children reached
WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
По-русскиВсе процессы PHP-FPM заняты, запросы ждут в очереди.

#Что означает предупреждение

В PHP-FPM каждый одновременный запрос обслуживает отдельный процесс. Параметр pm.max_children ограничивает их число. Когда нагрузка превышает лимит, новые запросы ждут, сайт медленно отвечает или выдаёт 502/504. В журнале появляется предупреждение «server reached pm.max_children setting». Но простое увеличение значения без расчёта опасно: если процессов окажется больше, чем влезает в память, сервер начнёт использовать подкачку или процессы будут убиты системой (OOM killer).

Возможная причинаКак узнатьЧто делать
dynamicЧисло процессов меняется между min и max.Универсальный выбор.Задайте spare-серверы.
ondemandПроцессы создаются по запросу.Экономит память на малой нагрузке.Задержка при первом запросе.
staticФиксированное число.Стабильная высокая нагрузка.Нужен точный расчёт памяти.
Утечки памятиПроцессы растут.Память увеличивается со временем.pm.max_requests = 500.
Медленные скриптыЗанимают процессы.Всё время max_children.Оптимизируйте запросы, см. slowlog.
Нехватка памятиСлишком большой max_children.OOM killer.Уменьшите значение.

#Как рассчитать

  1. Определите средний размер процесса PHP-FPM в памятиОпределите точную версию и имя пула PHP-FPM, обслуживающего нужный сайт, по панели хостинга и конфигурации Nginx/Apache; CLI и другой пул могут отличаться. Под пиковой, но типичной нагрузкой посмотрите память его дочерних процессов через ps -eo pid,rss,cmd | grep php-fpm, измерив несколько раз. RSS включает разделяемую память и может завышать суммарное потребление; для точного расчёта лучше PSS из smem, если доступен.
  2. Определите память, доступную под PHP: общий объём минус система, базаВ терминале сервера выполните free -h и проверьте процессами ps -eo pid,rss,cmd --sort=-rss | head. Оставьте память системе, MySQL, Nginx, файловому кешу и другим пулам PHP; нельзя считать всю оперативную память доступной одному сайту. Если на сервере есть cgroup или контейнер, определяющим может быть его отдельный лимит памяти.
  3. Разделите: max_children = доступная память / размер процессаДля предварительной оценки разделите бюджет памяти этого пула на потребление одного его дочернего процесса при реальной нагрузке: например, 2 ГиБ / 80 МиБ ≈ 25 процессов. Это лишь верхняя оценка: RSS способен учитывать общие страницы повторно, а запросы различаются по нагрузке. Начните с меньшего числа и сравните пиковое использование памяти.
  4. Оставьте запас 10–20 %Оставьте дополнительный запас на всплески, фоновые задачи и фрагментацию; вместо механических 10–20% оцените свободную память и события OOM на вашем сервере. Для проверки journalctl -k -b | grep -i oom (при достаточных правах) и счётчики swap. Если система уже активно использует swap, повышение pm.max_children может сделать сайт медленнее.
  5. Выберите режим pm: dynamicВ конфигурации нужного пула (/etc/php/ВЕРСИЯ/fpm/pool.d/ИМЯ.conf на Debian/Ubuntu, у панелей другой путь) выберите pm = dynamic, ondemand или static под характер нагрузки. dynamic поддерживает свободные процессы, ondemand экономит память при редких запросах, static держит фиксированное число; ни один вариант не универсален.
  6. Настройте pm.start_servers, pm.min_spare_servers, pm.max_spare_serversДля режима dynamic задайте согласованные pm.start_servers, pm.min_spare_servers, pm.max_spare_servers так, чтобы стартовое и максимальное число свободных процессов не превышало pm.max_children. Перед правкой сохраните конфигурацию пула. При другом режиме эти параметры могут не применяться или иметь иной смысл.
  7. Рассмотрите ограничение числа запросов на дочерний процессПри подозрении на рост памяти отдельного процесса параметр pm.max_requests позволяет периодически заменять дочерний процесс после заданного количества запросов. Это не устранение утечки в коде: сначала соберите измерения и примеры медленных запросов. Убедитесь, что приложение допускает смену воркера без потери данных, и не ставьте слишком малое число.
  8. Перезапустите службу и наблюдайтеЗапустите тест конфигурации установленной версии (php-fpm8.2 -t — пример, для сайта нужна фактическая команда), затем согласованно перезагрузите только нужную службу. Проверьте через журнал, что пул запущен, и наблюдайте за OOM, очередью listen queue, max children reached, задержками и памятью под обычной нагрузкой и при пике.
  9. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Средний размер процесса PHP-FPM (МБ)
    Linux · Терминал (Bash)Команда
    Средний размер процесса PHP-FPM (МБ)
    ps -eo pid,rss,cmd | grep "[p]hp-fpm"
    # Смотрите процессы нужного пула; RSS может включать разделяемую память.
    Вариант 2Свободная память и использование
    Linux · Терминал (Bash)Команда
    Свободная память и использование
    free -m
    ps -eo pid,rss,cmd --sort=-rss | head -10
    Вариант 3Пример для сервера с 4 ГБ ОЗУ, где под PHP отведено около 2 ГБ, процесс ~60 МБ
    INIКоманда
    Пример для сервера с 4 ГБ ОЗУ, где под PHP отведено около 2 ГБ, процесс ~60 МБ
    pm = dynamic
    pm.max_children = 30
    pm.start_servers = 8
    pm.min_spare_servers = 4
    pm.max_spare_servers = 12
    pm.max_requests = 500
    Вариант 4Проверить конфигурацию и перезагрузить
    Linux · Терминал (Bash)КомандаНужен sudo
    Проверить конфигурацию и перезагрузить
    sudo php-fpm8.2 -t
    sudo systemctl reload php8.2-fpm
    Вариант 5Журнал пула и состояние
    Linux · Терминал (Bash)КомандаНужен sudo
    Журнал пула и состояние
    sudo grep "max_children" /var/log/php8.2-fpm.log | tail -5
    sudo systemctl status php8.2-fpm --no-pager
    Вариант 6Включить страницу статуса пула (закройте от внешнего доступа в nginx!)
    INIКоманда
    Включить страницу статуса пула (закройте от внешнего доступа в nginx!)
    pm.status_path = /fpm-status

#Пояснение режимов

#Наблюдение и тесты

После изменения наблюдайте метрики: число активных процессов, очередь (listen queue на странице статуса), использование памяти. Протестируйте нагрузку утилитой ab -n 500 -c 20 https://example.ru/ или wrk. Если очередь не пустеет, а память свободна, увеличьте max_children ещё немного; если память исчерпана, оптимизируйте код и кеширование (OPcache, Redis) вместо увеличения числа процессов.

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

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

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