Cgroups — ограничение ресурсов процессов

Cgroups — это механизм ограничения ресурсов процессов и их потомков.

Задача: ограничить количество памяти, занимаемое процессами, запущенными определённым пользователем (testuser).

1. Subsystem

В терминологии Cgroups существует понятие subsystem — критерий ограничения. В нашем случае он называется memory.

2. Проверка поддержки в ядре

Прежде всего, убедимся, что поддержка Cgroups включена в ядре:

astra linux # cat .config | grep -i cgroup
CONFIG_CGROUPS=y
# CONFIG_CGROUP_DEBUG is not set
CONFIG_CGROUP_NS=y
CONFIG_CGROUP_FREEZER=y
CONFIG_CGROUP_DEVICE=y
CONFIG_CGROUP_CPUACCT=y
CONFIG_CGROUP_MEM_RES_CTLR=y
# CONFIG_CGROUP_MEM_RES_CTLR_SWAP is not set
CONFIG_CGROUP_SCHED=y
CONFIG_BLK_CGROUP=y
# CONFIG_DEBUG_BLK_CGROUP is not set

Также можно проверить активированные подсистемы:

astra linux # cat /proc/cgroups 
#subsys_name    hierarchy    num_cgroups    enabled
cpuset    0    1    1
ns    0    1    1
cpu    0    1    1
cpuacct    0    1    1
memory    0    1    1
devices    0    1    1
freezer    0    1    1
blkio    0    1    1

3. Настройка при запуске системы

Определим действия, выполняемые при старте системы:

astra linux # cat /etc/cgroup.sh 
mkdir -p /dev/memory
mount -t cgroup -o memory cgroup /dev/memory
mkdir -m 0777 /dev/memory/denytest

Точка монтирования — /dev/memory, имя группы — denytest.

В Cgroups реализовано наследование: все ограничения передаются потомкам.

4. Настройка пользователя

Добавим в файл .bashrc пользователя testuser:

if [ "$PS1" ] ; then
    mkdir -m 0700 /dev/memory/denytest/$$
    echo $$ > /dev/memory/denytest/$$/tasks
    echo 134216704 > /dev/memory/denytest/$$/memory.limit_in_bytes
fi

Число 134216704 соответствует 128 МБ — максимально разрешённому количеству памяти в байтах. $$ — PID текущего процесса.

Теперь можно увидеть изменения в /proc/cgroups:

astra linux # cat /proc/cgroups 
#subsys_name    hierarchy    num_cgroups    enabled
cpuset    0    1    1
ns    0    1    1
cpu    0    1    1
cpuacct    0    1    1
memory    1    10    1
devices    0    1    1
freezer    0    1    1
blkio    0    1    1

Таким образом, для пользователя testuser установлено ограничение в 128 МБ оперативной памяти.

5. Примечание

Файл .bashrc можно изменять пользователем. Чтобы сделать настройку централизованной, можно поместить команды в /etc/bash/bashrc и добавить проверку:

CG_USER=`whoami`
if [ "${CG_USER}" = "testuser" ] ...
💡 Таким образом можно задать автоматическое ограничение памяти для конкретного пользователя без изменения его личных файлов.