#Что означает ошибка
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. | Ограничьте ботов, включите кэш. |
#Пошаговое решение
- Найдите конфигурацию пулаПодключитесь по SSH с правами администратора и определите фактический пул из сообщения
server reached pm.max_children: имя пула есть в журнале PHP-FPM. В Debian/Ubuntu настройки часто находятся в/etc/php/ВЕРСИЯ/fpm/pool.d/, но хостинги могут хранить их отдельно. Сохраните копию файла конкретного пула и выведите значенияpm,pm.max_children, а не правьте все пулы одновременно. - Узнайте память процессаВо время нагрузки выполните
ps -eo rss,comm,args | grep "[p]hp-fpm"и посмотрите расход памяти дочерних процессов именно нужного пула; выводrssдан в килобайтах. Параллельно проверьтеfree -hи доступную память под другие службы, MySQL и систему. Одна средняя цифра может скрывать пики: учитывайте самые тяжёлые запросы, а не только среднее потребление. - Рассчитайте max_childrenОцените доступный объём RAM после резерва для ОС, базы и других сайтов, разделите его на реалистичный размер одного процесса PHP-FPM при высокой нагрузке. Пример «2 ГБ / 50 МБ» не является универсальным значением: если процессы потребляют по 200 МБ, такой лимит приведёт к нехватке памяти. Сначала устраните медленные запросы и проверьте пиковую память.
- Настройте менеджер процессовВ файле нужного пула проверьте режим
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(замените версию) и штатную перезагрузку конфигурации, сохранив старые значения. - Включите slowlogЧтобы найти причину занятости процессов, добавьте в конфигурацию конкретного пула
request_slowlog_timeout = 5sи путьslowlogк доступному для записи службой каталогу. Проверьте синтаксис PHP-FPM и примените его конфигурацию. Воспроизведите медленный URL и посмотрите трассировку; запись после пяти секунд помогает выявить долгий вызов, но не доказывает, что надо увеличивать число процессов. - Найдите медленные скриптыПрочитайте несколько трассировок slowlog, сопоставьте их с журналами PHP и медленными запросами MySQL. Если в большинстве задержек одна функция или SQL-запрос, исправляйте его на тестовой копии приложения. Изменять
pm.max_childrenбез устранения повторяющихся зависаний не поможет: очередь запросов только вырастет при увеличении нагрузки. - Включите кэшированиеЕсли CMS поддерживает страничный/объектный кэш, настройте его через её документацию и проверьте, какие страницы можно кэшировать. Не кэшируйте персональные страницы и авторизацию одинаково для всех; для Redis/APCu проверьте доступность расширений, ограничение памяти и изоляцию данных между сайтами. Сравните нагрузку и время ответа до и после на конкретном URL.
- Ограничьте ботовЕсли причиной перегрузки являются автоматические запросы, проверьте журналы Nginx по IP, URL и времени; не блокируйте целую подсеть без оценки легитимных посетителей. Используйте точечные ограничения частоты на действительно проблемном маршруте с исключениями для авторизации, платежей и веб-хуков. После настройки проверьте
nginx -tи влияние на обычных пользователей. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
Параметр pm.max_requests перезапускает процесс после N запросов и защищает от утечек памяти. Для сайтов с редкими пиками подойдёт pm = ondemand, который запускает процессы по требованию, но при резких всплесках даёт задержку старта. Если сервер на 1 ГБ RAM, не ставьте больше 10–15 процессов: нехватка памяти хуже очереди. Проверьте также, что база данных и диск не стали узким местом: iostat, top, mysqladmin processlist. Документация — .