Как переместить процессы рабочего PHP-FPM в специфичные для пользователя SystemD срезы

Вопрос или проблема

Я пытаюсь настроить лимиты ресурсов для пользователей с использованием срезов 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 эти ограничения не применяются, потому что:

  1. Основной процесс PHP-FPM работает от имени root. Хотя пул PHP-FPM работает
  2. от имени правильного пользователя, они не унаследуют автоматически
  3. срез пользователя. Юнит сервиса 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 является важным шагом к более эффективному распределению ресурсов системы. Правильная настройка и автоматизация процесса перемещения рабочих процессов помогают обеспечить соответствие ресурсным ограничениям, установленным для пользователей. Не забывайте периодически проверять, что ограничения работают корректно, и при необходимости производить настройки.

Оцените материал
Добавить комментарий

Капча загружается...