Cgroups в Linux
Control Groups (cgroups) — механизм ядра Linux для ограничения, учёта и изоляции использования ресурсов группами процессов: CPU, memory, I/O, PID, cpuset и др.
Структура
Cgroups образуют иерархию: каждый узел — группа процессов с заданными лимитами. Контроллеры (controllers) применяют ограничения к ресурсам.
Контроллеры:
cpu— доля CPUmemory— лимиты RAM и swapio(v2) /blkio(v1) — пропускная способность блочных устройствpids— максимум процессов в группеcpuset— привязка к CPU/NUMA-узламnet_cls,net_prio— только в v1
Cgroup v1
sudo mkdir /sys/fs/cgroup/memory/test
echo 100M | sudo tee /sys/fs/cgroup/memory/test/memory.limit_in_bytes
echo $$ | sudo tee /sys/fs/cgroup/memory/test/cgroup.procs
В v1 у каждого контроллера своя иерархия, монтируется отдельно (/sys/fs/cgroup/memory, /sys/fs/cgroup/cpu и т.д.).
Cgroup v2
В v2 единая иерархия для всех контроллеров. systemd поддерживает unified hierarchy; включение по умолчанию зависит от дистрибутива и версии.
Точка монтирования: /sys/fs/cgroup (тип cgroup2).
mount -t cgroup2 none /sys/fs/cgroup
Ключевые файлы:
cgroup.procs— PID процессов в группеcgroup.subtree_control— включение контроллеров для потомковmemory.max,memory.high,memory.swap.max— лимиты памяти (v2)cpu.max,cpu.weight— лимиты CPU (v2)io.max,io.weight— лимиты I/O (v2)
Интеграция с systemd
Каждый юнит (.service, .scope, .slice) выполняется в собственной cgroup. Лимиты задаются в unit-файле:
[Service]
MemoryMax=512M
CPUQuota=50%
TasksMax=100
См. systemd.resource-control(5).