Niveau :      
Résumé : mount -t cgroup cgroup /sys/fs/cgroup

Parfois, il faut savoir se mettre à jour. On crois que le noyau n'évolue que sur les performances et le support de nouveaux périphériques, mais il faut bien plus que ça. Son interface utilisateur évolue, progresse, change.

Aujourd'hui parlons d'une nouveauté récente, mais qu'il faudra bientôt tous connaître car c'est un nouveau système qui sont au cœur du noyau et qui peut être utilisé par beaucoup d'autres. Il s'agit des control group.

Les control group ont profité de l'expérience de l'histoire d'unix. Cette fois pas d'erreur, tout est fichier. D'où viennent tous ces fichiers ? C'est tout simple, c'est un nouveau type de système de fichier. Une convention veut qu'on le monte dans /sys/fs/cgroup mais ce n'est pas complètement établi, et le répertoire en question peut ne pas exister, dans ce cas utilisez /cgroup :

$ mount -t cgroup cgroup /sys/fs/cgroup

Mais à quoi ca sert ?

Ça sert à faire des groupes de processus. Et c'est tout. Enfin presque, on y attache d'autres fonctionnalités, mais j'en parlerai par la suite.

Comment ca marche ?

Les groupes sont gérés à travers le fichier tasks.

Par défaut les processus sont tous présents dans le groupe par défaut. Pour en avoir la preuve, c'est tout simple, il suffit de lancer la commande suivante (notez que par la suite je suppose que vous êtes toujours dans le répertoire de montage de cgroup) :

$ cat tasks

Maintenant vous voulez faire un groupe qui s'appelle disons trucs :

$ mkdir trucs
# et on met un processus dedans 
$ echo 1234 >> truc/tasks

Si on veut mettre tous les processus d'un utilisateur donné dans un groupe nommé moi :

$ mkdir moi
$ ps -o pid -U $(whoami) | while read pid; do echo $pid >> moi/tasks; done

C'est beau les pures interfaces unix non ? Ça veut aussi dire que vous pouvez aussi faire des sous groupes et des sous sous groupes, il suffit d'un mkdir bien placé.

Et puisque tout est fichier, les droits se gèrent à travers les droits sur les fichiers :

# une seule personne aura le droit d'ajouter des processus dans ce groupe
$ chown peck: groupe/tasks

En pratique les futurs processus fils vont appartenir au même groupe que leur père. Voilà les groupes se font tout seul maintenant. Pour changer un processus de groupe, il suffit de le mettre dans un autre groupe. Un processus appartient toujours à un groupe et un seul.

Mais a quoi ca sert vraiment ?

C'est la que vous apprenez que les commandes précédentes ne marchent pas toujours car il y à certains prérequis pour certains sous systèmes. En effet, on ne fait pas juste des groupes pour faire des groupes. On fait des groupes pour gérer les processus par groupe. Le système de control group a donc la notion de sous système, qu'on peut considérer comme des sous modules de cgroup.

Il y a un certain nombre de sous systèmes, et la liste promet d'évoluer puisque c'est une infrastructure propre et on peut en ajouter autant qu'on veut. Pour avoir la liste, il suffit de lancer la commande suivante :

$ ls *.* | perl -pe 's/\..*//g' | uniq
# ou avec les commandes du paquet cgroup
$ lssubsys

Mais ils se peut que vous ne vouliez pas de tous les sous systèmes car certains vous imposent de configurer un control group avant de pouvoir y mettre un processus, c'est un peu lourd pour tester. Dans ce cas une option de mount qui permet de limiter leur usage :

$ mount -t cgroup cgroup /sys/fs/cgroup -o cpuset 
# mais rien ne vous empêche de monter un autre cgroup parallèle 
# qui se base sur un sous système différent pour un autre usage
$ mount -t cgroup cgroup /cgroup2 -o device 

Mais sinon il font quoi d'utile ces sous système ? Vous le saurez au prochain numéro ...

Fin

a Enfin pas tout à fait, je vous ai montré comment faire avec la b** et le couteau, mais en pratique il y a un paquet (cgroup-bin sous debian) qui propose des binaires faisant tout ça sur une ligne de commande avec quelques options sympathiques. Pratique pour ceux qui ne veulent pas jouer avec cat et grep mais plutôt des macro commandes toutes faites.

Vous pouvez apprendre à les utiliser si vous préférez, cela vous permettre de créer automatiquement des groupes au boot, de les séparer par type de sous système, d'y assigner automatiquement certain processus selon certain critères ...

Et je ne vous ai pas parlé du système d'évènement permettant de savoir lorsqu'un groupe est complètement vide, mais c'est du détail.

Et pour la documentation, c'est dans le noyau.