у меня есть 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
. Самые распространенные из них:
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.