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