Cgroups
| Fiche express | |
|---|---|
| Domaine | Limitation et comptabilisation de ressources (noyau) |
| Point de montage | /sys/fs/cgroup/
|
| Versions | cgroups v1 (hiérarchies multiples) · cgroups v2 (hiérarchie unifiée) |
| Utilisé par | systemd (slices/scopes) · Docker · LXC · Kubernetes |
| Voir aussi | Namespaces (isolation complémentaire) · Systemctl · Systemd |
Les cgroups (control groups) sont un mécanisme du noyau Linux qui permet de regrouper des processus et de limiter, prioriser ou simplement comptabiliser les ressources qu'ils consomment collectivement : CPU, mémoire, bande passante disque (I/O), nombre de processus, périphériques accessibles... Ils sont complémentaires aux Namespaces : les namespaces définissent ce qu'un groupe de processus voit (isolation), les cgroups définissent ce qu'il a le droit de consommer (limitation). Ensemble, ces deux mécanismes noyau forment la base de tous les systèmes de conteneurs sous Linux.
Contrôleurs
Chaque type de ressource est géré par un contrôleur dédié, activable indépendamment :
- cpu / cpuacct — répartition du temps CPU (shares, quotas) et comptabilisation.
- memory — limite et comptabilisation de la mémoire (RAM + swap), avec déclenchement de l'OOM killer au sein du groupe en cas de dépassement.
- blkio (v1) / io (v2) — priorité et débit d'accès aux périphériques bloc.
- pids — nombre maximal de processus/threads, protection contre les fork bombs.
- devices — liste blanche/noire des périphériques accessibles (utilisé par les runtimes de conteneurs pour restreindre l'accès au matériel).
- freezer — geler/dégeler l'ensemble des processus d'un groupe.
cgroups v1 vs cgroups v2
v1 monte chaque contrôleur séparément sous /sys/fs/cgroup/<contrôleur>/, ce qui autorise des hiérarchies différentes (et potentiellement incohérentes) selon le contrôleur — un processus peut appartenir à un groupe pour la mémoire et à un autre pour le CPU.
v2 unifie tout sous une seule hiérarchie, montée en un point unique /sys/fs/cgroup/, où tous les contrôleurs actifs s'appliquent aux mêmes groupes. Plus simple et plus prévisible, c'est la version que les distributions récentes activent par défaut (à vérifier selon la distribution et sa version exacte — la bascule s'est faite progressivement, ex. RHEL8+, Debian 11+, Ubuntu 21.10+).
mount | grep cgroup # voir la ou les hiérarchies montées
cat /sys/fs/cgroup/cgroup.controllers # contrôleurs disponibles en v2
Un mode hybride (v1 et v2 montés simultanément, contrôleurs répartis entre les deux) existe également sur certains systèmes en transition.
Base de systemd : slices et scopes
systemd s'appuie entièrement sur les cgroups pour organiser et limiter les unités qu'il gère : chaque service, chaque session utilisateur, chaque machine virtuelle lancée via systemd-machined se voit attribuer son propre cgroup, regroupés en slices hiérarchiques (system.slice, user.slice, machine.slice). C'est ce qui permet à systemctl kill de tuer proprement tous les processus d'un service, ou à systemctl set-property de poser une limite CPU/mémoire sans configuration manuelle des cgroups. Les commandes d'inspection (systemd-cgls, systemd-cgtop) et de réglage sont détaillées sur Systemctl.
Base des conteneurs
Docker et LXC s'appuient sur les mêmes cgroups pour appliquer leurs propres options de limitation de ressources :
docker run --memory=512m --cpus=1 monimage # traduit en limites cgroup pour le conteneur
Sous LXC, les limites se déclarent dans la configuration du conteneur via les directives lxc.cgroup.* (v1) ou lxc.cgroup2.* (v2). Dans les deux cas, un conteneur n'est jamais rien de plus qu'un ensemble de processus placés dans leurs propres namespaces et cgroups — il n'existe pas de frontière noyau supplémentaire dédiée aux conteneurs.
Inspection directe
L'usage courant passe par systemd ou le runtime de conteneurs, mais l'interface noyau reste accessible directement via le pseudo-système de fichiers, utile pour du diagnostic bas niveau :
cat /sys/fs/cgroup/system.slice/sshd.service/memory.current # v2 : mémoire courante d'un service
echo "100000 100000" > /sys/fs/cgroup/mongroupe/cpu.max # v2 : quota CPU (100ms/100ms = 1 cœur)
Voir aussi
- Namespaces — isolation de ce qu'un groupe de processus voit, mécanisme complémentaire
- Systemctl — commandes
systemd-cgls/systemd-cgtop/set-property - Systemd — architecture générale des unités et des slices
- LXC — conteneurs système s'appuyant sur cgroups et namespaces