#Что происходит и когда применима инструкция
Лимит 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 мешают работе. | Уменьшать потребление, выбирать безопасный резерв. |
#Подробная пошаговая инструкция
- Запишите текущий лимит и значения в пикНайдите нужный pool.d и параметр pm.max_children, проверьте режим pm (dynamic/ondemand/static). По журналу и странице состояния пула посмотрите максимальную активность и max children reached. Изменяйте только пул, для которого подтвердили ограничение.
- SSH, администратор на Debian/UbuntuLinux · Терминал (Bash)КомандаНужен sudoSSH, администратор на 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
- Измерьте доступную память и распределение по процессамВыполните 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
- Рассчитайте верхний предел по худшему наблюдаемому случаюПример: если после учёта остальных служб и резерва осталось 2 ГиБ, а один запрос пула по наблюдениям требует до 100 МиБ дополнительной памяти, исходная оценка — не более 20 одновременных обработчиков, а безопасный предел обычно ниже. Учитывайте колебания размера, другие пулы, память OPcache и резерв против OOM.
- Сначала сократите время занятости процессовПроверьте slowlog на запросах, которые удерживают процесс десятки секунд, и ограничьте ожидания БД/API в приложении. Удвоение pm.max_children увеличит число одновременных запросов к БД и может лишь перенести очередь в другое место.
- Измените лимит небольшой ступеньюСохраните копию pool.d. Если расчёт и измерения подтверждают запас, увеличьте pm.max_children умеренно, например с 10 до 12, не принимая эти числа за рекомендуемые для любого сервера. При pm=dynamic убедитесь, что pm.start_servers, pm.min_spare_servers и pm.max_spare_servers образуют согласованную конфигурацию.
- SSH, администратор, пример Debian PHP 8.2Linux · Терминал (Bash)С осторожностьюНужен sudoSSH, администратор, пример Debian PHP 8.2. Тест синтаксиса обязателен, reload может повлиять на активные запросы.
sudo php-fpm8.2 -t && sudo systemctl reload php8.2-fpmКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Понаблюдайте один полный период пиковой нагрузкиСравните wait queue, 502/504, max children reached, доступную RAM, swap и метрики БД с базовыми. При росте подкачки или OOM верните старое значение из резервной копии и ищите причину больших запросов.
#Как проверить, что проблема исправлена
Задержка и очередь сократились, дочерние процессы не вызывают подкачку, OOM не возникает, остальные сайты не потеряли ресурсы.
#Если не помогло — дальнейшая диагностика и откат
Если при новом лимите сайт медленнее, проверьте внешние зависимости и количество подключений к БД. Повышать лимит ещё раз без новых измерений опасно.