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 des cgroups 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 lister les controlleurs activés sur l’ensemble du système :

# cat /sys/fs/cgroup/cgroup.controllers
cpuset cpu io memory hugetlb pids rdma misc

Les controlleurs actifs pour un cgroups sont configurés à l’echelle du parent dans le fichier subtree_control. Un sous ensemble des controleurs est activé par défaut par systemd :

# cat /sys/fs/cgroup/cgroup.subtree_control
cpu io memory pids
# cat /sys/fs/cgroup/foo/cgroup.controllers
cpu io memory pids

Par défaut, aucun controleur n’est activé pour les fils des nouveaux cgroups.

# cat /sys/fs/cgroup/foo/cgroup.subtree_control
<vide>
# cat /sys/fs/cgroup/foo/bar/cgroup.controllers
<vide>

Pour mettre en place une limite sur le nombre de PIDs par exemple, il faut activer le controleur 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/foo/cgroup.controllers
cpu io memory pids
# 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