Вопрос или проблема
Я пытаюсь настроить лимиты ресурсов для пользователей с использованием срезов systemd. Я создал пользовательский срез с помощью этого скрипта:
#!/bin/bash
user=$1
user_id=$(id -u "$user")
user_slice="user-${user_id}.slice"
# Установить квоту CPU для CFS:
systemctl set-property "$user_slice" CPUQuota="20%"
systemctl set-property "$user_slice" CPUQuotaPeriodSec="100ms"
systemctl set-property "$user_slice" MemoryHigh="1G"
systemctl set-property "$user_slice" MemorySwapMax="1G"
Срез работает прекрасно для процессов, когда пользователи входят в систему через SSH. Однако с PHP-FPM эти ограничения не применяются, потому что:
- Основной процесс PHP-FPM работает от имени root. Хотя пул PHP-FPM работает
- от имени правильного пользователя, они не унаследуют автоматически
- срез пользователя. Юнит сервиса PHP-FPM не поддерживает динамические пользовательские срезы.
У меня есть скрипт, который может обнаруживать процессы, принадлежащие конкретным пользователям. Как я могу переместить эти обнаруженные рабочие процессы PHP-FPM в соответствующие пользовательские срезы?
Ответ или решение
Перемещение процессов PHP-FPM в пользовательские системные срезы
Вопрос настройки ресурсных ограничений для пользователей с использованием системных срезов (systemd slices) является актуальной задачей для системных администраторов, стремящихся к эффективному распределению ресурсов. Рассмотрим, как можно достичь этой цели, перемещая рабочие процессы PHP-FPM в соответствующие пользовательские срезы.
1. Понимание проблемы
Как вы отметили, процессы PHP-FPM имеют несколько особенностей:
- Главный процесс PHP-FPM, работающий от имени
root
, не может наследовать ограничения, заданные для пользовательских срезов. - Пулы PHP-FPM, выполняющиеся от имени соответствующих пользователей, не автоматически помещаются в пользовательские срезы.
Это становится препятствием для применения ранее заданных лимитов на использование CPU и памяти для конкретных пользователей.
2. Решение проблемы
Для перемещения процессов PHP-FPM в пользовательские системные срезы, необходимо модифицировать способ их управления. Это можно сделать с помощью следующих шагов:
Шаг 1. Создайте пользовательский срез
Если вы ещё не создали пользовательский срез, используйте ваш скрипт, чтобы настроить его следующим образом:
#!/bin/bash
user=$1
user_id=$(id -u "$user")
user_slice="user-${user_id}.slice"
# Установить лимиты ресурсов
systemctl set-property "$user_slice" CPUQuota="20%"
systemctl set-property "$user_slice" CPUQuotaPeriodSec="100ms"
systemctl set-property "$user_slice" MemoryHigh="1G"
systemctl set-property "$user_slice" MemorySwapMax="1G"
Этот скрипт создает срез для каждого пользователя с заданными ограничениями ресурсов.
Шаг 2. Настройка PHP-FPM для перенаправления в пользовательские срезы
Для того чтобы рабочие процессы PHP-FPM перемещались в соответствующий пользовательский срез, вам необходимо воспользоваться механизмом SetSlice
в файле конфигурации PHP-FPM для каждого пула. Добавьте следующую строку в файл конфигурации пула, например, в /etc/php-fpm.d/www.conf
:
[www]
...
; Указываем срез
Slice=user-${USER_ID}.slice
Здесь вы должны заменить ${USER_ID}
на ID пользователя, который будет использовать этот пул.
Шаг 3. Автоматизация миграции процессов
Для автоматизации поиска и перемещения процессов PHP-FPM можно использовать скрипт, который запускался бы, например, через cron
. Пример такого скрипта:
#!/bin/bash
# Получаем список рабочих процессов PHP-FPM
pids=$(pgrep -u www-data php-fpm)
for pid in $pids; do
user=$(ps -o user= -p $pid)
user_id=$(id -u "$user")
user_slice="user-${user_id}.slice"
# Перемещаем процесс в пользовательский срез
systemctl set-property "php-fpm$pid.service" Slice="$user_slice"
done
Шаг 4. Перезапустите PHP-FPM
После внесения изменений в конфигурацию, не забудьте перезапустить PHP-FPM для применения изменений:
systemctl restart php-fpm
Заключение
Переход на использование системных срезов для управления ресурсами PHP-FPM является важным шагом к более эффективному распределению ресурсов системы. Правильная настройка и автоматизация процесса перемещения рабочих процессов помогают обеспечить соответствие ресурсным ограничениям, установленным для пользователей. Не забывайте периодически проверять, что ограничения работают корректно, и при необходимости производить настройки.