Cgroups — это механизм ограничения ресурсов процессов и их потомков.
Задача: ограничить количество памяти, занимаемое процессами, запущенными определённым пользователем (testuser).
В терминологии Cgroups существует понятие subsystem — критерий ограничения. В нашем случае он называется memory.
Прежде всего, убедимся, что поддержка 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
Определим действия, выполняемые при старте системы:
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 реализовано наследование: все ограничения передаются потомкам.
Добавим в файл .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 МБ оперативной памяти.
Файл .bashrc можно изменять пользователем. Чтобы сделать настройку централизованной, можно поместить команды в /etc/bash/bashrc и добавить проверку:
CG_USER=`whoami`
if [ "${CG_USER}" = "testuser" ] ...