Ответ
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). Это фундаментальная технология, лежащая в основе изоляции контейнеров.
Ответ 18+ 🔞
Давай разжую эту тему, как будто мы на кухне после третьей рюмки. Представь, что твой сервер — это общага, а процессы — это соседи по этажу. И вот один такой сосед-гитарист начинает в три ночи орать блатные песни и жарить пельмени на всей мощности плиты. Остальным хоть сдохни. Так вот, cgroups — это суровый комендант, который может этому гитаристу сказать: «Слышь, дружок, тебе — только одна конфорка и только до полуночи, а то я тебе рубильник щёлкну». И всем сразу становится тихо и хорошо.
Зачем это тебе, как девопсу? Да чтобы один контейнер-обжора не сожрал всю память и процессор, а остальные не легли с перепугу. Без cgroups это как запустить в одной песочнице голодного качка и трёх хлюпиков — через минуту от хлюпиков мокрое место останется. А с cgroups у каждого своя порция каши и свои игрушки.
Что этот комендант может контролировать (основные рычаги):
cpu,cpuset: Может сказать процессу: «Сиди на этих двух ядрах и больше 30% времени не грузи, не царское это дело».memory: «Больше ста мегабайт не забирай, а то по шапке получишь от OOM Killer'а».blkio: «Твои запросы к диску будут самые последние в очереди, терпи».pids: «Больше десяти форков не создавай, распиздяй».net_cls,net_prio: Вешает бирку на сетевой трафик, типа «этот пакет — второсортный, пусть ползёт как черепаха».
Потрогаем руками, чтобы совсем всё понятно стало. Откроем терминал и почувствуем себя богами:
# Создаём для нашего наглого процесса отдельную камеру-изолятор в памяти
sudo mkdir /sys/fs/cgroup/memory/my_container_group
# Ставим железный лимит: 100 МБ и ни байтом больше. Попробуй вылезти!
sudo echo 100M > /sys/fs/cgroup/memory/my_container_group/memory.limit_in_bytes
# А теперь запускаем туда процесс, который хочет 150 МБ (типичный наглец)
sudo sh -c "echo $$ > /sys/fs/cgroup/memory/my_container_group/cgroup.procs && stress --vm 1 --vm-bytes 150M --vm-keep 1"
Что будет? Ёпта, процесс нагло запросит 150 мегов, комендант (cgroup) даст ему по морде лимитом, и тут же выскочит OOM Killer с криком «Ядрёна вошь!» и прибьёт наш процесс насмерть. Красота, правда? Волнение ебать, как будто мультик смотришь.
А при чём тут Docker и Kubernetes? Да при том, что это всё и есть их магия, только под капотом. Когда ты пишешь docker run --memory=100m nginx, Docker не колдует, а просто идёт к этому самому коменданту и говорит: «Слушай, создай-ка изолятор для этого парня, вот его паспорт (PID), и чтоб больше ста мегов не просил». И всё. Kubernetes делает ровно то же самое, только ещё и с умным видом. Так что, чувак, без этой технологии все твои контейнеры жили бы в анархии и грызлись за ресурсы как пацаны в подворотне. Доверия ебать ноль было бы ко всей этой вашей облачной хуйне. Короче, cgroups — это пизда рулю и фундамент, без которого всё накрылось бы медным тазом.