Вопрос или проблема
У меня есть несколько систем 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-пользователя. Судя по вашему описанию, на некоторых системах изменения действительно применяются, и параметры памяти отображаются корректно. Тем не менее, другие системы не реализуют эти ограничения, и это требует детального анализа ваших настроек и конфигураций.
Разбор проблемы
-
Разные состояния cgroup: Системы, на которых не работают настройки, вероятно, не загружают необходимые контроллеры памяти и pids. Файл
/sys/fs/cgroup/user.slice/cgroup.subtree_control
не содержит правил, что указывает на то, чтоmemory
иpids
не активированы. Ваша попытка активировать их с помощью команды, инжектированной напрямую в файловую систему cgroup, не спасает ситуацию, так как systemd управляет обязанностями по контролю за cgroups в момент инициализации и может перезаписывать ваши ручные изменения. -
Проблема с daemon-reload: После выполнения
systemctl daemon-reload
systemd предназначен для обновления конфигурационных файлов и применения изменений. Однако, если фактические файлы конфигурации для среза не настроены для работы сmemory
иpids
, то systemd сбросит изменения в дереве cgroup в их прежнее состояние. Это может быть вас необоснованно настораживать, так как behavior может показаться непоследовательным. -
Разные конфигурации систем: Несмотря на отсутствие внешних различий, стоит проверить версии ядра, версии systemd, и убедиться, что все необходимые модули загружены и активны на всех системах. Возможно, у вас есть разница в конфигурационных файлах systemd или в дополнительных настройках, которые могли быть задействованы.
Решение проблемы
Для того чтобы заставить user.slice
всегда включать memory
и pids
, вам нужно внести изменения в конфигурацию systemd
:
-
Создание конфигурационного файла: Создайте файл
override.conf
дляuser.slice
, который включит контроллеры памяти на уровне systemd:[Slice] MemoryMax=498G MemoryHigh=494G
-
Используйте
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
-
Убедитесь, что настраиваемые файлы активны: Связывайте изменения с пользовательскими срезами и убедитесь, что все контроллеры загружены.
-
Совместимость на различных системах: Если изменения не работают на одной из систем, попробуйте перезагрузить систему, чтобы применить изменения на новом уровне инциализации.
Запустив системный контроль systemctl status user.slice
, вы сможете проверить, применяются ли новые настройки.
Заключение
Данная ситуация демонстрирует, как сложное взаимодействие различных компонентов системы может порождать путаницу. Тщательный подход к промежуточным конфигурациям и понимание порядка, в котором systemd работает с cgroups, позволит вам добиться устойчивого результата. Если вы продолжаете сталкиваться с проблемами, дальнейшая диагностика версий и конфигураций станет решающим шагом к уверенной эксплуатации.