Назад | Перейти на главную страницу

php5-fpm: сервер достиг pm.max_children

у меня есть Nginx + php5-fpm. Несколько раз в час мой сайт зависает, и в лог-файле я вижу следующее:

ВНИМАНИЕ: сервер [pool www] достиг настройки pm.max_children (5), рассмотрите возможность ее повышения.

/etc/php5/fpm/pool.d/www.conf файл содержит следующую конфигурацию:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Сервер: AMD Opteron ™ 3280, 8 ядер, 2,4 ГГц, 16 ГБ DIMM (DDR3).

Я понятия не имею, какие числа мне следует поместить в файл www.conf для этого сервера. Могу я кому-нибудь помочь? Спасибо

Есть много возможных причин, по которым ваш PHP-FPM достигнет max_children. Самые распространенные из них:

  • Множество параллельных запросов от ваших клиентов
  • Медленное выполнение скриптов PHP
  • Очень низкая установка max_children

Глядя на спецификации вашей машины, предполагая, что здесь не работает ничего, кроме PHP + Nginx, я думаю, вы могли бы установить его намного выше, чем 5. Вы говорите, что у вас 8 ядер, обычно Nginx требует гораздо меньше ЦП, чем PHP, поэтому с 5 дочерними элементами вы, вероятно, никогда не сможете использовать их все. Я обычно устанавливаю что-то вроде количество ядер x 2 или количество ядер x 4, в зависимости от потребления памяти вашими скриптами PHP.

Я обнаружил, что установка значения pm.max_requests (которое по умолчанию закомментировано) помогло исправить эти ошибки. Этот параметр заставляет дочерние запросы возрождаться после выполнения определенного количества запросов и может быть полезен, если где-то в вашем коде или сторонних библиотеках есть утечки памяти.

В /etc/php-fpm.d/www.conf:

pm.max_requests = 500

это ссылка на сайт может быть полезно - в нем объясняется, как рассчитать количество дочерних процессов на основе объема памяти в системе:

Настройка дочерних процессов для PHP-FPM (Nginx)

Проблема:

В журналах появляется следующее предупреждающее сообщение:

[26-Jul-2012 09:49:59] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 8 idle, and 58 total children
[26-Jul-2012 09:50:00] WARNING: [pool www] server reached pm.max_children setting (50), consider raising it

Это означает, что процессов PHP-FPM не хватает.

Решение:

Нам нужно рассчитать и изменить эти значения в зависимости от объема памяти в системе:

/etc/php-fpm.d/www.conf

pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
  • следующая команда поможет нам определить объем памяти, используемый каждым дочерним процессом (PHP-FPM):
ps -ylC php-fpm --sort:rss

Столбец RSS показывает использование физической памяти без перестановки процессами PHP-FPM в килобайтах.

В среднем каждый процесс PHP-FPM занимал на моей машине ~ 75 МБ ОЗУ.

Соответствующее значение для pm.max_children можно рассчитать как:

pm.max_children = Общий объем ОЗУ, выделенный для веб-сервера / Максимальный размер дочернего процесса - в моем случае это было 85 МБ

На сервере 8 ГБ оперативной памяти, поэтому:

pm.max_children = 6144MB / 85MB = 72

Я оставил немного памяти, чтобы система могла дышать. При расчете использования памяти необходимо учитывать любые другие службы, запущенные на машине.

Я изменил настройки следующим образом:

pm.max_children = 70
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 35
pm.max_requests = 500

Обратите внимание, что очень высокие значения не обязательно означают что-то хорошее.

Вы можете проверить среднее использование памяти одним процессом PHP-FPM с помощью этой удобной команды:

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

Вы можете использовать те же шаги, что и выше, для расчета значения MaxClients для веб-сервера Apache - просто замените php-fpm на httpd.