systemd-cgls et systemd-cgtop¶
systemd-cgls et systemd-cgtop sont deux outils complémentaires pour inspecter et surveiller les cgroups (control groups) gérés par systemd. Ils permettent de visualiser l'arborescence des cgroups et de suivre la consommation de ressources en temps réel.
systemd-cgls¶
systemd-cgls affiche l'arborescence complète des cgroups sous forme d'arbre, avec les processus contenus dans chaque cgroup.
Syntaxe¶
Utilisation de base¶
# Afficher l'arborescence complète
systemd-cgls
# Afficher un cgroup spécifique et ses enfants
systemd-cgls system.slice
systemd-cgls user.slice
systemd-cgls machine.slice
# Afficher le cgroup d'un service précis
systemd-cgls system.slice/nginx.service
# Afficher sans couleurs (pour scripts)
systemd-cgls --no-pager
# Utiliser un chemin absolu de cgroup (hiérarchie v2)
systemd-cgls /sys/fs/cgroup/system.slice
Lire la sortie¶
Control group /:
-.slice
├─user.slice
│ └─user-1000.slice
│ ├─user@1000.service
│ │ └─session.scope
│ │ ├─1234 /usr/bin/bash
│ │ └─5678 systemd-cgls
│ └─session-3.scope
│ └─2345 sshd: sebastien [priv]
└─system.slice
├─nginx.service
│ ├─891 nginx: master process
│ └─892 nginx: worker process
└─systemd-journald.service
└─456 /usr/lib/systemd/systemd-journald
Chaque ligne montre le cgroup, ses sous-cgroups et les PIDs des processus qu'il contient directement.
Options principales¶
| Option | Description |
|---|---|
-l, --full | Affiche les lignes de commande complètes (non tronquées) |
-k, --kernel | Inclut les threads noyau |
--unit=UNIT | Filtre sur une unité systemd |
--user-unit=UNIT | Filtre sur une unité utilisateur |
--no-pager | Désactive le pager |
-M NAME, --machine=NAME | Inspecte les cgroups d'une machine/conteneur |
systemd-cgtop¶
systemd-cgtop affiche les cgroups triés par consommation de ressources, de manière similaire à top mais par cgroup. Il est utile pour identifier quel service, slice ou unité consomme le plus de CPU, mémoire ou I/O.
Syntaxe¶
Utilisation de base¶
# Monitoring interactif (rafraîchissement toutes les secondes par défaut)
systemd-cgtop
# Restreindre à un sous-cgroup
systemd-cgtop system.slice
systemd-cgtop user.slice
# Trier par mémoire
systemd-cgtop --order=memory
# Trier par I/O
systemd-cgtop --order=io
# Rafraîchissement toutes les 2 secondes
systemd-cgtop --delay=2
# Mode batch (non interactif, pour scripts)
systemd-cgtop --batch --iterations=1
# Afficher n itérations puis quitter
systemd-cgtop --iterations=5
Colonnes affichées¶
| Colonne | Description |
|---|---|
Path | Chemin du cgroup dans la hiérarchie |
Tasks | Nombre de processus/threads |
%CPU | Utilisation CPU (cumulée sur tous les cœurs) |
Memory | Mémoire résidente (RSS) |
Input/s | Débit lecture I/O |
Output/s | Débit écriture I/O |
Note
Les données I/O ne sont disponibles que si le contrôleur io est activé dans la hiérarchie cgroup v2. Sur cgroup v1, seuls CPU et mémoire sont disponibles.
Raccourcis clavier (mode interactif)¶
| Touche | Action |
|---|---|
p | Trier par CPU |
m | Trier par mémoire |
i | Trier par I/O |
t | Trier par nombre de tâches |
% | Basculer entre valeurs absolues et pourcentages |
q | Quitter |
+ / - | Augmenter/diminuer l'intervalle de rafraîchissement |
Options principales¶
| Option | Description |
|---|---|
-o ORDER, --order=ORDER | Tri : path, tasks, cpu, memory, io |
-d DELAY, --delay=DELAY | Intervalle de rafraîchissement en secondes |
-n N, --iterations=N | Nombre d'itérations avant de quitter |
-b, --batch | Mode non interactif (compatible scripts) |
-r, --raw | Valeurs brutes sans unités humaines |
-M NAME, --machine=NAME | Inspecte les cgroups d'une machine/conteneur |
--depth=N | Profondeur maximale de l'arborescence affichée |
--cpu=TYPE | time (défaut) ou percentage |
Cas pratiques¶
Identifier quel service consomme le plus de mémoire¶
Affiche un instantané trié par mémoire, sans interaction, exploitable dans un script ou une alerte.
Surveiller la consommation d'un slice applicatif¶
Restreint la vue aux seuls services de system.slice, trié par CPU.
Inspecter les processus d'un service récalcitrant¶
# Voir quels PIDs sont dans le cgroup du service
systemd-cgls system.slice/mon-service.service
# Puis vérifier l'arbre des processus
ps --ppid $(systemctl show -p MainPID --value mon-service.service) --forest
Surveiller les conteneurs nspawn¶
# Voir l'arborescence cgroup des machines
systemd-cgls machine.slice
# Suivre les ressources d'un conteneur précis
systemd-cgtop machine.slice/machine-debian12.scope
Vérifier la hiérarchie cgroup v2¶
# Confirmer l'utilisation de cgroup v2
cat /proc/mounts | grep cgroup
ls /sys/fs/cgroup/
# Voir les contrôleurs disponibles et actifs
cat /sys/fs/cgroup/cgroup.controllers
cat /sys/fs/cgroup/cgroup.subtree_control
Relation avec systemctl¶
systemctl status NOM.service affiche déjà le cgroup et les processus associés. systemd-cgls et systemd-cgtop sont utiles quand :
- On veut une vue globale de toute la hiérarchie, pas d'un seul service
- On cherche à identifier quel service consomme des ressources sans connaître son nom à l'avance
- On travaille sur les slices et scopes directement (sessions utilisateur, machines)
Bonnes pratiques¶
- Utiliser
systemd-cgtop --batch --iterations=1dans les scripts de monitoring pour des snapshots ponctuels. - Préférer
systemd-cglsàls /sys/fs/cgroup/pour la lisibilité : la hiérarchie est affichée avec les noms systemd plutôt que les chemins bruts. - Vérifier avec
systemd-cgls machine.sliceque les conteneurs nspawn sont bien isolés dans leur propre sous-arborescence. - Coupler avec
systemctl show -p CPUAccounting -p MemoryAccounting NOM.servicepour s'assurer que la comptabilité est activée sur les unités qu'on veut surveiller.
Voir aussi¶
man systemd-cglsman systemd-cgtopman systemd.resource-control(directives CPUWeight, MemoryMax, etc.)man cgroups(7)