WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
#Что означает предупреждение
В 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. | Уменьшите значение. |
#Как рассчитать
- Определите средний размер процесса PHP-FPM в памятиОпределите точную версию и имя пула PHP-FPM, обслуживающего нужный сайт, по панели хостинга и конфигурации Nginx/Apache; CLI и другой пул могут отличаться. Под пиковой, но типичной нагрузкой посмотрите память его дочерних процессов через
ps -eo pid,rss,cmd | grep php-fpm, измерив несколько раз. RSS включает разделяемую память и может завышать суммарное потребление; для точного расчёта лучше PSS изsmem, если доступен. - Определите память, доступную под PHP: общий объём минус система, базаВ терминале сервера выполните
free -hи проверьте процессамиps -eo pid,rss,cmd --sort=-rss | head. Оставьте память системе, MySQL, Nginx, файловому кешу и другим пулам PHP; нельзя считать всю оперативную память доступной одному сайту. Если на сервере есть cgroup или контейнер, определяющим может быть его отдельный лимит памяти. - Разделите: max_children = доступная память / размер процессаДля предварительной оценки разделите бюджет памяти этого пула на потребление одного его дочернего процесса при реальной нагрузке: например, 2 ГиБ / 80 МиБ ≈ 25 процессов. Это лишь верхняя оценка: RSS способен учитывать общие страницы повторно, а запросы различаются по нагрузке. Начните с меньшего числа и сравните пиковое использование памяти.
- Оставьте запас 10–20 %Оставьте дополнительный запас на всплески, фоновые задачи и фрагментацию; вместо механических 10–20% оцените свободную память и события OOM на вашем сервере. Для проверки
journalctl -k -b | grep -i oom(при достаточных правах) и счётчики swap. Если система уже активно использует swap, повышениеpm.max_childrenможет сделать сайт медленнее. - Выберите режим pm: dynamicВ конфигурации нужного пула (
/etc/php/ВЕРСИЯ/fpm/pool.d/ИМЯ.confна Debian/Ubuntu, у панелей другой путь) выберитеpm = dynamic,ondemandилиstaticпод характер нагрузки.dynamicподдерживает свободные процессы,ondemandэкономит память при редких запросах,staticдержит фиксированное число; ни один вариант не универсален. - Настройте 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. Перед правкой сохраните конфигурацию пула. При другом режиме эти параметры могут не применяться или иметь иной смысл. - Рассмотрите ограничение числа запросов на дочерний процессПри подозрении на рост памяти отдельного процесса параметр
pm.max_requestsпозволяет периодически заменять дочерний процесс после заданного количества запросов. Это не устранение утечки в коде: сначала соберите измерения и примеры медленных запросов. Убедитесь, что приложение допускает смену воркера без потери данных, и не ставьте слишком малое число. - Перезапустите службу и наблюдайтеЗапустите тест конфигурации установленной версии (
php-fpm8.2 -t— пример, для сайта нужна фактическая команда), затем согласованно перезагрузите только нужную службу. Проверьте через журнал, что пул запущен, и наблюдайте за OOM, очередьюlisten queue,max children reached, задержками и памятью под обычной нагрузкой и при пике. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Пояснение режимов
#Наблюдение и тесты
После изменения наблюдайте метрики: число активных процессов, очередь (listen queue на странице статуса), использование памяти. Протестируйте нагрузку утилитой ab -n 500 -c 20 https://example.ru/ или wrk. Если очередь не пустеет, а память свободна, увеличьте max_children ещё немного; если память исчерпана, оптимизируйте код и кеширование (OPcache, Redis) вместо увеличения числа процессов.