cgroups v2 и systemd отсутствует контроллер памяти на отдельных пользовательских срезах

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

У меня есть несколько систем Rocky 8, настроенных для использования cgroups v2 с параметром kernel boot systemd.unified_cgroup_hierarchy=1.

На этих системах я устанавливаю что-то вроде

systemctl set-property user.slice MemoryMax=498G
systemctl set-property user.slice MemoryHigh=494G
systemctl set-property user-0.slice MemoryMin=100M

что, как предполагается, должно предотвратить использование пользователями всей системной памяти и гарантировать, что у пользователя root всегда будет доступно как минимум 100M для его slice, чтобы я мог подключиться по SSH, даже если остальные пользователи используют все 498G.

В любом случае, на некоторых системах эти настройки, похоже, применяются без проблем, и после перезагрузки я вижу

/sys/fs/cgroup/user.slice/memory.max:534723428352
/sys/fs/cgroup/user.slice/memory.high:530428461056
/sys/fs/cgroup/user.slice/user-0.slice/memory.min:104857600

Однако на других системах user-0.slice не работает. На самом деле в /sys/fs/cgroup/user.slice/user-0.slice нет файлов memory.min или других файлов ограничения памяти для других пользователей на этих системах. Также на этих системах /sys/fs/cgroup/user.slice/cgroup.subtree_control пустой (в то время как на системах, где это работает, там указано “memory pids”).

Я не могу понять, что это контролирует. Если на системах это не работает, я делаю

echo "+memory +pids" > /sys/fs/cgroup/user.slice/cgroup.subtree_control

После этого я вижу необходимые файлы памяти в /sys/fs/cgroup/user.slice/user-0.slice, но свойство memory.min не установлено. Я пытаюсь выполнить

systemctl daemon-reload

чтобы посмотреть, установит ли systemd его. Вместо этого, по какой-то причине, systemd убирает моё изменение в user.slice/cgroup.subtree_control, и файл memory.min исчезает из user-0.slice.

Я не могу понять, что здесь происходит. Как мне заставить “+memory +pids” применяться при загрузке для user.slice/cgroup.subtree_control и чтобы это сохранялось после systemctl daemon-reload?

Почему на одних системах это работает, а на других — нет? Я не вижу разницы в конфигурации между работающими и неработающими системами.

Ответ или решение

Проблема с контролем памяти cgroups v2 и systemd в пользовательских срезах

На системах Rocky 8 вы, безусловно, столкнулись с интересной и достаточно сложной ситуацией с cgroups v2 и пользовательскими срезами. Родственные функции cgroups в сочетании с systemd обеспечивают управление ресурсами на системном уровне, однако настройка некоторых параметров может потребовать внимательного подхода.

Контекст и настройка

Вы правильно настроили параметры управления памятью для user.slice и user-0.slice, чтобы ограничить использование памяти пользователями, оставляя доступные ресурсы для root-пользователя. Судя по вашему описанию, на некоторых системах изменения действительно применяются, и параметры памяти отображаются корректно. Тем не менее, другие системы не реализуют эти ограничения, и это требует детального анализа ваших настроек и конфигураций.

Разбор проблемы

  1. Разные состояния cgroup: Системы, на которых не работают настройки, вероятно, не загружают необходимые контроллеры памяти и pids. Файл /sys/fs/cgroup/user.slice/cgroup.subtree_control не содержит правил, что указывает на то, что memory и pids не активированы. Ваша попытка активировать их с помощью команды, инжектированной напрямую в файловую систему cgroup, не спасает ситуацию, так как systemd управляет обязанностями по контролю за cgroups в момент инициализации и может перезаписывать ваши ручные изменения.

  2. Проблема с daemon-reload: После выполнения systemctl daemon-reload systemd предназначен для обновления конфигурационных файлов и применения изменений. Однако, если фактические файлы конфигурации для среза не настроены для работы с memory и pids, то systemd сбросит изменения в дереве cgroup в их прежнее состояние. Это может быть вас необоснованно настораживать, так как behavior может показаться непоследовательным.

  3. Разные конфигурации систем: Несмотря на отсутствие внешних различий, стоит проверить версии ядра, версии systemd, и убедиться, что все необходимые модули загружены и активны на всех системах. Возможно, у вас есть разница в конфигурационных файлах systemd или в дополнительных настройках, которые могли быть задействованы.

Решение проблемы

Для того чтобы заставить user.slice всегда включать memory и pids, вам нужно внести изменения в конфигурацию systemd:

  1. Создание конфигурационного файла: Создайте файл override.conf для user.slice, который включит контроллеры памяти на уровне systemd:

    [Slice]
    MemoryMax=498G
    MemoryHigh=494G
  2. Используйте slice и соответствующий cgroup:

    mkdir -p /etc/systemd/system/user.slice.d/
    echo -e "[Slice]\nMemoryMax=498G\nMemoryHigh=494G\n" > /etc/systemd/system/user.slice.d/override.conf
    systemctl daemon-reload
  3. Убедитесь, что настраиваемые файлы активны: Связывайте изменения с пользовательскими срезами и убедитесь, что все контроллеры загружены.

  4. Совместимость на различных системах: Если изменения не работают на одной из систем, попробуйте перезагрузить систему, чтобы применить изменения на новом уровне инциализации.

Запустив системный контроль systemctl status user.slice, вы сможете проверить, применяются ли новые настройки.

Заключение

Данная ситуация демонстрирует, как сложное взаимодействие различных компонентов системы может порождать путаницу. Тщательный подход к промежуточным конфигурациям и понимание порядка, в котором systemd работает с cgroups, позволит вам добиться устойчивого результата. Если вы продолжаете сталкиваться с проблемами, дальнейшая диагностика версий и конфигураций станет решающим шагом к уверенной эксплуатации.

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

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