Ответ
cgroups (control groups) — это механизм ядра Linux для ограничения, учета, приоритизации и изоляции использования ресурсов (CPU, память, дисковый I/O, сеть) для коллекции процессов.
Почему это критически важно для DevOps и контейнеризации? Без cgroups один "прожорливый" контейнер мог бы исчерпать всю память или CPU на хосте, вызвав отказ всех остальных приложений ("noisy neighbor" problem). cgroups обеспечивают предсказуемое распределение ресурсов.
Основные подсистемы (controllers):
cpu,cpuset: Ограничение и привязка к CPU.memory: Ограничение использования памяти и подкачки (swap).blkio: Ограничение ввода-вывода на блочных устройствах.pids: Ограничение количества процессов.net_cls,net_prio: Маркировка и приоритизация сетевого трафика.
Практический пример через командную строку (временный cgroup):
# Создаем cgroup для ограничения памяти
sudo mkdir /sys/fs/cgroup/memory/my_container_group
# Устанавливаем лимит в 100 МБ
sudo echo 100M > /sys/fs/cgroup/memory/my_container_group/memory.limit_in_bytes
# Запускаем процесс (например, stress-тест) внутри этой cgroup
sudo sh -c "echo $$ > /sys/fs/cgroup/memory/my_container_group/cgroup.procs && stress --vm 1 --vm-bytes 150M --vm-keep 1"
# Процесс будет убит (OOM Killer), так как попытается использовать 150M при лимите в 100M.
Связь с Docker/Kubernetes: Когда вы запускаете контейнер docker run --memory=100m nginx, Docker Engine создает cgroup для этого контейнера и устанавливает соответствующие лимиты. Kubernetes делает то же самое через CRI (Container Runtime Interface). Это фундаментальная технология, лежащая в основе изоляции контейнеров.