Historique: CGroup
Aperçu de cette version: 27
CGROUP et libcgroup
CGROUP (ou cgroup) est un ensemble de fonctions des noyaux récents. Libcgroup est une bibliothèque de fonctions et un ensemble de programmes qui permettent de gérer facilement ces fonctions.CGROUP fournit un ensemble de hiérarchies dans le noyau et il est possible d'attacher des sous-systèmes à ces hiérarchies.
Il est possible de gérer ces hiérarchies et ces sous-système avec des commandes depuis une console, mais libcgroup permet de le faire plus facilement, de façon plus étendue, et de rendre cette gestion permanente en modifiant sa configuration.
Le but de tout ça ? 🙄, je comparerais avec udev. Udev permet de gérer les périphériques de façon automatique (en principe ça marche assez bien heureusement!).
Cgroup fait la même chose mais avec toutes les tâches du système.
Le principe de base est d'assigner des ressources aux tâches.
En le testant, je me suis rendu compte que bien que cgroup concerne l'ensemble des tâches et des ressources du système, il est, en tout cas pour ce qui nous intéresse ici, l'audio professionnelle, bien plus simple à configurer que udev. Ceci va faire plaisir à beaucoup de monde, j'en suis sur! 🎅
Configuration du noyau
Je met ma configuration actuelle. Je voulais être sur que cela allait fonctionner et j'ai certainement mis plus d'options que nécessaire. Je mettrai à jour quand j'aurai eu le temps de lui faire une cure d'amaigrissement.Un grep de ma configuration donne :
Copy to clipboard
grep CGROUP /usr/src/linux/.config CONFIG_CGROUPS=y # CONFIG_CGROUP_DEBUG is not set CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y # CONFIG_CGROUP_MEM_RES_CTLR is not set # CONFIG_CGROUP_PERF is not set CONFIG_CGROUP_SCHED=y CONFIG_BLK_CGROUP=m # CONFIG_DEBUG_BLK_CGROUP is not set
Ces options sont dans "General setup". J'ai commencé par sélectionner "Control Group support". Là dedans, j'ai sélectionné "Freezer cgroup subsystem", "Device controller for cgroups", "Cpuset support", "Include legacy /proc/<pid>/cpuset file", "Simple CPU accounting cgroup subsystem", "Resource conters, Group CPU scheduler ---> Group scheduling for SCHED OTHER + Group scheduling for SCHED_RR/FIFO", "<M> Block IO controller". Ensuite, j'ai aussi sélectionné Automatic proocess group scheduling.
Installation et configuration de libcgroup
Installation
gentoo :Sous gentoo, c'est aussi simple que
Copy to clipboard
emerge -a libcgroup
Autres distributions :
À compléter...
Configuration
Libcgroup vient avec deux Démons (programme qui tournent en tâche de fond) qui doivent être configurés et lancés lors du démarrage du système. Il n'existe pas de configuration par défaut, ceci car contrairement à UDEV qui prend en charge les périphériques, il est impossible de savoir quel usage veut faire l'utilisateur de son ordinateur, et par conséquent quelle optimisation lui convient.Ces deux démons sont cgconfig et cgred. Cgconfig monte le système de fichiers associé à cgroup. Cgred gère les ressources attribuées aux programmes gérés par crgoup.
Sous gentoo, ces deux daemons se trouvent dans /etc/init.d.
Quid d'autres distributions ?
Il faut éditer deux fichiers pour configurer cgroup. Le premier, /etc/cgroup/cgconfig.conf permet de définir les hiérarchies et les sous-systèmes associés à ces hiérarchies. Dans notre cas, nous définissons la hiérarchie cpu et le sous-système rtaudio en suivant les indications du ↓ wiki de JACK. J'ai dabord essayé la méthode 2, mais cgconfig plantait au démarrage. La méthode 3 fonctionne bien.
/etc/cgroup/cgconfig.conf
Copy to clipboard
namespace { cpu = /; } group rtaudio { perm { task { uid = root; gid = audio; } admin { uid = root; gid = root; } } cpu { cpu.rt_runtime_us = 950000; } }
Nous définissons ici un groupe cgroup rtaudio. Il utilise la hiérarchie cpu. Nous l'utilisons pour définir le temps processeur que les processus temps-réel des programmes membres de ce groupe peuvent utiliser.
L'utilisateur root peut l'administrer (lancer des commandes depuis la console pour le modifier).
Les utilisateurs membres du groupe audio en font partie et peuvent l'utiliser.
La ligne avec cpu.rt_runtime_us définit le nombre de micro secondes par seconde que le processeur peut consacrer aux tâches temps-réel du groupe rtaudio, ici 950'000. Il reste donc au minimum 50'000 micro secondes par seconde disponibles pour les autres tâches.
Ainsi, une tâche qui monopolise le processeur se verra obligée de laisser la main au noyau pendant ces 50'000 micro secondes. Elle ne devrait donc pas pouvoir planter le système.
De plus, cpu.rt_runtime_us ne concernent que les processus temps-réel d'un programme. Par exemple dans ardour, seul le traitement audio sera concerné. Les autres processus d'ardour comme l'interface graphique seront dans les 50'000, ils bénéficieront donc d'une priorité beaucoup moins grandes.
Le second fichier est /etc/cgroup/cgrules.conf
Il est utilisé pour définir les programmes qui font partie du cgroup rtaudio. Une modification de JACK est en cours de développement pour permettre à jackd-jackdbus de rajouter automatiquement à cgroup temps-réel les programmes qui utilisent JACK. Mais c'est un travail en cours, donc nous devons rajouter tous les programmes souhaités :
Copy to clipboard
@audio:jackd cpu rtaudio/ @audio:jackdbus cpu rtaudio/ @audio:ardour cpu rtaudio/ @audio:mplayer cpu rtaudio/
Une des deux premières lignes est indispensable, elles rajoutent respectivement jackdbus et jackd.
Les deux suivantes rajoutent respectivement ardour et mplayer.
Pour lancer les démons, tapez :
Copy to clipboard
/etc/init.d/cgred start * Starting cgconfig service ... [ ok ] * Starting CGroup Rules Engine Daemon ... [ ok ]
Nos deux démons ont bien été lancés. Pour les lancer automatiquement au démarrage :
Copy to clipboard
rc-update add cgred default
Test
Pour m'assurer que cgroup fonctionne bien et que les programmes que je lance fonctionnent comme souhaité, j'ai réalisé deux petits scripts que j'ai placé dans $PATH.Pour connaître votre PATH :
Copy to clipboard
echo $PATH ~/bin:~/bin:/usr/local/bin:/usr/bin:/bin:/opt/bin:/usr/x86_64-pc-linux-gnu/gcc-bin/4.5.3:/usr/qt/3/bin:/usr/games/bin
Je les ais placé dans ~/bin
Le premier script, findrtp :
findrtp
Copy to clipboard
#!/bin/sh for i in `cat /sys/fs/cgroup/cpu//rtaudio/cgroup.procs`; do echo "Trouvé le pid $i qui correspond à `cat /proc/$i/cmdline`"; done
Il faut le sauver (ici sous ~/bin/findrtp) et le rendre exécutable :
Copy to clipboard
chmod +x findrtp
Ce programme trouve les processus du cgroup rtaudio et nous donne leur pid et la ligne de commande correspondante :
Copy to clipboard
findrtp Trouvé le pid 3882 qui correspond à /usr/bin/jackdbusauto Trouvé le pid 11574 qui correspond à mplayerdvb://2@
Le deuxième script, findrtt :
findrtp
Copy to clipboard
#!/bin/sh for i in `cat /sys/fs/cgroup/cpu//rtaudio/tasks`; do echo "Trouvé le pid $i qui correspond à `cat /proc/$i/cmdline`"; done
Il faut aussi le sauver et le rendre exécutable.
Copy to clipboard
findrtt Trouvé le pid 3882 qui correspond à /usr/bin/jackdbusauto Trouvé le pid 3889 qui correspond à /usr/bin/jackdbusauto Trouvé le pid 3890 qui correspond à /usr/bin/jackdbusauto Trouvé le pid 3891 qui correspond à /usr/bin/jackdbusauto Trouvé le pid 11574 qui correspond à mplayerdvb://2@ Trouvé le pid 11577 qui correspond à mplayerdvb://2@ Trouvé le pid 11578 qui correspond à mplayerdvb://2@ Trouvé le pid 11579 qui correspond à mplayerdvb://2@
Nous voyons avec findrtp que nous avons deux programmes temps réel, jackdbusauto et mplayer. Avec findrtt, nous voyons que chacun de ces programmes utilise 4 tâches temps-réel.
Liens
Problème entre JACK et le noyau des versions récentes d'Ubuntu (10.10 et 11.X)redhat: Using Control Groups
Documentation du kernel linux sur les cgroups
Some notes on CGroups
JACK and RT cgroups