Gestion des ressources avec les cgroups
Ce TD est à réaliser dans une machine virtuelle Ubuntu ou Fedora. Avec les machines vagrant :
$ vagrant up ubuntu
$ vagrant ssh ubuntu
Objectifs
- Gérer des processus avec les cgroups
Gestion manuelle des cgroups
Le PID controller
permet de limiter le nombre de PID disponibles dans un cgroup. Dans la plupart des cas, systemd aura déjà monté cette hiérarchie au démarrage du système :
$ mount | grep cgroup
Dans le cas général, il est nécessaire d’avoir des privilèges pour modifier la configuration des controlleurs cgroups. Il faudra donc exécuter les commandes qui suivent dans un shell root
directement (l’exemple ne fonctionnera pas en lançant les commandes avec sudo
) :
$ sudo -i
Créez un nouveau groupe dans la hiérarchie du PID controller
et y déplacer le shell
courant :
# mkdir -p /sys/fs/cgroup/foo/bar
# echo $$
# echo $$ > /sys/fs/cgroup/foo/bar/cgroup.procs
Question 1 : Expliquez le résultat de la commande suivante :
# cat /sys/fs/cgroup/foo/bar/cgroup.procs
24150
27463
Pour mettre en place un limite sur le nombre de PIDs par exemple, il faut activer le controller pids
pour le cgroup que l’on souhaite utiliser en l’ajoutant dans le fichier virtuel cgroup.subtree_control
des cgroups parents :
# cat /sys/fs/cgroup/cgroup.controllers
cpuset cpu io memory hugetlb pids
# cat /sys/fs/cgroup/cgroup.subtree_control
memory pids
# cat /sys/fs/cgroup/foo/cgroup.controllers
memory pids
# cat /sys/fs/cgroup/foo/cgroup.subtree_control
<vide>
# cat /sys/fs/cgroup/foo/bar/cgroup.controllers
<vide>
# echo '+pids' > /sys/fs/cgroup/foo/cgroup.subtree_control
# cat /sys/fs/cgroup/foo/cgroup.subtree_control
pids
# cat /sys/fs/cgroup/foo/bar/cgroup.controllers
pids
Il est alors possible de définir une limite en nombre de PIDs :
# echo 20 > /sys/fs/cgroup/foo/bar/pids.max
# for i in $(seq 1 20); do sleep 20 & done
Question 2 : Expliquez le résultat de la commande précédente. Pourquoi est-ce que la boucle s’arrête à 19 ?
Avant de supprimer un groupe, il faut que tous les processus qui lui sont associés se terminent. La suppression du dossier supprimera ensuite le groupe.
# exit
# rmdir /sys/fs/cgroup/foo/bar
# rmdir /sys/fs/cgroup/foo