Ограничения ресурсов не работают: система в смешанном режиме срезов
Управление ресурсами есть в двух версиях, и часть параметров работает только в новой. В смешанном режиме настройки применяются частично и молча: служба запускается, а предел не действует. Проверять режим стоит до разбора самих пределов.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Система работает в устаревшем или смешанном режиме
Часть параметров ресурсов в старом режиме не поддерживается. Они принимаются и игнорируются.
-
Предел задан, но не действует
Значение видно в свойствах службы, а фактического ограничения нет. Расхождение обнаруживается только под нагрузкой.
-
Служба контейнеров ждёт другого режима
Средства контейнеров настраиваются на конкретный режим. Несовпадение даёт отказы при запуске контейнеров.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Режим управления срезами: тип файловой системы показывает версию.
stat -fc %T /sys/fs/cgroupЗаданные пределы службы.
systemctl show myapp.service -p MemoryMax -p CPUQuotaКакие файлы ограничений реально существуют.
ls /sys/fs/cgroup/system.slice/myapp.service/ 2>/dev/null | headРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Часть параметров ресурсов в старом режиме не поддерживается. Они принимаются и игнорируются.
- Как проверить
-
Посмотрите режим срезов.
stat -fc %T /sys/fs/cgroup 2>/dev/null systemd-analyze --no-pager 2>/dev/null | head -3
- Как исправить
- Переведите систему в единый новый режим параметром ядра. Это требует перезагрузки и проверки, что все службы контейнеров к нему готовы.
- Почему происходит
- Значение видно в свойствах службы, а фактического ограничения нет. Расхождение обнаруживается только под нагрузкой.
- Как проверить
-
Сравните заданный предел и фактический файл ограничения.
systemctl show myapp.service -p MemoryMax cat /sys/fs/cgroup/system.slice/myapp.service/memory.max 2>/dev/null || echo файла нет
- Как исправить
- Проверяйте пределы по файлам среза, а не только по свойствам службы. Отсутствие файла означает, что параметр не действует.
- Почему происходит
- Средства контейнеров настраиваются на конкретный режим. Несовпадение даёт отказы при запуске контейнеров.
- Как проверить
-
Посмотрите настройку способа управления срезами.
sudo docker info 2>/dev/null | grep -iE "Cgroup Driver|Cgroup Version"
- Как исправить
- Приведите настройку службы контейнеров в соответствие с режимом системы. Смешение — частая причина неработающих ограничений у контейнеров.
Пример вывода
Предел памяти задан, файла ограничения нет. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ stat -fc %T /sys/fs/cgroup
tmpfs
$ systemctl show myapp.service -p MemoryMax
MemoryMax=536870912
$ cat /sys/fs/cgroup/system.slice/myapp.service/memory.max
cat: /sys/fs/cgroup/system.slice/myapp.service/memory.max: No such file or directory
Связанные ошибки
- Docker и kubelet: несовпадение драйвера cgroup Драйвер контрольных групп Docker не совпадает с systemd: предупреждения, нестабильная работа контейнеров, проблемы с kubelet.
- Ограничение процессора: доля и жёсткий предел работают по-разному Служба то тормозит, то нет: доля процессора и жёсткий предел решают разные задачи и путать их нельзя.
- status=219/CGROUP в systemd Код 219/CGROUP: не удалось создать или настроить контрольную группу службы. Причины на уровне системы и контейнеров.
- cgroup: fork rejected by pids controller Служба не может создать процесс: исчерпан предел числа задач в срезе. Разбор пределов на службе и срезе.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Disk quota exceeded для службы Место на разделе есть, а запись отклоняется: исчерпана дисковая квота пользователя или группы.
- Elasticsearch: max virtual memory areas vm.max_map_count is too low Elasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
- Failed with result 'resources' Состояние resources: systemd не смог выделить ресурсы для запуска службы. Чем отличается от кодов 200-й группы и что проверять.
Где встречается чаще всего
Источники
-
systemd.resource-control(5)
Версии управления ресурсами и поддержка параметров. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на systemd 255: в новом режиме файл ограничения памяти присутствует.