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

41

У меня есть 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, Octo-Core, 8x 2,4 ГГц, 16 ГБ DIMM (DDR3).

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

user1821484
источник

Ответы:

40

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

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

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

переигровка
источник
Это сайт знакомств с php-чатом, и пользователи отправляют миллионы мгновенных сообщений. Вчера вечером, когда у меня было ~ 300 пользователей в сети, команда netstat -an | grep 80 | wc - результат был почти 400.
user1821484
1
У меня на самом деле есть похожий сайт знакомств. Я думаю, что вам определенно нужно больше детей PHP. Моя конфигурация следующая: 20 тыс. Одновременных онлайн-пользователей, 12 машин PHP с 8 ядрами в каждой, 32 рабочих на каждой машине PHP. Это работает довольно хорошо. Вы также должны посмотреть, сколько у вас свободной памяти, я подозреваю, что у вас есть немного, если ваш PHP не огромен. Если у вас есть свободная память, почему бы не использовать ее для еще нескольких работников?
повторить
@ user1821484 Это правильно; pm.max_childrenявляется слишком низким . Значение 10 целесообразно для небольшого VPS-сервера с 1 ГБ ОЗУ; у вас гораздо больший сервер. Увеличивайте это значение до тех пор, пока не прекратите получать ошибки, а затем повышайте его снова в случае, если вы получите всплеск трафика.
Майкл Хэмптон
Спасибо за ответы. Я увеличил настройку pm.max_children до 10, и теперь я начал получать эту ошибку: ПРЕДУПРЕЖДЕНИЕ: [pool www] кажется занятым (вам может потребоваться увеличить pm.start_servers или pm.min / max_spare_servers), порождая 16 детей, их 0 простаивают и всего 8 детей. Может кто-нибудь подсказать, что мне нужно увеличить? Спасибо.
user1821484
Мне кажется, что ядра х 2 или ядра х 4 звучат очень низко. У меня есть машина с 8 ядрами и 8 ГБ оперативной памяти с pm.max_children = 48, и мы все еще получаем предупреждения о достижении сервером pm.max_children . Эта машина не приближается к пределам процессора или памяти. Я думаю, что лучшим подходом было бы оптимизировать этот параметр в сочетании с соответствующими настройками nginx (или apache) и выбрать значение после определения того, сколько памяти потребляет каждый процесс PHP.
С. Имп
19

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

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

pm.max_requests = 500
Том Джовитт
источник
13

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

HTF
источник
7
Этот ответ будет бесполезен, как только эта ссылка исчезнет.
miken32
2
По сути, ссылка говорит ... Подходящее значение для pm.max_children можно рассчитать следующим образом: pm.max_children = Общий объем ОЗУ, выделенный для веб-сервера / Максимальный размер дочернего процесса
jaywhy13