Вопрос: PHP5-FPM и «ondemand»


Я настроил сервер с Nginx и PHP5-FPM, и все работает нормально. Однако, когда я добавляю все больше и больше сайтов на сервер, я вижу, что использование памяти постоянно увеличивается, и я пришел к выводу, что PHP5-FPM «виноват».

В настоящее время я создаю отдельный пул PHP5-FPM для каждого сайта и настраиваю этот пул в соответствии с ожидаемым трафиком. Однако, с достаточным количеством сайтов, я, в конце концов, получаю сервер, который просто сидит на довольно большом числе PHP5-FPM «детей», которые просто ждут работы.

Я только что узнал о по требованию Режим PHP5-FPM, который позволяет мне настроить PHP5-FPM таким образом, чтобы дочерние процессы разветвлялись только тогда, когда это было действительно необходимо, а затем поддерживались в течение определенной продолжительности для обработки.

Однако я не могу найти слишком много деталей об этом. Мне больше всего любопытно, как переменные pm.max_children а также pm.max_requests влиять на по требованию (если вообще). Я предполагаю, что переменные pm.start_servers, pm.min_spare_servers, pm.max_spare_servers не применяются к по требованию Режим.


4
2018-02-13 08:39


Источник


В этой ссылке перечислены возможные конфигурации, и каждый из них подробно описан. Вы найдете ответ на каждую конкретную конфигурацию, о которой вы сомневаетесь. Справка по настройке PHP-FPM - Leonardo Jauregui


Ответы:


вы правы, start_servers, min_spare_servers и max_spare_servers не применяются к режиму ondemand. Следующие переменные относятся к режиму ondemand:

  • pm.max_children
  • pm.process_idle_timeout
  • pm.max_requests

Когда вы устанавливаете pm = ondemand, FPM будет разворачивать детей, как только он понадобится, всегда сохраняя число детей меньше или равно pm.max_children, поэтому эта переменная является верхним пределом для числа детей, раздвоенных одновременно.

Две другие переменные позволяют указать, когда нужно уничтожить детей:

  • pm.process_idle_timeout устанавливает, как долго дети ждут без работы, прежде чем они будут уничтожены. Он определяется в секундах.

  • pm.max_requests определяет, сколько запросов (по одному) дети будут обрабатывать до того, как они будут уничтожены. Например, если вы установите для этой переменной значение 50, дети будут обрабатывать 50 запросов и закрывать себя. Если мастер-процесс FPM все еще нуждается в других дочерних элементах, он будет вилять новый.

В моей компании мы используем ondemand mode на FPM, и мы используем pm.max_requests для принудительной утилизации детей fpm и избегаем использования высокой памяти.

Надеюсь это поможет,

Приветствую.


10
2018-02-13 17:15



Спасибо за ваш вклад! В вашем опыте, что является разумным значением для pm.process_idle_timeout? - sbrattla
Значение по умолчанию для каждой новой настройки - 50. Однако я провел тесты с более низкими и более высокими значениями. Лично я не опускаюсь ниже 15 или 10, потому что он вызывает так много событий kill / fork и снижает производительность. С другой стороны, я думаю, что значения, превышающие 100/150, слишком высоки для нашей модели принудительной переработки. - Juan Traverso


Возможно, эта ошибка https://bugs.php.net/bug.php?id=72935

TLDR; Если два клиента подключаются к PHP-FPM в режиме ondemand в одном и том же unix-сокете, прежде чем accept () произойдет в дочернем случае, только один получит accept () ed.


1
2017-08-24 21:34