Что такое cgroups в Linux и зачем они нужны в контексте DevOps?

«Что такое cgroups в Linux и зачем они нужны в контексте DevOps?» — вопрос из категории Linux, который задают на 35% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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). Это фундаментальная технология, лежащая в основе изоляции контейнеров.