Guide de gestion des ressources
Gestion des ressources système sur Red Hat Enterprise Linux 6
Édition 1
Résumé
Chapitre 1. Introduction aux groupes de contrôle
cgconfig
(« control group config ») peut être configuré pour être lancé lors du démarrage et rétablir vos groupes de contrôle prédéfinis, les rendant ainsi persistants lors de multiples démarrages.
1.1. Organisation des groupes de contrôle
Modèle du processus Linux
init
, qui est exécutépar le noyau lors du démarrage et démarre d'autres processus (qui pourraient démarrer des processus enfants à leur tour). Comme tous les processus proviennent d'un seul parent, le modèle du processus Linux est consiste d'une hiérarchie ou arborescence unique.
init
, héritent de l'environnement (comme la variable PATH)[1] et de certains autres attributs (comme les descripteurs d'ouverture de fichiers) de leur processus parent.
Modèle des groupes de contrôle
- ils sont organisés hiérarchiquement
- les groupes de contrôle enfants héritent de certains attributs de leur groupe de contrôle parent.
Sous-systèmes disponibles dans Red Hat Enterprise Linux
blkio
— ce sous-système établit des limites sur l'accès des entrées/sorties à partir et depuis des périphériques blocs tels que des lecteurs physiques (disques dur, disques SSD, lecteurs USB, etc.).cpu
— ce sous-système utilise le planificateur pour fournir aux tâches des groupes de contrôle accès au CPU.cpuacct
— ce sous-système génère des rapports automatiques sur les ressources CPU utilisées par les tâches dans un groupe de contrôle.cpuset
— ce sous-système assigne des CPU individuels (sur un système multicoeur) et des noeuds de mémoire à des tâches dans un groupe de contrôle.devices
— ce sous-système autorise ou refuse l'accès des tâches aux périphériques dans un groupe de contrôle.freezer
— ce sous-système suspend ou réactive les tâches dans un groupe de contrôle.memory
— ce sous-système établit les limites d'utilisation de la mémoire par les tâches d'un groupe de contrôle et génère des rapports automatiques sur les ressources mémoire utilisées par ces tâches.net_cls
— ce sous-système repère les paquets réseau avec un identifiant de classe (classid) qui permet au contrôleur de trafic Linux (tc
) d'identifier les paquets provenant d'une tâche particulière d'un groupe de contrôle.ns
— le sous-système namespace.
Note
1.2. Relations entre sous-systèmes, hiérarchies, groupes de contrôle et tâches
Tout sous-système unique (comme cpu
) peut être attaché à une seule hiérarchie au plus.
cpu
ne pourra jamais être attaché à deux différentes hiérarchies.
Une hiérarchie unique peut avoir deux sous-systèmes ou plus qui lui sont attachés.
cpu
et memory
(ou tout autre nombre de sous-systèmes) peuvent être attachés à une seule hiérarchie pourvu qu'aucun sous-système ne soit attaché à une autre hiérarchie.
Chaque fois qu'une nouvelle hiérarchie est créée sur les systèmes, toutes les tâches sur le système sont d'abord des membres du groupe de contrôle par défaut de cette hiérarchie, qui est aussi connu sous le nom de groupe de contrôle racine (de l'anglais, « root cgroup »). Pour toute hiérarchie unique que vous créez, chaque tâche sur le système peut être un membre d'exactement un groupe de contrôle dans cette hiérarchie. Une tâche unique peut se trouver dans de multiples groupes de contrôle, pourvu que chacun de ces groupes de contrôle se trouve dans une différente hiérarchie. Dès qu'une tâche devient membre d'un second groupe de contrôle dans la même hiérarchie, elle est supprimée du premier groupe de contrôle de cette hiérarchie. Une tâche ne peut jamais se trouver dans deux différents groupes de contrôle de le même hiérarchie.
cpu
et memory
sont attachés à une hiérarchie nommée cpu_and_mem
et si le sous-système net_cls
est attaché à une hiérarchie nommée net
, alors un processus httpd
en cours d'exécution pourrait être un membre de n'importe quel groupe de contrôle se trouvant dans cpu_and_mem
et de n'importe quel groupe de contrôle se trouvant dans net
.
cpu_and_mem
dont le processus http
est un membre peut restreindre son temps processeur de moitié comparé à ce qui est alloué aux autres processus et limiter son utilisation de mémoire à un maximum de 1024
Mo. En outre, le groupe de contrôle dans net
qui est un membre peut limiter son taux de transmission à 30
méga-octets par seconde.
Tout processus (ou tâche) sur un système qui se copie lui-même donne naissance à un processus (tâche) enfant. La tâche enfant devient automatiquement membre de tous les groupes de contrôle dont le parent fait partie. La tâche enfant peut ensuite être déplacée sur différents groupes de contrôle selon les besoins, mais celle-ci hérite toujours des groupes de contrôle (de l'"environnement", pour reprendre la terminologie des processus) de sa tâche parente.
httpd
qui est membre du groupe de contrôle nommé half_cpu_1gb_max
dans la hiérarchie cpu_and_mem
et du groupe de contrôle trans_rate_30
dans la hiérarchie net
. Lorsque ce processus httpd
se copie lui-même, son processus enfant devient automatiquement membre des groupes de contrôle half_cpu_1gb_max
et trans_rate_30
. Celui-ci hérite des mêmes groupes de contrôle dont faisait partie sa tâche parente.
1.3. Implications pour la gestion des ressources
- Comme une tâche ne peut appartenir qu'à un seul groupe de contrôle dans une seule hiérarchie, il n'y a qu'une seule manière par laquelle une tâche peut être limitée ou affectée par un seul sous-système. Ceci est logique : il s'agit d'une fonctionnalité, et pas d'une limitation.
- Vous pouvez regrouper plusieurs sous-systèmes ensemble de manière à ce qu'ils affectent toutes les tâches dans une hiérarchie unique. Comme les groupes de contrôle dans cette hiérarchie possèdent de divers paramètres, ces tâches seront affectées de différemment.
- Il peut parfois être nécessaire de refactoriser une hiérarchie. Par exemple, en supprimant un sous-système d'une hiérarchie qui possède plusieurs sous-systèmes attachés, et en l'attachant à une nouvelle et différente hiérarchie.
- À l'inverse, si le besoin de diviser des sous-systèmes entre différentes hiérarchies est réduit, vous pouvez supprimer une hiérarchie et attacher ses sous-systèmes à une autre hiérarchie existante.
- Le design permet une utilisation facile d'un groupe de contrôle, comme la définition de quelques paramètres pour des tâches spécifiques dans une hiérarchie unique, comme lorsque seuls les sous-systèmes du processeur et de la mémoire sont attachés.
- Le design permet aussi de réaliser des configurations hautement spécifiques : chaque tâche (ou processus) sur un système peut être membre de chaque hiérarchie, qui elles-mêmes ne possèdent qu'un seul sous-système attaché. Une telle configuration pourrait ainsi offrir à un administrateur système un contrôle absolu sur tous les paramètres de chaque tâche.
Chapitre 2. Utiliser les groupes de contrôle
Note
~]# yum install libcgroup
2.1. Le service cgconfig
cgconfig
, installé avec le paquetage libcgroup, fourni un moyen commode de créer des hiérarchies, d'attacher des sous-systèmes aux hiérarchies et de gérer les groupes de contrôle dans celles-ci. Nous recommandons d'utiliser cgconfig pour gérer les hiérarchies et les groupes de contrôle sur votre système.
cgconfig
n'est pas démarré par défaut sur Red Hat Enterprise Linux 6. Lorsque vous lancez le service avec chkconfig
, il lit le fichier de configuration du groupe de contrôle — /etc/cgconfig.conf
. Les groupes de contrôle sont ainsi recréés d'une session à l'autre et deviennent persistants. Selon le contenu du fichier de configuration, cgconfig peut créer des hiérarchies, monter les systèmes de fichiers nécessaires, créer des groupes de contrôle, et définir les paramètres de sous-système pour chaque groupe.
/etc/cgconfig.conf
, qui est installé avec le paquetage libcgroup crée et monte une hiérarchie individuelle pour chaque sous-système et attache les sous-systèmes à ces hiérarchies.
cgconfig
(avec la commande service cgconfig stop
), celui-ci démontera toutes les hiérarchies qu'il avait monté.
2.1.1. Le fichier cgconfig.conf
/etc/cgconfig.conf
contient deux principaux types d'entrées — mount et group. Les entrées « mount » créent et montent les hiérarchies en tant que systèmes de fichiers virtuels et attachent les sous-systèmes à ces hiérarchies. Les entrées « mount » sont définies à l'aide de la syntaxe suivante :
mount { <controller> = <path>; … }
Exemple 2.1. Création d'une entrée « mount »
cpuset
:
mount { cpuset = /cgroup/cpu; }
~]#mkdir /cgroup/cpu
~]#mount -t cgroup -o cpu cpu /cgroup/cpu
group <name> {
[<permissions>]
<controller> {
<param name> = <param value>;
…
}
…
}
permissions
est optionnelle. Pour définir les permissions pour une entrée « group », veuillez utiliser la syntaxe suivante :
perm { task { uid = <task user>; gid = <task group>; } admin { uid = <admin name>; gid = <admin group>; } }
Exemple 2.2. Création d'une entrée « group »
sqladmin
afin d'ajouter des tâches au groupe de contrôle et pour l'utilisateur root
afin de modifier les paramètres de sous-système :
group daemons/sql { perm { task { uid = root; gid = sqladmin; } admin { uid = root; gid = root; } } cpu { cpu.shares = 100; } }
~]#mkdir -p /cgroup/cpu/daemons/sql
~]#chown root:root /cgroup/cpu/daemons/sql/*
~]#chown root:sqladmin /cgroup/cpu/daemons/sql/tasks
~]#echo 100 > /cgroup/cpu/daemons/sql/cpu.shares
Note
cgconfig
pour que les changements dans /etc/cgconfig.conf
prennent effet :
~]# service cgconfig restart
/etc/cgconfig.conf
. Les symboles dièse ('#
'), se trouvant au début de chaque ligne en font des commentaires et les rendent invisibles au service cgconfig
.
2.2. Créer une hiérarchie et attacher des sous-systèmes
Avertissement
cgconfig
), à moins que vous ne démontiez d'abord les hiérarchies existantes, ce qui affectera l'opération du système. Ne pas expérimenter avec ces instructions sur des systèmes de production.
mount
du fichier /etc/cgconfig.conf
en tant que super-utilisateur. Les entrées de la section mount
sont sous le format suivant :
subsystem = /cgroup/hierarchy;
cgconfig
démarrera la prochaine fois, il créera la hiérarchie et y attachera les sous-systèmes.
cpu_and_mem
et y attache les sous-systèmes cpu
, cpuset
, cpuacct
et memory
.
mount { cpuset = /cgroup/cpu_and_mem; cpu = /cgroup/cpu_and_mem; cpuacct = /cgroup/cpu_and_mem; memory = /cgroup/cpu_and_mem; }
Méthode alternative
~]# mkdir /cgroup/name
~]# mkdir /cgroup/cpu_and_mem
mount
pour monter la hiérarchie et y attacher un ou plusieurs sous-système(s) simultanément. Par exemple :
~]# mount -t cgroup -o subsystems name /cgroup/name
Exemple 2.3. Utilisation de la commande mount pour attacher des sous-systèmes
/cgroup/cpu_and_mem
, qui servira de point de montage pour la hiérarchie que nous créons, existe déjà. Nous attacherons les sous-systèmes cpu
, cpuset
et memory
à une hiérarchie que nous nommons cpu_and_mem
, puis nous montons (mount
) la hiérarchie cpu_and_mem
sur /cgroup/cpu_and_mem
:
~]# mount -t cgroup -o cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem
lssubsys
[3] :
~]# lssubsys -am
cpu,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
cpuacct
devices
freezer
blkio
- les sous-systèmes
cpu
,cpuset
etmemory
sont attachés à une hiérarchie montée sur/cgroup/cpu_and_mem
. - les sous-systèmes
net_cls
,ns
,cpuacct
,devices
,freezer
etblkio
ne sont toujours pas attaché à une hiérarchie, comme l'absence de points de montage le montre.
2.3. Attacher et détacher des sous-systèmes d'une hiérarchie existante
mount
du fichier /etc/cgconfig.conf
en tant que super-utilisateur en utilisant la même syntaxe que celle décrite dans la Section 2.2, « Créer une hiérarchie et attacher des sous-systèmes ». La prochaine fois que cgconfig
démarrera, il réorganisera les sous-systèmes en fonction des hiérarchies spécifiées.
Méthode alternative
mount
ainsi que l'option remount
.
Exemple 2.4. Monter une hiérarchie à nouveau pour ajouter un sous-système
lssubsys
affiche les sous-systèmes cpu
, cpuset
et memory
, qui sont attachés à la hiérarchie cpu_and_mem
:
~]# lssubsys -am
cpu,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
cpuacct
devices
freezer
blkio
cpu_and_mem
à nouveau, en utilisant l'option remount
et en incluant cpuacct
dans la liste des sous-systèmes :
~]# mount -t cgroup -o remount,cpu,cpuset,cpuacct,memory cpu_and_mem /cgroup/cpu_and_mem
lssubsys
affiche maintenant que cpuacct
est attaché à la hiérarchie cpu_and_mem
:
~]# lssubsys -am
cpu,cpuacct,cpuset,memory /cgroup/cpu_and_mem
net_cls
ns
devices
freezer
blkio
cpuacct
, montez-le à nouveau puis omettez-le :
~]# mount -t cgroup -o remount,cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem
2.4. Démonter une hiérarchie
umount
:
~]# umount /cgroup/name
~]# umount /cgroup/cpu_and_mem
cgclear
, qui désactive une hiérarchie même si celle-ci n'est pas vide — reportez-vous à la Section 2.11, « Décharger les groupes de contrôle ».
2.5. Création de groupes de contrôle
cgcreate
pour créer des groupes de contrôle. La syntaxe pour cgcreate
est : cgcreate -t
uid:gid -a
uid:gid -g subsystems:path
, où :
-t
(optionnel) — spécifie un utilisateur (par un ID utilisateur, ou uid) et un groupe (par ID de groupe, ou GID) pour posséder le pseudofichiertâches
(tasks
) pour ce groupe de contrôle. Cet utilisateur peut ajouter des tâches à ce groupe de contrôle.Note
Remarquez que l'unique manière de supprimer une tâche d'un groupe de contrôle est de la déplacer sur un autre groupe de contrôle. Pour déplacer une tâche, l'utilisateur doit posséder la permission d'écriture sur le groupe de contrôle destinataire ; la permission d'écriture sur le groupe de contrôle source n'est pas importante.-a
(optionnel) — spécifie un utilisateur (par un ID utilisateur, ou uid) et un groupe (par ID de groupe, ou GID) pour posséder tous les pseudofichiers autres quetâches
(tasks
) pour ce groupe de contrôle. Cet utilisateur peut modifier les accès des tâches de ce groupe de contrôle aux ressources système.-g
— spécifie la hiérarchie dans laquelle le groupe de contrôle devrait être créé, en tant que liste séparée par des virgules des sous-systèmes associés à ces hiérarchies. Si les sous-systèmes de cette liste se trouvent dans différentes hiérarchies, le groupe est créé dans chacune d'entre elles. La liste des hiérarchies est suivie par deux-points et le chemin d'accès vers le groupe enfant relatif à la hiérarchie. Ne pas inclure le point de montage de la hiérarchie dans le chemin d'accès.Par exemple, le groupe de contrôle se trouvant dans le répertoire/cgroup/cpu_and_mem/lab1/
est simplement appelélab1
— son chemin d'accès est déjà déterminé de manière unique car il y a, au plus, une seule hiérarchie pour un sous-système donné. Remarquez aussi que le groupe est contrôlé par tous les sous-systèmes qui existent dans les hiérarchies dans lesquelles le groupe de contrôle a été créé, même si ces sous-systèmes n'ont pas été spécifiés dans la commandecgcreate
— reportez-vous à la Exemple 2.5, « Utilisation de cgcreate ».
Exemple 2.5. Utilisation de cgcreate
cpu
et memory
sont montés ensemble dans la hiérarchie cpu_and_mem
et où le contrôleur net_cls
est monté dans une hiérarchie séparée nommée net
. Nous exécutons mainenant :
~]# cgcreate -g cpu,net_cls:/test-subgroup
cgcreate
crée deux groupes nommés test-subgroup
, un dans la hiérarchie cpu_and_mem
et un dans la hiérarchie net
. Le groupe test-subgroup
dans la hiérarchie cpu_and_mem
est contrôlé par le sous-système memory
, même si nous ne l'avons pas spécifié dans la commande cgcreate
.
Méthode alternative
mkdir
:
~]# mkdir /cgroup/hierarchy/name/child_name
~]# mkdir /cgroup/cpuset/lab1/group1
2.6. Supprimer des groupes de contrôle
cgdelete
, qui possède une syntaxe similaire à celle de cgcreate
. Veuillez exécuter : cgdelete subsystems:path
, où :
- subsystems est une liste des sous-systèmes séparée par des virgules.
- path est le chemin d'accès vers le groupe de contrôle relatif à la racine (root) de la hiérarchie.
~]# cgdelete cpu,net_cls:/test-subgroup
cgdelete
peut aussi supprimer récursivement tous les sous-groupes avec l'option -r
.
2.7. Définir les paramètres
cgset
depuis un compte utilisateur avec la permission de modifier le groupe de contrôle approprié. Par exemple, si /cgroup/cpuset/group1
existe, spécifiez les CPUs auxquels ce groupe aura accès avec la commande suivante :
cpuset]# cgset -r cpuset.cpus=0-1 group1
cgset
est : cgset -r
parameter=value path_to_cgroup
, où :
- parameter est le paramètre à définir qui correspond au fichier dans le répertoire du groupe de contrôle donné
- value est la valeur du paramètre
- path_to_cgroup est le chemin d'accès au groupe de contrôle relatif à la racine de la hiérarchie. Par exemple, pour définir le paramètre du groupe racine (si
/cgroup/cpuacct/
existe), exécutez :cpuacct]#
cgset -r cpuacct.usage=0 /
Alternativement, comme.
est relatif au groupe racine (le groupe racine lui-même), vous pourriez aussi exécuter :cpuacct]#
cgset -r cpuacct.usage=0 .
Remarquez cependant que/
est la syntaxe préférée.Note
Seul un petit nombre de paramètres peuvent être définis pour le groupe racine (comme le paramètrecpuacct.usage
montré dans les exemples ci-dessus). Ceci est dû au fait qu'un groupe racine est propriétaire de toutes les ressources existantes. Ainsi, il ne servirait à rien de limiter tous les processus existants en définissant certains paramètres, le paramètrecpuset.cpu
par exemple.Pour définir le paramètre degroup1
, qui est un sous-groupe du groupe racine, exécutez :cpuacct]#
cgset -r cpuacct.usage=0 group1
Une barre oblique finale après le nom du groupe est optionnelle (par exemple,cpuacct.usage=0 group1/
).
cgset
peuvent dépendre des valeurs définies plus haut dans la hiérarchie. Par exemple, si group1
est limité à l'unique utilisation de CPU 0 sur un système, vous ne pourrez pas définir group1/subgroup1
pour qu'il utilise CPUs 0 et 1, ou pour qu'il utilise uniquement CPU 1.
cgset
pour copier les paramètres d'un groupe de contrôle à un autre groupe de contrôle existant. Par exemple :
~]# cgset --copy-from group1/ group2/
cgset
est : cgset --copy-from
path_to_source_cgroup path_to_target_cgroup
, où :
- path_to_source_cgroup est le chemin d'accès au groupe de contrôle dont les paramètres sont à copier de manière relative au groupe racine de la hiérarchie
- path_to_target_cgroup est le chemin d'accès au groupe de contrôle destinataire relatif au groupe racine de la hiérarchie
Méthode alternative
echo
. Par exemple, cette commande insère la valeur 0-1
dans le pseudofichier cpuset.cpus
du groupe de contrôle group1
:
~]# echo 0-1 > /cgroup/cpuset/group1/cpuset.cpus
2.8. Déplacer un processus sur un groupe de contrôle
cgclassify
:
~]# cgclassify -g cpu,memory:group1 1701
cgclassify
est : cgclassify -g
subsystems:path_to_cgroup pidlist
, où :
- subsystems est une liste des sous-systèmes séparée par des virgules, ou
*
pour lancer le processus dans les hiérarchies associées à tous les sous-systèmes disponibles. Remarquez que si des groupes de contrôle du même nom existent dans de multiples hiérarchies, l'option-g
déplace les processus dans chacun de ces groupes. Assurez-vous que le groupe de contrôle existe dans chacune des hiérarchies dont vous spécifiez les sous-systèmes ici. - path_to_cgroup est le chemin vers le groupe de contrôle dans ses hiérarchies
- pidlist est une liste d'identifiants de processus (ou PID) séparée par des espace
-- sticky
avant le pid afin de conserver tout processus enfant dans le même groupe de contrôle. Si vous ne spécifiez pas cette option et que le démon cgred est en cours d'exécution, les processus enfants seront alloués aux groupes de contrôle selon les paramètres se trouvant dans /etc/cgrules.conf
. Le processus, quant à lui, restera dans le groupe de contrôle à partir duquel vous l'avez démarré.
cgclassify
, vous pouvez déplacer plusieurs processus simultanément. Par exemple, cette commande déplace les processus avec les PIDs 1701
et 1138
dans le groupe de contrôle group1/
:
~]# cgclassify -g cpu,memory:group1 1701 1138
Méthode alternative
tâches
(tasks
) du groupe de contrôle. Par exemple, pour déplacer un processus avec le PID 1701
dans un groupe de contrôle sur /cgroup/lab1/group1/
:
~]# echo 1701 > /cgroup/lab1/group1/tasks
2.8.1. Le démon cgred
/etc/cgrules.conf
. Les entrées du fichier /etc/cgrules.conf
peuvent prendre l'une des formes suivantes :
- user hierarchies control_group
- user:command hierarchies control_group
maria devices /usergroup/staff
maria
peuvent accéder au sous-système des périphériques selon les paramètres spécifiés dans le groupe de contrôle /usergroup/staff
. Pour associer des commandes particulières à des groupes de contrôle particuliers, ajoutez le paramètre command comme suit :
maria:ftp devices /usergroup/staff/ftp
maria
utilise la commande ftp
, le processus est automatiquement déplacé sur le groupe de contrôle /usergroup/staff/ftp
dans la hiérarchie qui contient le sous-système devices
. Remarquez cependant que le démon déplace le processus sur le groupe de contrôle uniquement après que la condition appropriée aura été remplie. Ainsi, le processus ftp
peut être exécuté pendant un court moment dans le mauvais groupe. En outre, si le processus génère des enfants alors qu'il se trouve dans le mauvais groupe, ces enfants pourraient ne pas être déplacés.
/etc/cgrules.conf
peuvent inclure les notations supplémentaire suivantes :
@
— lorsque préfixé à user, ceci indique un groupe au lieu d'un utilisateur unique. Par exemple,@admins
signale tous les utilisateurs faisant partie du groupeadmins
.*
— représente "tout". Par exemple,*
dans le champsous-système
représente tous les sous-systèmes.%
— représente un élément qui est le même que l'élément présent dans la ligne du dessus. Par exemple :@adminstaff devices /admingroup @labstaff % %
2.9. Lancer un processus dans un groupe de contrôle
Important
cpuset
, les paramètres cpuset.cpus
et cpuset.mems
doivent être définis pour ce groupe de contrôle.
cgexec
. Par exemple, cette commande lance le navigateur web lynx dans le groupe de contrôle group1
, sujet à toutes les limitations imposées par le sous-système cpu
:
~]# cgexec -g cpu:group1 lynx http://www.redhat.com
cgexec
est : cgexec -g
subsystems:path_to_cgroup command arguments
, où :
- subsystems est une liste des sous-systèmes séparée par des virgules, ou
*
sert à lancer le processus dans les hiérarchies associées à tous les sous-systèmes disponibles. Remarquez que comme pourcgset
, qui est décrit dans la Section 2.7, « Définir les paramètres », si des groupes de contrôle de même nom existent dans de multiples hiérarchies, l'option-g
crée des processus dans chacun de ces groupes. Assurez-vous que le groupe de contrôle existe bien dans cahcune des hiérarchies dont vous spécifiez les sous-systèmes. - path_to_cgroup est le chemin d'accès vers le groupe de contrôle relatif à la hiérarchie.
- command est la commande à exécuter
- arguments représente tout argument de la commande
-- sticky
avant command afin de conserver tout processus enfant dans le même groupe de contrôle. Si vous ne saisissez pas cette option et que le démon cgred est en cours d'exécution, les processus enfants seront alloués aux groupes de contrôle en fonction des paramètres trouvés sur /etc/cgrules.conf
. Le processus, toutefois, restera dans le groupe de contrôle à partir duquel il a été démarré.
Méthode alternative
~]#echo $$ > /cgroup/lab1/group1/tasks
lynx
group1
. Ainsi, la méthode suivante est encore meilleure :
~]# sh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx"
2.9.1. Lancer un service dans un groupe de contrôle
- utiliser un fichier
/etc/sysconfig/servicename
- utiliser la fonction
daemon()
depuis/etc/init.d/functions
pour démarrer le service
/etc/sysconfig
de manière à inclure une entrée sous la forme CGROUP_DAEMON="subsystem:control_group"
, où subsystem est un sous-système associé à une hiérarchie particulière, et où control_group est un groupe de contrôle dans cette hiérarchie. Par exemple :
CGROUP_DAEMON="cpuset:daemons/sql"
2.10. Obtenir des informations sur les groupes de contrôle
2.10.1. Trouver un processus
~]$ ps -O cgroup
~]$ cat /proc/PID/cgroup
2.10.2. Trouver un sous-système
~]$ cat /proc/cgroups
~]$ lssubsys -m subsystems
lssubsys -m
retourne uniquement le point de montage le plus haut de chaque hiérarchie.
2.10.3. Trouver des hiérarchies
/cgroup
. En supposant que ce soit le cas sur votre système, répertoriez ou naviguez sur le contenu de ce répertoire pour obtenir une liste des hiérarchies. Si tree est installé sur votre système, exécutez-le pour obtenir une vue d'ensemble de toutes les hiérarchies et de tous les groupes de contrôle se trouvant dedans :
~]$ tree /cgroup/
2.10.4. Trouver des groupes de contrôle
~]$ lscgroup
controller:path
. Par exemple :
~]$ lscgroup cpuset:adminusers
adminusers
dans la hiérarchie à laquelle le sous-système cpuset
est attaché.
2.10.5. Afficher les paramètres des groupes de contrôle
~]$ cgget -r parameter list_of_cgroups
~]$ cgget -r cpuset.cpus -r memory.limit_in_bytes lab1 lab2
cpuset.cpus
et memory.limit_in_bytes
des groupes de contrôle lab1
et lab2
.
~]$ cgget -g cpuset /
2.11. Décharger les groupes de contrôle
Avertissement
cgclear
supprime tous les groupes de contrôle dans toutes les hiérarchies. Si vous n'avez pas stocké ces hiérarchies dans un fichier de configuration, vous ne serez pas en mesure de les reconstruires.
cgclear
.
Note
mount
pour créer des groupes de contrôle (contrairement à leur création à l'aide du service cgconfig
) résulte en la création d'une entrée dans le fichier /etc/mtab
(le tebleau des systèmes de fichiers montés). Ce changement est aussi reflété dans le fichier /proc/mounts
. Cependant, le déchargement des groupes de contrôle avec la commande cgclear
, ainsi qu'avec d'autres commandes cgconfig, utilise une interface de noyau directe qui ne reflète pas ses changements dans le fichier /etc/mtab
et qui écrit les nouvelles informations uniquement dans le fichier /proc/mounts
. Ainsi, après avoir déchargé les groupes de contrôle avec la commande cgclear
, les groupes de contrôle non montés pourraient toujours être visibles sur le fichier /etc/mtab
, et par conséquent, ils seront affichés lorsque la commande mount
est exécutée. Il est préférable de se reporter au fichier /proc/mounts
pout obtenir une liste précise des tous les groupes de contrôle montés.
2.12. Ressources supplémentaires
Les pages man libcgroup
man 1 cgclassify
— la commandecgclassify
est utilisée pour déplacer des tâches en cours d'exécution sur un ou plusieurs groupe(s) de contrôle.man 1 cgclear
— la commandecgclear
est utilisée pour supprimer tous les groupes de contrôle dans une hiérarchie.man 5 cgconfig.conf
— les groupes de contrôle sont définis dans le fichiercgconfig.conf
.man 8 cgconfigparser
— la commandecgconfigparser
analyse le fichiercgconfig.conf
et monte les hiérarchies.man 1 cgcreate
— la commandecgcreate
crée de nouveaux groupes de contrôle dans les hiérarchies.man 1 cgdelete
— la commandecgdelete
supprime les groupes de contrôles spécifiés.man 1 cgexec
— la commandecgexec
exécute des tâches dans les groupes de contrôle spécifiés.man 1 cgget
— la commandecgget
affiche les paramètres des groupes de contrôle.man 5 cgred.conf
—cgred.conf
est le fichier de configuration du servicecgred
.man 5 cgrules.conf
— le fichiercgrules.conf
contient les règles utilisées pour déterminer les tâches qui appartiennent à certains groupes de contrôle.man 8 cgrulesengd
— le servicecgrulesengd
distribue les tâches aux groupes de contrôle.man 1 cgset
— la commandecgset
définit les paramètres d'un groupe de contrôle.man 1 lscgroup
— la commandelscgroup
répertorie les groupes de contrôle dans une hiérarchie.man 1 lssubsys
— la commandelssubsys
répertorie les hiérarchies contenant des sous-systèmes spécifiés.
lssubsys
est l'un des utilitaires fournis par le paquetage libcgroup. Veuillez installer libcgroup pour l'utiliser : reportez-vous au Chapitre 2, Utiliser les groupes de contrôle si vous ne parvenez pas à exécuter lssubsys
.
Chapitre 3. Sous-systèmes et paramètres réglables
cgroups.txt
dans la documentation du noyau qui est installée sur /usr/share/doc/kernel-doc-kernel-version/Documentation/cgroups/
(fourni par le paquetage kernel-doc). La version la plus récente de la documentation des groupes de contrôle est disponible en ligne à l'adresse suivante : http://www.kernel.org/doc/Documentation/cgroups/cgroups.txt. Remarquez cependant que les fonctionnalités décrites dans les documents les plus récents pourraient ne pas correspondre à celles qui sont disponibles dans le noyau installé sur votre système.
cpuset.cpus
est un pseudofichier qui spécifie à quels CPUs un groupe de contrôle à l'autorisation d'accès. Si /cgroup/cpuset/webserver
est un groupe de contrôle pour le serveur web exécuté sur un système et que nous exécutons la commande suivante :
~]# echo 0,2 > /cgroup/cpuset/webserver/cpuset.cpus
0,2
est écrite sur le pseudofichier cpuset.cpus
et limite ainsi toutes les tâches dont les PID sont répertoriés sur /cgroup/cpuset/webserver/tasks
afin d'uniquement utiliser CPU 0 et CPU 2 sur le système.
3.1. blkio
blkio
) surveille et contrôle l'accès des tâches de groupes de contrôle aux E/S sur des périphériques blocs. L'écriture de valeurs sur certains de ces pseudo-fichiers limite l'accès ou la bande passante, la lecture des valeurs de certains de ces pseudos-fichiers fournit des informations sur les opérations d'E/S.
- blkio.weight
- spécifie la proportion relative (poids) de l'accès de Block I/O disponible par défaut à un groupe de contrôle dans une gamme de
100
à1000
. Cette valeur est remplacée par le paramètreblkio.weight_device
pour des périphériques spécifiques. Par exemple, pour assigner un poids par défaut de500
à un groupe de contrôle pour accéder aux périphériques blocs, exécutez :echo 500 > blkio.weight
- blkio.weight_device
- spécifie la proportion relative (poids) de l'accès des E/S à un groupe de contrôle sur des périphériques spécifiques dans la gamme de
100
à1000
. La valeur de ce paramètre remplace la valeur du paramètreblkio.weight
pour des périphériques spécifiés. Les valeurs prennent le format majeur:mineur poids, où majeur et mineur sont des types de périphériques et des numéros de noeuds spécifiés dans les Périphériques alloués Linux, aussi connus sous le nom de Liste des périphériques Linux et disponible sur http://www.kernel.org/doc/Documentation/devices.txt. Par exemple, pour assigner un poids de500
à un groupe de contrôle pour accéder à/dev/sda
, exécutez :echo 8:0 500 > blkio.weight_device
Dans la notation des Périphériques alloués Linux,8:0
représente/dev/sda
. - blkio.time
- rapporte le moment auquel un groupe de contrôle possédait un accès d'E/S à des périphériques spécifiques. Les entrées possèdent trois champs : majeur, mineur et durée. Majeur et mineur sont des types de périphériques et des numéros de noeuds spécifiés dans les Périphériques alloués Linux et durée est la durée en millisecondes (ms).
- blkio.sectors
- rapporte le nombre de secteurs transférés depuis ou vers des périphériques spécifiques d'un groupe de contrôle. Les entrées possèdent trois champs : majeur, mineur et secteurs. Majeur et mineur sont des types de périphériques et des numéros de noeuds spécifiés dans les Périphériques alloués Linux et secteurs est le nombre de secteurs du disque.
- blkio.io_service_bytes
- rapporte le nombre d'octets transférés depuis ou vers des périphériques spécifiques par un groupe de contrôle. Les entrées possèdent quatre champs : majeur, mineur, opération et octets. Majeur et mineur sont les types de périphériques et des numéros de noeuds spécifiés dans les Périphériques alloués Linux, opération représente le type d'opération (
lecture
,écriture
,sync
ouasync
) et octets est le nombre d'octets transférés. - blkio.io_serviced
- rapporte le nombre d'opérations d'E/S effectuées sur des périphériques spécifiques par un groupe de contrôle. Les entrées possèdent quatre champs : majeur, mineur, opération et octets. Majeur et mineur sont les types de périphériques et numéros de noeuds spécifiés dans les Périphériques alloués Linux, opération représente le type d'opération (
lecture
,écriture
,sync
ouasync
) et nombre représente le nombre d'opérations. - blkio.io_service_time
- rapporte la totalité du temps pris entre l'envoi de la demande et l'achèvement de celle-ci pour des opérations d'E/S sur des périphériques spécifiques par un groupe de contrôle. Les entrées possèdent quatre champs : majeur, mineur, opération et octets. Majeur et mineur sont les types de périphériques et numéros de noeuds spécifiés dans les Périphériques alloués Linux, opération représente le type d'opération (
lecture
,écriture
,sync
, ouasync
) et durée représente la durée en nanosecondes (ns). La durée rapportée utilise des nanosecondes plutôt qu'une unité plus importante afin que ce rapport puisse être utile même lors de l'utilisation de périphériques SSD. - blkio.io_wait_time
- rapporte le temps total attendu pour un service dans les files d'attente des opérations d'E/S sur des périphériques spécifiques d'un groupe de contrôle. Lorsque vous interprétez ce rapport, remarquez que :
- le temps rapporté peut être plus important que la totalité du temps écoulé car le temps rapporté est le total cumulé des toutes les opérations d'E/S pour le groupe de contrôle plutôt que le temps que le groupe de contrôle a lui-même attendu pour les opérations d'E/S. Pour découvrir combien de temps le groupe en tant que tel a dû attendre, utilisez
blkio.group_wait_time
. - si
queue_depth
> 1 (sur le périphérique), alors la durée rapportée inclut uniquement le temps attendu jusqu'à ce que la requête soit envoyée au périphérique, et pas le temps attendu pour le service pendant que le périphériques effectuait de nouvelles commandes de requêtes.
Les entrées possèdent quatre champs : majeur, mineur, opération et octets. Majeur et mineur sont les types de périphériques et numéros de noeuds spécifiés dans les Périphériques alloués Linux, opération (lecture
,écriture
,sync
ouasync
) et durée est la durée en nanosecondes (ns). La durée rapportée utilise des nanosecondes plutôt qu'une unité plus importante afin que ce rapport puisse être utile même pour des périphériques SSD. - blkio.io_merged
- rapporte le nombre de requêtes BIOS fusionnées en requêtes pour des opérations d'E/S d'un groupe de contrôle. Les entrées possèdent deux champs : nombre et opération. Nombre est le nombre de requêtes et opération représente le type d'opération (
lecture
,écriture
,sync
, ouasync
). - blkio.io_queued
- rapporte le nombre de requêtes en file d'attente pour des opérations d'E/S d'un groupe de contrôle. Les entrées possèdent deux champs : nombre et opération. Nombre est le nombre de requêtes et opération représente le type d'opération (
lecture
,écriture
,sync
ouasync
). - blkio.avg_queue_size
- rapporte la taille moyenne des files d'attente pour des opérations d'E/S d'un groupe de contrôle sur la durée totale de l'existance du groupe. La taille de la file d'attente est échantillonnée chaque fois qu'une file d'attente de ce groupe de contrôle obtient une tranche de temps. Remarquez que ce rapport est uniquement disponible si
CONFIG_DEBUG_BLK_CGROUP=y
est installé sur le système. - blkio.group_wait_time
- rapporte la durée totale (en nanosecondes — ns) qu'un groupe de contrôle a attendu une tranche de temps pour l'une de ses files d'attente. Le rapport est mis à jour à chaque fois qu'une file d'attente de ce groupe de contrôle obtient une tranche de temps. Ainsi, si vous lisez ce pseudo-fichier alors que le groupe de contrôle attend sa tranche de temps, le rapport ne contiendra pas le temps attendu pour l'opération se trouvant actuellement en file d'attente. Remarquez que ce rapport est uniquement disponible si
CONFIG_DEBUG_BLK_CGROUP=y
est installé sur le système. - blkio.empty_time
- rapporte la durée totale (en nanosecondes — ns) qu'un groupe de contrôle a attendu sans requête en attente. Le rapport est mis à jour à chaque fois qu'une file d'attente de ce groupe de contrôle possède une requête en attente. Ainsi, si vous lisez ce pseudo-fichier alors que le groupe de contrôle ne possède pas de requêtes en attente, le rapport ne contiendra pas le temps attendu dans l'état actuel. Remarquez que ce rapport est uniquement disponible si
CONFIG_DEBUG_BLK_CGROUP=y
est installé sur le système. - blkio.idle_time
- rapporte le temps total (en nanosecondes — ns) que le planificateur a passé à attendre un groupe de contrôle dans l'attente d'une meilleure requête que les requêtes se trouvant déjà dans des files d'attente ou provenant d'autres groupes. Le rapport est mis à jour à chaque fois qu'un groupe redevient actif. Ainsi, si vous lisez ce pseudo-fichier alors que le groupe de contrôle est inactif (idling), le rapport ne contiendra pas le temps passé à attendre dans l'état inactif (idling) actuel. Remarquez que ce rapport est uniquement disponible si
CONFIG_DEBUG_BLK_CGROUP=y
est installé sur le système. - blkio.dequeue
- rapporte le nombre de fois que des requêtes d'opérations d'E/S d'un groupe de contrôle ont été retirées des files d'attente par des périphériques spécifiques. Les entrées possèdent trois champs : majeur, mineur et nombre. Majeur et mineur sont les types de périphérique et numéros de noeud spécifiés dans les Périphériques alloués Linux et nombre est le nombre de requêtes que le groupe a retiré de la file d'attente. Remarquez que ce rapport est uniquement disponible si
CONFIG_DEBUG_BLK_CGROUP=y
est installé sur le système. - blkio.reset_stats
- réinitialise les statistiques enregistrées dans les autres pseudo-fichiers. Saisissez un entier sur ce fichier pour réinitialiser les statistiques de ce groupe de contrôle.
3.2. cpu
cpu
planifie l'accès du CPU aux groupes de contrôle. L'accès aux ressources CPU peut être planifié en fonction des paramètres suivants, chacun dans un fichier pseudofile (un pseudo-fichier) à l'intérieur du système de fichiers virtuels du groupe de contrôle :
- cpu.shares
- contient une valeur entière spécifiant une part relative du temps du CPU disponible pour les tâches dans un groupe de contrôle (un cgroup). Par exemple, des tâches dans deux groupes de contrôle possédant
cpu.shares
paramétré sur1
recevront le même temps de CPU, mais des tâches dans un groupe de contrôle possédantcpu.shares
paramétré sur2
recevront deux fois plus de temps de CPU que les tâches oùcpu.shares
est paramétré sur1
. - cpu.rt_runtime_us
- spécifie une période de temps en microsecondes (µs, représenté ici sous la forme "us") pour la plus longue période continue pendant laquelle les tâches d'un groupe de contrôle ont accès aux ressources du CPU. Établir cette limite permet d'empêcher les tâches d'un groupe de contrôle de monopoliser le temps du CPU. Si les tâches dans un groupe de contrôle doivent pouvoir accéder aux ressources du CPU pendant 4 secondes sur chaque période de 5 secondes, ajustez
cpu.rt_runtime_us
sur4000000
etcpu.rt_period_us
sur5000000
. - cpu.rt_period_us
- spécifie une période de temps en microsecondes (µs, représenté ici sous la forme "us") pour définir à quelle fréquence réallouer l'accès d'un groupe de contrôle aux ressources du CPU. Si les tâches d'un groupe de contrôle doivent pouvoir accéder aux ressources du CPU pendant 4 secondes sur chaque période de 5 secondes, ajustez
cpu.rt_runtime_us
sur4000000
etcpu.rt_period_us
sur5000000
.
3.3. cpuacct
cpuacct
génère des rapports automatiques sur les ressources CPU utilisées par les tâches dans un groupe de contrôle, y compris les tâches dans les groupes enfants. Trois rapports sont disponibles :
- cpuacct.stat
- rapporte le nombre de cycles CPU (dans l'unité définie par
USER_HZ
sur le système) pris par les tâches dans ce groupe de contrôle et ses groupes enfant dans le mode utilisateur et dans le mode système (noyau). - cpuacct.usage
- rapporte le temps de CPU total (en nanosecondes) pris par toutes les tâches dans ce groupe de contrôle (y compris les tâches situées plus bas dans la hiérarchie).
- cpuacct.usage_percpu
- rapporte le temps de CPU (en nanosecondes) pris sur chaque CPU par toutes les tâches présentes dans ce groupe de contrôle (y compris les tâches situées plus bas dans la hiérarchie).
3.4. cpuset
cpuset
assigne les CPU individuels et les noeuds de mémoire à des groupes de contrôle. Chaque cpuset peut être spécifié en fonction des paramètres suivants, chacun dans un pseudo-fichier différent du système de fichiers virtuel du groupe de contrôle :
Important
cpuset
. les paramètres cpuset.cpus
et cpuset.mems
doivent être définis pour ce cgroup.
- cpuset.cpus (obligatoire)
- spécifie à quels CPU les tâches dans ce groupe de contrôle ont la permission d'accéder. Ceci est une liste séparée par des virgules sous le format ASCII, avec des tirets ("
-
") pour représenter l'étendue. Par exemple :0-2,16
représente les CPUs 0, 1, 2, et 16. - cpuset.mems (obligatoire)
- spécifie les noeuds de mémoire auxquels les tâches de ce groupe de contrôle auront la permission d'accéder. Ceci est une liste séparée par des virgules sous le format ASCII, avec des tirets ("
-
") pour repésenter l'étendue. Par exemple,0-2,16
représente les noeuds de mémoire 0, 1, 2, et 16. - cpuset.memory_migrate
- contient un indicateur (
0
ou1
) spécifiant si une page en mémoire devrait migrer vers un nouveau noeud si les valeurs danscpuset.mems
changent. Par défaut, la migration de mémoire est désactivée (0
) et les pages restent sur le noeud auquel elles ont été assignées à l'origine, même si celui-ci ne fait maintenant plus partie des noeuds spécifiés danscpuset.mems
. Si la migration est activée (1
), le système migrera les pages vers les noeuds de mémoire faisant partie des nouveaux paramètres spécifiés parcpuset.mems
, tout en maintenant leur position respective dans la mesure du possible — par exemple, les pages sur le second noeud sur la liste spécifiée à l'origine parcpuset.mems
seront allouées au second noeud sur la liste maintenant spécifiée parcpuset.mems
, si cette position est disponible. - cpuset.cpu_exclusive
- contient un indicateur (
0
ou1
) spécifiant si des cpusets autres que celui-ci, que ses parents ou que ses enfants peuvent partager les CPUs spécifiés pour ce cpuset. Par défaut (0
), les CPUs ne sont pas exclusivement alloués à un seul cpuset. - cpuset.mem_exclusive
- contient un indicateur (
0
ou1
) spécifiant si d'autres cpusets peuvent partager les noeuds de mémoire spécifiés pour ce cpuset. Par défaut (0
), les noeuds de mémoire ne sont pas exclusivement alloués à un seul cpuset. Réserver des noeuds de mémoire pour une utilisation exclusive d'un seul cpuset ((1
) est fonctionnellement la même chose qu'activer un hardwall de mémoire aveccpuset.mem_hardwall
. - cpuset.mem_hardwall
- contient un indicateur (
0
ou1
) spécifiant si les allocations au noyau de pages mémoire et de données de tampon devraient être restreintes aux noeuds de mémoire spécifiés pour ce cpuset. Par défaut (0
), les pages et les données de tampon sont partagées par les processus appartenant à de multiples utilisateurs. Avec un hardwall activé (1
), la mémoire allouée aux tâches de chaque utilisateur peut être séparée de la mémoire allouée aux tâches de tous les autres utilisateurs. - cpuset.memory_pressure
- un fichier en lecture seule qui contient une moyenne en cours d'exécution de la solicitation de mémoire (memory pressure), créée par les processus dans ce cpuset. La valeur dans ce pseudofichier est automatiquement mise à jour lorsque
cpuset.memory_pressure_enabled
est activé, sinon le pseudofichier contient la valeur0
. - cpuset.memory_pressure_enabled
- contient un indicateur (
0
ou1
) spécifiant si le système doit calculer la solicitation de mémoire (memory pressure) créée par les processus dans ce groupe de contrôle. Les valeurs calculées sortent danscpuset.memory_pressure
et représentent le taux auquel les processus tentent de libérer la mémoire utilisée, ces valeurs sont rapportées en chiffres entiers et s'expliquent par le nombre de tentatives de récupération de mémoire par seconde, multiplié par 1000. - cpuset.memory_spread_page
- contient un indicateur (
0
ou1
) spécifiant si les tampons de systèmes de fichiers doivent être placés de manière régulièresur les noeuds de mémoire alloués à ce cpuset. Par défaut (0
), aucune tentative de placer les pages de mémoire sur ces tampons de manière régulière n'est faite, et ceux-ci sont placés sur le noeud où le processus qui les a créés est en cours d'exécution. - cpuset.memory_spread_slab
- contient un indicateur (
0
ou1
) spécifiant si les caches slab du noyau pour opérations d'entrée/sortie doivet être placés de manière régulière sur le cpuset. Par défaut (0
), aucune tentative de placer les caches slab du noyau de manière régulière n'est faite, et ceux-ci sont placés sur le noeud où le processus qui les a créés est en cours d'exécution. - cpuset.sched_load_balance
- contient un indicateur (
0
ou1
) spécifiant si le noyau va équilibrer les charges sur les CPU dans ce cpuset. Par défaut (1
), le noyau équilibre les charges en déplaçant les processus des CPUs surchargés sur des CPUs moins solicités.Remarquez cependant que définir cet indicateur dans un cgroup n'a aucun effet si l'équilibrage des charges est activé dans tout cgroup parent, car l'équilibrage des charges est déjà en cours à un niveau plus élevé. Ainsi, pour désactiver l'équilibrage des charges dans un cgroup, désactivez aussi l'équilibrage des charges dans chacun de ses parents dans la hiérarchie. Dans ce cas, vous devriez aussi vous demander si l'équilibrage des charges devrait être activé sur les autres relations de même parenté du groupe de contrôle en question. - cpuset.sched_relax_domain_level
- contient un entier entre
-1
et une petite valeur positive, qui représente la largeur de l'étendue des CPUs sur laquelle le noyau va essayer d'équilibrer les charges. Cette valeur n'a aucun sens sicpuset.sched_load_balance
est désactivé.L'effet précis de cette valeur varie en fonction de l'architecture du système, mais les valeurs suivantes sont typiques :Valeurs de cpuset.sched_relax_domain_levelValeur Effet -1
Utilise la valeur par défaut du système pour l'équilibrage des charges 0
N'effectue pas d'équilibrage des charges immédiat ; équilibre les charges de manière périodique uniquement 1
Équilibre immédiatement les charges sur les threads du même coeur 2
Équilibre immédiatement les charges sur les coeurs dans le même paquetage 3
Équilibre immédiatement les charges sur les CPUs du même noeud ou de la même lame 4
Équilibre immédiatement les charges sur plusieurs CPUs sur des architectures à accès non uniforme à la mémoire (NUMA) 5
Équilibre immédiatement les charges sur tous les CPUs sur architectures avec NUMA
3.5. Périphériques
devices
autorise ou refuse l'accès des tâches aux périphériques dans un groupe de contrôle.
Important
devices
) est considéré comme un aperçu technologique dans Red Hat Enterprise Linux 6.
- devices.allow
- spécifie à quels périphériques les tâches d'un groupe de contrôle peuvent avoir accès. Chaque entrée possède quatre champs : type, majeur, mineur et accès. Les valeurs utilisées dans les champs type, majeur et mineur correspondent au type de périphérique et aux numéros de noeuds spécifiés dans Périphériques alloués Linux, aussi connu sous le nom de Liste des périphériques Linux et disponible depuis http://www.kernel.org/doc/Documentation/devices.txt.
- type
- type peut avoir l'une des trois valeurs suivantes :
a
— s'applique à tous les périphériques, périphérique de type caractère et périphériques blocsb
— spécifie un périphérique blocc
— spécifie un périphérique de type caractère
- majeur, mineur
- majeur et mineur sont des numéros de noeuds de périphériques spécifiés par Périphériques alloués Linux. Les numéros majeurs et mineurs sont séparés par deux points. Par exemple,
8
est le numéro majeur spécifiant les lecteurs de disques SCSI, et le numéro mineur1
spécifie la première partition du premier lecteur de disque SCSI ; ainsi,8:1
spécifie cette partition en détails, correspondant à l'emplacement sur le système de fichiers de/dev/sda1
.*
peut remplacer tous les noeuds de périphériques majeurs ou mineurs. Par exemple,9:*
(tous les périphériques RAID), ou même*:*
(tous les périphériques). - accès
- accès est une séquence d'une ou plusieurs des lettres suivantes :
r
— autorise les tâches à lire le périphérique spécifiéw
— autorise les tâches à écrire sur le périphérique spécifiém
— autorise les tâches à créer des fichiers de périphériques qui n'existent pas encore
Par exemple, lorsque l'accès est spécifié en tant quer
, les tâches peuvent uniquement lire le périphérique spécifié, mais lorsque l'accès est spécifié en tant querw
, les tâches peuvent lire et écrire sur le périphérique.
- devices.deny
- spécifie à quels périphériques les tâches dans un groupe de contrôle ne peuvent pas avoir accès. La syntaxe des entrées est identique à celle de
devices.allow
. - devices.list
- rapporte les périphériques pour lesquels les contrôles d'accès ont été définis pour des tâches dans ce groupe de contrôle.
3.6. freezer
freezer
suspend ou réactive les tâches dans un groupe de contrôle.
- freezer.state
freezer.state
possède trois valeurs possibles :FROZEN
— les tâches dans le groupe de contrôle sont suspendues.FREEZING
— le système est en train de suspendre les tâches dans le groupe de contrôle.THAWED
— les tâches dans le groupe de contrôle sont réactivées.
- Déplacez ce processus dans un groupe de contrôle se trouvant dans une hiérarchie à laquelle le sous-système
freezer
est attaché. - Gelez ce groupe de contrôle en particulier pour suspendre le processus qu'il contient.
FROZEN
et THAWED
peuvent être écrites sur freezer.state
, alors que FREEZING
peut seulement être lu.
3.7. mémoire
mémoire
génère des rapports automatiques sur les ressources mémoire utilisées par les tâches dans un groupe de contrôle. Il définit aussi les limites d'utilisation de mémoire de ces tâches :
- memory.stat
- rapporte un large éventail de statistiques de mémoire, comme décrit dans le tableau suivant :
Tableau 3.1. Les valeurs rapportées par memory.stat Statistique Description cache
cache de la page, inclut tmpfs
(shmem
), en octetsrss
caches swap et anonyme, n'inclut pas tmpfs
(shmem
), en octetsmapped_file
taille des fichiers mappé en mémoire, inclut tmpfs
(shmem
), en octetspgpgin
nombre de pages chargées en mémoire pgpgout
nombre de pages renvoyées de la mémoire swap
usage swap, en octets active_anon
caches swap et anonyme de la liste des LRU (dernier récemment utilisé) actifs, inclut tmpfs
(shmem
), en octetsinactive_anon
caches swap et anonyme de la liste des LRU (dernier récemment utilisé) inactifs, inclut tmpfs
(shmem
), en octetsactive_file
mémoire sauvegardée sur fichier de la liste des LRU actifs, en octets inactive_file
mémoire sauvegardée sur fichier de la liste des LRU inactifs, en octets unevictable
mémoire ne pouvant pas être récupérée, en octets hierarchical_memory_limit
limite de la mémoire pour la hiérarchie contenant le groupe de contrôle memory
, en octetshierarchical_memsw_limit
limite de la mémoire plus le swap pour la hiérarchie contenant le groupe de contrôle memory
, en octetsEn outre, à l'exception dehierarchical_memory_limit
et dehierarchical_memsw_limit
, tous les fichiers possèdent un préfixetotal_
qui effectue un rapport non seulement sur le groupe de contrôle, mais aussi sur ses enfants. Par exemple,swap
rapporte l'utilisation du swap d'un groupe de contrôle ettotal_swap
rapporte l'utilisation totale du swap du groupe de contrôle et de tous ses groupes enfants.Lorsque vous interprétez les valeurs rapportées parmemory.stat
, remarquez comme les diverses statistiques sont reliées entres elles :active_anon
+inactive_anon
= mémoire anonyme + cache du fichier detmpfs
+ cache du swapAinsi,active_anon
+inactive_anon
≠rss
, carrss
n'inclut pastmpfs
.active_file
+inactive_file
= cache - taille detmpfs
- memory.usage_in_bytes
- rapporte la totalité de l'utilisation de mémoire actuelle par les processus dans le groupe de contrôle (en octets).
- memory.memsw.usage_in_bytes
- rapporte la somme de l'utilisation actuelle de la mémoire et de l'espace swap utilisé par les processus dans le groupe de contrôle (en octets).
- memory.max_usage_in_bytes
- rapporte le montant maximum de mémoire utilisée par les processus dans le groupe de contrôle (en octets).
- memory.memsw.max_usage_in_bytes
- rapporte le montant maximum de mémoire et d'espace swap utilisé par les processus dans le groupe de contrôle (en octets).
- memory.limit_in_bytes
- définit le montant maximum de mémoire utilisateur (y compris le cache du fichier). Si aucune unité n'est saisie, la valeur sera interprétée en octets. Il est cependant possible d'utiliser des suffixes afin de représenter de plus grandes unités —
k
ouK
pour des kilo-octets,m
ouM
pour des mégaoctets, etg
ouG
pour des gigaoctets.L'utilisation dememory.limit_in_bytes
pour limiter le groupe de contrôle racine est impossible ; l'application de valeurs est uniquement possible sur des groupes se trouvant plus bas dans la hiérarchie.Écrire-1
surmemory.limit_in_bytes
pour supprimer toutes les limites existantes. - memory.memsw.limit_in_bytes
- définit le montant maximum de la somme de l'utilisation de la mémoire et du swap. Si aucune unité n'est saisie, la valeur sera interprétée en octets. Il est cependant possible d'utiliser des suffixes afin de représenter de plus grandes unités —
k
ouK
pour des kilo-octets,m
ouM
pour des mégaoctets, etg
ouG
pour des gigaoctets.L'utilisation dememory.memsw.limit_in_bytes
pour limiter le groupe de contrôle racine est impossible ; l'application de valeurs est uniquement possible sur des groupes se trouvant plus bas dans la hiérarchie.Écrire-1
surmemory.memsw.limit_in_bytes
pour supprimer toutes les limites existantes. - memory.failcnt
- rapporte le nombre de fois que la limite de mémoire a atteint la valeur définie dans
memory.limit_in_bytes
. - memory.memsw.failcnt
- rapporte le nombre de fois que la limite de la somme de la mémoire et de l'espace swap a atteint la valeur définie dans
memory.memsw.limit_in_bytes
. - memory.force_empty
- vide la mémoire de toutes les pages utilisées par des tâches dans ce groupe de contrôle lorsque défini sur
0
. Cette interface peut uniquement être utilisée lorsque le groupe de contrôle ne possède aucune tâche. Si la mémoire ne peut pas être libérée, celle-ci sera déplacée sur un groupe de contrôle parent si possible. Utilisezmemory.force_empty
avant de supprimer un groupe de contrôle afin d'éviter de déplacer les caches des pages hors d'usage sur son groupe de contrôle parent. - memory.swappiness
- définit la tendance du noyau à déloger la mémoire de processus utilisée par les tâches dans ce groupe de contrôle plutôt que de réclamer des pages depuis le cache de page. Il s'agit de la même tendance et du même calcul que ce qui figure dans
/proc/sys/vm/swappiness
pour le système en tant que tout. La valeur par défaut est60
. Des valeurs plus petites diminueront la tendance à déloger la mémoire de processus. Des valeurs plus élevées que60
augmenteront la tendance du noyau à déloger la mémoire de processus, et les valeurs supérieures à100
permettront au noyau de déloger des pages faisant partie de l'espace adresse pour ce groupe de contrôle.Remarquez que la valeur0
n'empêchera pas la mémoire de processus d'être délogée; celui-ci pourra tout de même se produire lorsqu'il y a un manque de mémoire système car la logique de gestion de la mémoire virtuelle globale ne lit pas la valeur du groupe de contrôle. Pour complètement verrouiller les pages, veuillez utilisermlock()
au lieu des groupes de contrôle.Il n'est pas possible de modifier le "swappiness" des groupes suivants :- le groupe de contrôle racine, qui utilise le "swappiness" installé dans
/proc/sys/vm/swappiness
. - un groupe de contrôle possédant des groupes enfants.
- memory.use_hierarchy
- contient un indicateur (
0
ou1
) spécifiant si la mémoire utilisée devrait être prise en compte sur une hiérarchie de groupes de contrôle. Si activé (1
), le sous-système de la mémoire récupèrera la mémoire de tous les processus enfants excédant la limite de mémoire. Par défaut (0
), le sous-système ne récupère pas la mémoire d'une tâche enfant.
3.8. net_cls
net_cls
repère les paquets réseau avec un identifiant de classe (classid) qui permet au contrôleur de trafic Linux (tc) d'identifier les paquets provenant d'un groupe de contrôle particulier. Le contrôleur de trafic peut être configuré de manière à assigner différentes priorités à des paquets provenant de différents groupes de contrôle.
- net_cls.classid
net_cls.classid
contient une valeur seule sous format hexadécimal indiquant un descripteur (ou handle) de contrôle du trafic. Par exemple,0x100001
représente le handle conventionnellement écrit sous le format utilisé par iproute2 :10:1
.Le format de ces descripteurs (handles) est comme suit :0xAAAABBBB
, où AAAA est le numéro majeur en hexadécimal et où BBBB est le numéro mineur en hexadécimal. Vous pouvez ainsi omettre d'inclure les zéros du début :0x10001
est la même chose que0x00010001
, et représente1:1
.
net_cls
ajoute aux paquets réseau.
3.9. ns
ns
fournit une manière de grouper les processus dans des espaces de noms (namespaces) séparés. Dans un espace de nom particulier, les processus peuvent interagir ensemble mais sont isolés des processus exécutés dans d'autres espaces de noms. Ces autres espaces de noms sont parfois appelés des conteneurs (containers) lors de leur utilisation pour une virtualisation au niveau du système d'exploitation.
3.10. Ressources supplémentaires
Documentation sur les noyaux spécifiques aux sous-systèmes
/usr/share/doc/kernel-doc-<kernel_version>/Documentation/cgroups/
(fournit par le paquetage kernel-doc).
- Sous-système
blkio
—blkio-controller.txt
- Sous-système
cpuacct
—cpuacct.txt
- Sous-système
cpuset
—cpusets.txt
- Sous-système
devices
—devices.txt
- Sous-système
freezer
—freezer-subsystem.txt
- Sous-système
memory
—memory.txt
Annexe A. Historique des révisions
Historique des versions | ||||||
---|---|---|---|---|---|---|
Version 1-2.33.400 | 2013-10-31 | |||||
| ||||||
Version 1-2.33 | July 24 2012 | |||||
| ||||||
Version 1.0-5 | Thu May 19 2011 | |||||
| ||||||
Version 1.0-4 | Tue Mar 1 2011 | |||||
| ||||||
Version 1.0-3 | Wed Nov 17 2010 | |||||
| ||||||
Version 1.0-2 | Thu Nov 11 2010 | |||||
| ||||||
Version 1.0-1 | Wed Nov 10 2010 | |||||
| ||||||
Version 1.0-0 | Tue Nov 9 2010 | |||||
|