Ограничить использование ЦП для каждого пула PHP
Я использую типичный стек LEMP, в котором у меня есть несколько пулов PHP-FPM, по одному для каждого сайта, расположенного на Rocky Linux 8 VPS. Иногда какой-то мошеннический процесс на одном из сайтов вызывает огромную нагрузку на процессор и замедляет работу всего остального. Я пробовал ограничить использование ЦП для каждого пользователя с помощью cgroups, но, похоже, это не сработает из-за того, что процессы PHP-FPM разветвляются. Есть ли способ ограничить использование ЦП для каждого пула FPM?
2 ответа
Мне не известен какой-либо способ достижения вашей цели, когда процессы выполняются одним и тем же пользователем/в одной контрольной группе. После инициализации это можно сделать с помощью cpulimit, которым можно управлять через службу типа сторожевого таймера (fail2ban?), однако это очень неуклюжее решение.
Всегда полезно установить строгие ограничения по времени выполнения (это можно установить для каждого сценария на вашем веб-сервере).
Вы можете запустить несколько экземпляров php-fpm, каждый из которых имеет один пул, и каждый fpm находится в разных контрольных группах.
Эффективное управление использованием ЦП может иметь решающее значение для обеспечения оптимальной производительности и предотвращения истощения ресурсов. Один из способов добиться этого — ограничить использование ЦП для каждого пула PHP. Пул PHP — это набор процессов PHP, которые обрабатывают входящие запросы.
Чтобы ограничить использование ЦП для каждого пула PHP, вы можете использовать функции управления процессами (PCNTL), предоставляемые PHP. Эти функции позволяют вам контролировать и отслеживать процессы, выполняемые на вашем сервере. Вот шаги по реализации ограничения использования ЦП:
Определите пул PHP. Начните с определения конкретного пула PHP, который вы хотите ограничить. Каждый пул PHP обычно связан с определенным веб-сайтом или приложением.
Внедрите логику ограничения использования ЦП: используйте функции PCNTL для управления использованием ЦП. Функция pcntl_setrlimit() позволяет вам установить ограничения ресурсов для конкретного процесса. В этом случае вы установите ограничение ЦП, используя константу RLIMIT_CPU.
$cpuLimit = 50; // Percentage of CPU limit
// Convert percentage to microseconds
$microseconds = $cpuLimit * 10000;
// Set CPU limit for the current process
pcntl_setrlimit(RLIMIT_CPU, [$microseconds, $microseconds]);
Приведенный выше код устанавливает ограничение ЦП на 50 % доступного времени ЦП для текущего процесса PHP.
Применить ограничение к пулу PHP. Чтобы гарантировать, что ограничение применяется к конкретному пулу PHP, вы можете использовать разветвление процесса. Разветвление создает дочерние процессы, которые наследуют характеристики родительского процесса, включая ограничение ЦП.
// Identify the PHP pool you want to limit
$poolName = "pool1";
// Fork the current process
$pid = pcntl_fork();
if ($pid === -1) {
// Handle forking error
} elseif ($pid) {
// Parent process
// Monitor and manage the child process as needed
} else {
// Child process
// Set CPU limit for the child process
pcntl_setrlimit(RLIMIT_CPU, [$microseconds, $microseconds]);
// Execute the PHP pool logic
run_php_pool($poolName);
// Exit the child process
exit();
}
Разветвив процесс, вы можете гарантировать, что ограничение ЦП будет применяться только к указанному вами пулу PHP.
Мониторинг и управление пулом PHP. После реализации ограничения использования ЦП вы можете отслеживать пул PHP и управлять им по мере необходимости. Сюда входит отслеживание использования ЦП, настройка ограничений ресурсов и обработка любых исключений или ошибок, которые могут возникнуть.
Ограничивая использование ЦП для каждого пула разработчиков PHP , вы можете предотвратить монополизацию системных ресурсов одним пулом и влияние на производительность других приложений или веб-сайтов. Важно точно настроить ограничение ЦП в зависимости от конкретной мощности вашего сервера и требований к рабочей нагрузке, чтобы обеспечить правильный баланс между производительностью и распределением ресурсов.