PHP-FPM Linux, PHP-FPM (версия уточняется)

PHP-FPM: Как безопасно увеличить лимит процессов FPM без переполнения памяти

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

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

Лимит pm.max_children определяет максимальное число одновременно обслуживаемых запросов одним пулом, а не всю серверную нагрузку. Его бездумное увеличение может привести к нехватке оперативной памяти и аварийному завершению процессов; сначала нужно измерить потребление памяти, количество пулов и фактическую очередь.

В этой статье
  1. Что происходит и когда применима инструкция
  2. Причины и диагностические признаки
  3. Подробная пошаговая инструкция
  4. Как проверить, что проблема исправлена
  5. Если не помогло — дальнейшая диагностика и откат

#Что происходит и когда применима инструкция

Лимит pm.max_children определяет максимальное число одновременно обслуживаемых запросов одним пулом, а не всю серверную нагрузку. Его бездумное увеличение может привести к нехватке оперативной памяти и аварийному завершению процессов; сначала нужно измерить потребление памяти, количество пулов и фактическую очередь.

#Причины и диагностические признаки

Возможная причинаКак узнатьЧто делать
Пул действительно достигает лимитаПул действительно достигает лимита. В журнале max_children или статистике max children reached есть рост, при этом CPU/память имеют запас.В журнале max_children или статистике max children reached есть рост, при этом CPU/память имеют запас.Рассчитать новый предел по профилю нагрузки.
Ожидания БД или API удерживают процессыОжидания БД или API удерживают процессы. Низкий CPU при занятых дочерних процессах и долгих ответах.Низкий CPU при занятых дочерних процессах и долгих ответах.Исправлять ожидание, а не только лимит.
На сервере недостаточно RAM или swap уже используетсяНа сервере недостаточно RAM или swap уже используется. RSS PHP-процессов велик, OOM или swap-in/out мешают работе.RSS PHP-процессов велик, OOM или swap-in/out мешают работе.Уменьшать потребление, выбирать безопасный резерв.

#Подробная пошаговая инструкция

  1. Запишите текущий лимит и значения в пикНайдите нужный pool.d и параметр pm.max_children, проверьте режим pm (dynamic/ondemand/static). По журналу и странице состояния пула посмотрите максимальную активность и max children reached. Изменяйте только пул, для которого подтвердили ограничение.
  2. SSH, администратор на Debian/Ubuntu
    Linux · Терминал (Bash)КомандаНужен sudo
    SSH, администратор на Debian/Ubuntu. Только чтение списка пулов и лимитов.
    sudo grep -R -nE "^\s*(\[|pm\s*=|pm.max_children\s*=|pm.start_servers\s*=|pm.min_spare_servers\s*=|pm.max_spare_servers\s*=)" /etc/php/*/fpm/pool.d/*.conf
  1. Измерьте доступную память и распределение по процессамВыполните free -h, просмотрите список RSS дочерних обработчиков именно нужного пула. RSS процессов может включать общие страницы, поэтому простое суммирование RSS завышает реальное потребление; при возможности изучите PSS из smaps_rollup и метрики памяти под нагрузкой. Запишите фоновые расходы MySQL, веб-сервера, других пулов и запас ОС.
    Linux · Терминал (Bash)Команда
    SSH, только чтение. RSS показан в КБ, а вывод может включать другие службы. Не используйте один моментальный замер как гарантированный максимум.
    free -h; ps -eo pid,rss,user,args --sort=-rss | head -n 30
  1. Рассчитайте верхний предел по худшему наблюдаемому случаюПример: если после учёта остальных служб и резерва осталось 2 ГиБ, а один запрос пула по наблюдениям требует до 100 МиБ дополнительной памяти, исходная оценка — не более 20 одновременных обработчиков, а безопасный предел обычно ниже. Учитывайте колебания размера, другие пулы, память OPcache и резерв против OOM.
  1. Сначала сократите время занятости процессовПроверьте slowlog на запросах, которые удерживают процесс десятки секунд, и ограничьте ожидания БД/API в приложении. Удвоение pm.max_children увеличит число одновременных запросов к БД и может лишь перенести очередь в другое место.
  1. Измените лимит небольшой ступеньюСохраните копию pool.d. Если расчёт и измерения подтверждают запас, увеличьте pm.max_children умеренно, например с 10 до 12, не принимая эти числа за рекомендуемые для любого сервера. При pm=dynamic убедитесь, что pm.start_servers, pm.min_spare_servers и pm.max_spare_servers образуют согласованную конфигурацию.
  2. SSH, администратор, пример Debian PHP 8.2
    Linux · Терминал (Bash)С осторожностьюНужен sudo
    SSH, администратор, пример Debian PHP 8.2. Тест синтаксиса обязателен, reload может повлиять на активные запросы.
    sudo php-fpm8.2 -t && sudo systemctl reload php8.2-fpm

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

  1. Понаблюдайте один полный период пиковой нагрузкиСравните wait queue, 502/504, max children reached, доступную RAM, swap и метрики БД с базовыми. При росте подкачки или OOM верните старое значение из резервной копии и ищите причину больших запросов.

#Как проверить, что проблема исправлена

Задержка и очередь сократились, дочерние процессы не вызывают подкачку, OOM не возникает, остальные сайты не потеряли ресурсы.

#Если не помогло — дальнейшая диагностика и откат

Если при новом лимите сайт медленнее, проверьте внешние зависимости и количество подключений к БД. Повышать лимит ещё раз без новых измерений опасно.

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

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

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