Skip to main content

Historique: CGroup

Aperçu de cette version: 34

Cette page de documentation explique comment obtenir le droit d'utiliser des applications en mode temps réel grâce aux cgroups sur un système GNU/Linux. Elle s'applique à quelques distributions actuelles, comme la version standard d'ubuntu et les distributions basées sur la compilation, comme dans cet exemple gentoo.




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èmes 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 sûr ! 🎅

Configuration du noyau

Je mets 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 d'abord 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 concerne 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 grande.

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 jackd et jackdbus.

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 ai 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 leurs 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

Historique

Information Version
Wed 15 Jan 2014 21:28 Dominique typos 70
Afficher
Wed 15 Jan 2014 21:22 Dominique systèmd, mise à jour 69
Afficher
Sun 12 Jan 2014 16:16 Dominique re typo 68
Afficher
Sun 12 Jan 2014 16:16 Dominique re typo 67
Afficher
Sun 12 Jan 2014 16:14 Dominique typos 66
Afficher
Sun 12 Jan 2014 14:11 olinuxx typo et kernel->noyau 65
Afficher
Sun 12 Jan 2014 12:28 Dominique précision importante 64
Afficher
Sun 12 Jan 2014 12:20 Dominique typo 63
Afficher
Sun 12 Jan 2014 12:19 Dominique systemd, suite et FIN ! 62
Afficher
Tue 03 Sep 2013 12:53 Dominique 61
Afficher
Tue 03 Sep 2013 04:52 olinuxx correction liens 60
Afficher
Tue 03 Sep 2013 01:16 Dominique 59
Afficher
Tue 03 Sep 2013 01:01 Dominique 58
Afficher
Mon 02 Sep 2013 20:13 Dominique 57
Afficher
Mon 02 Sep 2013 18:35 Dominique 56
Afficher
Mon 02 Sep 2013 18:29 Dominique 55
Afficher
Fri 01 Mar 2013 00:42 xzu mise en page 54
Afficher
Wed 27 Feb 2013 20:12 utilisateur_anonyme2 53
Afficher
Fri 11 Jan 2013 13:58 Dominique 52
Afficher
Fri 11 Jan 2013 13:52 Dominique 51
Afficher
Fri 11 Jan 2013 13:30 Dominique 50
Afficher
Tue 13 Nov 2012 19:38 Dominique note: das_watchdog 49
Afficher
Sun 28 Oct 2012 13:31 Dominique 48
Afficher
Sun 28 Oct 2012 13:27 Dominique 47
Afficher
Sun 28 Oct 2012 13:17 Dominique 46
Afficher
Sun 28 Oct 2012 12:31 Dominique 45
Afficher
Sun 28 Oct 2012 12:12 Dominique 44
Afficher
Sun 28 Oct 2012 10:40 Dominique 43
Afficher
Sun 28 Oct 2012 10:29 Dominique 42
Afficher
Sun 28 Oct 2012 10:28 Dominique 41
Afficher
Thu 25 Oct 2012 20:13 Dominique 40
Afficher
Thu 25 Oct 2012 19:36 Dominique 39
Afficher
Thu 25 Oct 2012 19:35 Dominique 38
Afficher
Thu 25 Oct 2012 19:35 Dominique 37
Afficher
Wed 24 Oct 2012 20:51 Dominique précisions 36
Afficher
Wed 24 Oct 2012 20:43 Dominique meilleure intro 35
Afficher
Thu 17 mai 2012 17:22 pianolivier modif lien(s) interne(s) 34
Afficher
Sat 12 mai 2012 17:49 pianolivier 33
Afficher
Sat 12 mai 2012 17:47 pianolivier ajout intro 32
Afficher
Sat 12 mai 2012 16:23 olinuxx coquilles 31
Afficher
Sat 12 mai 2012 16:21 olinuxx coquilles 30
Afficher
Sat 12 mai 2012 16:17 olinuxx coquilles 29
Afficher
Sat 12 mai 2012 16:16 olinuxx coquilles 28
Afficher
Sat 12 mai 2012 13:43 pianolivier ptite correction 27
Afficher
Sat 12 mai 2012 13:42 pianolivier cohérence site-wide 26
Afficher
Sat 12 mai 2012 13:42 pianolivier suppression d'un lien externe doublon 25
Afficher
Sat 12 mai 2012 13:40 pianolivier +lien udev 24
Afficher
Sat 12 mai 2012 13:39 pianolivier mise en page 23
Afficher
Sat 12 mai 2012 13:37 pianolivier mise en page 22
Afficher
Sat 12 mai 2012 13:34 pianolivier améliorations diverses 21
Afficher
  • «
  • 1 (en cours)
  • 2