Man page - cgroups(7)

Packages contains this manual

Available languages:

en fr sv ru

Manual

cgroups

NOM
DESCRIPTION
Terminologie
Cgroups version 1 et version 2
CGROUPS VERSION 1
TĂąches (threads) versus processus
Montage de contrĂŽleurs version 1
Démontage des contrÎleurs version 1
ContrÎleurs de cgroups version 1
Création de cgroups et déplacement de processus
Suppression de cgroups
Notification de publication de cgroups version 1
Hiérarchies nommées de cgroups version 1
CGROUPS VERSION 2
Hiérarchie unifiée de cgroups version 2
Options de montage pour cgroups version 2
ContrÎleurs de cgroups version 2
ContrĂŽle de sous-arbres de cgroups version 2
RÚgle « pas de processus internes » pour cgroups version 2
Fichier cgroup.events de cgroups version 2
Notification de libération de cgroups version 2
Fichier cgroup.stat de cgroups version 2
Limitation du nombre de cgroups descendants
DÉLÉGATION DE CGROUPS À UN UTILISATEUR AVEC DES PRIVILÈGES MOINDRES
Délégation de cgroups version 2 : nsdelegate et espace de noms cgroup
RÚgles de confinement de délégation de cgroup
MODE THREAD DE CGROUPS VERSION 2
Threaded versus contrĂŽleurs de domaine
CrĂ©ation d’un sous-arbre threaded
Utilisation de sous-arbre threaded
RÚgles pour écrire dans cgroup.type et créer des sous-arbres threaded
Le type « domain threaded » de cgroup
Exceptions pour le cgroup racine
Le contrÎleur « cpu » de cgroups version 2 et les threads en temps réel
ERREURS
NOTES
Fichiers /proc
Fichiers /sys/kernel/cgroup
VOIR AUSSI
TRADUCTION

NOM

cgroups – Groupes de contrîle de Linux

DESCRIPTION

Les groupes de contrĂŽle, habituellement appelĂ©s cgroups, sont une fonctionnalitĂ© du noyau Linux qui permet d’organiser les processus en groupes hiĂ©rarchiques afin de limiter et de superviser leur utilisation de types divers de ressource. L’interface cgroup du noyau est fournie Ă  travers un pseudo-systĂšme de fichiers appelĂ© cgroupfs. Le regroupement est implĂ©mentĂ© dans le code central cgroup du noyau, tandis que le suivi et les limites de ressources sont implĂ©mentĂ©s dans un ensemble de sous-systĂšmes de type par ressource (mĂ©moire, CPU, etc.).

Terminologie

Un cgroup est une collection de processus qui sont liĂ©s Ă  un ensemble de limites ou de paramĂštres dĂ©finis Ă  l’aide du systĂšme de fichiers cgroup.

Un sous-systĂšme est un composant du noyau qui modifie le comportement des processus dans un cgroup. Divers sous-systĂšmes ont Ă©tĂ© implĂ©mentĂ©s, rendant possible de faire des choses comme la limitation de temps CPU et de mĂ©moire disponibles pour un cgroup, la comptabilisation du temps CPU utilisĂ© dans un cgroup et le gel ou la reprise de l’exĂ©cution des processus dans un cgroup. Les sous-systĂšmes sont parfois connus comme contrĂŽleurs de ressource (ou simplement, contrĂŽleurs).

Les cgroups pour un contrĂŽleur sont agencĂ©s dans une hiĂ©rarchie . Celle-ci est dĂ©finie en crĂ©ant, supprimant et renommant des sous-rĂ©pertoires dans le systĂšme de fichiers cgroup. À chaque niveau de la hiĂ©rarchie, des attributs (par exemple, des limites) peuvent ĂȘtre dĂ©finis. Les limites, le contrĂŽle et la comptabilisation fournis par les cgroups ont gĂ©nĂ©ralement des effets partout dans la sous-hiĂ©rarchie du cgroup oĂč les attributs sont dĂ©finis. Par consĂ©quent, par exemple, les limites placĂ©es dans un cgroup d’un niveau supĂ©rieur dans la hiĂ©rarchie ne peuvent ĂȘtre franchies par des cgroups descendants.

Cgroups version 1 et version 2

La publication initiale de l’implĂ©mentation des cgroups a Ă©tĂ© faite dans Linux 2.6.24. Au cours du temps, divers contrĂŽleurs de cgroup ont Ă©tĂ© ajoutĂ©s pour permettre la gestion de divers types de ressources. Cependant, le dĂ©veloppement de ces contrĂŽleurs n’a pas Ă©tĂ© coordonnĂ© en grande partie avec pour rĂ©sultat l’apparition de nombreuses incohĂ©rences entre les contrĂŽleurs et une complexitĂ© accrue de la gestion des hiĂ©rarchies de cgroup. Une description plus complĂšte de ces problĂšmes peut ĂȘtre trouvĂ©e dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v2.rst (ou Documentation/cgroup-v2.txt dans Linux version 4.17 et prĂ©cĂ©dentes).

À cause des problĂšmes avec l’implĂ©mentation initiale des cgroups (cgroups version 1), des travaux ont commencĂ©, Ă  partir de Linux 3.10, sur une nouvelle implĂ©mentation indĂ©pendante pour remĂ©dier Ă  ces problĂšmes. Au dĂ©part marquĂ©e comme expĂ©rimentale, et dissimulĂ©e derriĂšre l’option de montage -o __DEVEL__sane_behavior , la nouvelle version (cgroups version 2) est devenue finalement officielle avec la publication de Linux 4.5. Les diffĂ©rences entre les deux versions sont dĂ©crites dans le texte qui suit. Le fichier cgroup.sane_behavior , prĂ©sent dans cgroups version 1, est un vestige de cette option de montage. Le fichier indique toujours « 0 » et n’est conservĂ© que pour la rĂ©trocompatibilitĂ©.

Bien que cgroups version 2 soit destinĂ© Ă  remplacer la version 1, l’ancien systĂšme continue Ă  exister (et pour des raisons de compatibilitĂ©, ne sera vraisemblablement pas supprimĂ©). Actuellement, cgroups version 2 implĂ©mente un sous-ensemble de contrĂŽleurs disponibles dans cgroups version 1. Les deux systĂšmes sont implĂ©mentĂ©s de façon que les contrĂŽleurs version 1 et 2 puissent ĂȘtre montĂ©s sur le mĂȘme systĂšme. Ainsi, par exemple, il est possible d’utiliser les contrĂŽleurs qui sont pris en charge par la version 2, tout en utilisant aussi des contrĂŽleurs version 1 lĂ  oĂč la version 2 ne les prend pas encore en charge. La seule restriction ici est qu’un contrĂŽleur ne peut pas ĂȘtre employĂ© simultanĂ©ment dans une hiĂ©rarchie de cgroups version 1 et dans une hiĂ©rarchie de cgroups version 2.

CGROUPS VERSION 1

Sous cgroups version 1, chaque contrĂŽleur peut ĂȘtre montĂ© pour un systĂšme de fichiers cgroup distinct qui fournit sa propre organisation hiĂ©rarchique des processus dans le systĂšme. Il est aussi possible de co-monter plusieurs (et mĂȘme tous) les contrĂŽleurs de cgroups version 1 pour le mĂȘme systĂšme de fichiers cgroup, ce qui signifie que les contrĂŽleurs co-montĂ©s gĂšrent la mĂȘme organisation hiĂ©rarchique des processus.

Pour chaque hiĂ©rarchie montĂ©e, l’arbre de rĂ©pertoires reflĂšte la hiĂ©rarchie de groupes de contrĂŽle. Chaque groupe de contrĂŽle est reprĂ©sentĂ© par un rĂ©pertoire, avec chaque cgroup de contrĂŽle enfant reprĂ©sentĂ© par un rĂ©pertoire enfant. Par exemple, /user/joe/1.session reprĂ©sente le groupe de contrĂŽle 1.session , qui est un enfant du cgroup joe , qui est un enfant de /user . Sous chaque rĂ©pertoire cgroup existe un ensemble de fichiers qui peuvent ĂȘtre lus ou Ă©crits, reflĂ©tant les limites de ressources et quelques propriĂ©tĂ©s gĂ©nĂ©rales du cgroup.

TĂąches (threads) versus processus

Dans cgroups version 1, une distinction est faite entre les processus et les tĂąches . De ce fait, un processus peut consister en plusieurs tĂąches (plus couramment appelĂ©es threads, du point de vue espace utilisateur, et appelĂ©es ainsi dans la suite de cette page de manuel). Dans cgroups version 1, il est possible de manipuler indĂ©pendamment l’appartenance de cgroup des threads d’un processus.

La capacitĂ© de cgroups version 1 de rĂ©partir les threads dans des cgroups diffĂ©rents cause des problĂšmes dans certains cas. Par exemple, cela n’a aucun sens pour le contrĂŽleur de mĂ©moire , puisque tous les threads d’un processus partagent un mĂȘme espace d’adressage. À cause de cela, la capacitĂ© de manipuler indĂ©pendamment l’appartenance de cgroup des threads dans un processus a Ă©tĂ© retirĂ©e dans l’implĂ©mentation initiale de cgroups version 2, et ultĂ©rieurement restaurĂ©e dans une forme plus limitĂ©e (voir l’explication sur le « mode threads » ci-aprĂšs).

Montage de contrĂŽleurs version 1

L’utilisation de cgroups requiert un noyau construit avec l’option CONFIG_CGROUP . De plus, chaque contrĂŽleur version 1 possĂšde une option de configuration associĂ©e qui doit ĂȘtre dĂ©finie pour utiliser ce contrĂŽleur.

Pour utiliser un contrĂŽleur version 1, il doit ĂȘtre montĂ© pour un systĂšme de fichiers de cgroup. L’emplacement habituel de tels montages est sous le systĂšme de fichiers tmpfs (5) montĂ© dans /sys/fs/cgroup . Par consĂ©quent, un montage du contrĂŽleur cpu peut ĂȘtre rĂ©alisĂ© ainsi :

mount -t cgroup -o cpu none /sys/fs/cgroup/cpu

Il est possible de co-monter plusieurs contrĂŽleurs pour la mĂȘme hiĂ©rarchie. Ici par exemple, les contrĂŽleurs cpu et cpuacct sont co-montĂ©s pour une mĂȘme hiĂ©rarchie :

mount -t cgroup -o cpu,cpuacct none /sys/fs/cgroup/cpu,cpuacct

Le co-montage de contrĂŽleurs fait qu’un processus est dans le mĂȘme cgroup pour tous les contrĂŽleurs co-montĂ©s. SĂ©parer le montage de contrĂŽleurs permet Ă  un processus d’ĂȘtre dans le cgroup /toto1 pour un contrĂŽleur tout en Ă©tant dans /toto2/toto3 pour un autre.

Il est possible de co-monter tous les contrĂŽleurs version 1 pour la mĂȘme hiĂ©rarchie :

mount -t cgroup -o all cgroup /sys/fs/cgroup

(Le mĂȘme rĂ©sultat peut ĂȘtre obtenu en omettant -o all , puisque c’est le comportement par dĂ©faut si aucun contrĂŽleur n’est explicitement prĂ©cisĂ©.)

Il n’est pas possible de monter le mĂȘme contrĂŽleur pour plusieurs hiĂ©rarchies de cgroup. Par exemple, il n’est pas possible de monter Ă  la fois les contrĂŽleurs cpu et cpuacct pour une mĂȘme hiĂ©rarchie et de monter le contrĂŽleur cpu seul pour une autre hiĂ©rarchie. Il est possible de crĂ©er plusieurs montages avec exactement le mĂȘme ensemble de contrĂŽleurs co-montĂ©s. Dans ce cas cependant, tout cela aboutit Ă  ce que plusieurs points de montage fournissent une vue de la mĂȘme hiĂ©rarchie.

Remarquez que sur de nombreux systÚmes, les contrÎleurs version 1 sont automatiquement montés sous /sys/fs/cgroup . En particulier, systemd (1) crée automatiquement de tels montages.

Démontage des contrÎleurs version 1

Un systĂšme de fichiers cgroup montĂ© peut ĂȘtre dĂ©montĂ© en utilisant la commande umount (8) comme dans l’exemple suivant :

umount /sys/fs/cgroup/pids

Bien remarquer qu’un systĂšme de fichiers de cgroup est dĂ©montĂ© seulement s’il n’est pas en cours d’utilisation, c’est-Ă -dire qu’il n’a pas de cgroups enfants. Si ce n’est pas le cas, le seul effet de umount (8) est de rendre le montage invisible. Par consĂ©quent, pour ĂȘtre sĂ»r que le montage est rĂ©ellement retirĂ©, les cgroups enfants doivent d’abord ĂȘtre retirĂ©s, ce qui Ă  son tour ne peut ĂȘtre fait qu’aprĂšs que tous les processus membres ont Ă©tĂ© dĂ©placĂ©s de ces cgroups vers le cgroup racine.

ContrÎleurs de cgroups version 1

Chacun de ces contrĂŽleurs de cgroups version 1 est rĂ©gi par une option de configuration du noyau (liste ci-aprĂšs). De plus, la disponibilitĂ© de la fonctionnalitĂ© des cgroups est rĂ©gie par l’option de configuration CONFIG_CGROUPS du noyau.
cpu
(depuis Linux 2.6.24 ; CONFIG_CGROUP_SCHED )

Un nombre minimal de « partages de CPU » peut ĂȘtre garanti quand un systĂšme est actif. Cela ne limite pas l’utilisation de CPU par un cgroup si les CPU ne sont pas actifs. Pour plus d’informations, consultez Documentation/scheduler/sched-design-CFS.rst (ou Documentation/scheduler/sched-design-CFS.txt dans Linux 5.2 et les versions antĂ©rieures).

Dans Linux 3.2, ce contrĂŽleur a Ă©tĂ© Ă©tendu pour fournir un contrĂŽle de la « bande passante » du CPU. Si le noyau est configurĂ© avec CONFIG_CFS_BANDWIDTH , il est possible de dĂ©finir une limite haute du temps CPU allouĂ© aux processus d’un cgroup Ă  chaque pĂ©riode de planification (dĂ©finie Ă  l’aide d’un fichier dans le rĂ©pertoire de cgroup). La limite haute s’applique mĂȘme s’il n’existe aucune compĂ©tition pour le CPU. Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/scheduler/sched-bwc.rst (ou Documentation/scheduler/sched-bwc.txt dans Linux 5.2 et les versions antĂ©rieures).

cpuacct (depuis 2.6.24 ; CONFIG_CGROUP_CPUACCT )

Ce contrîleur fournit la comptabilisation de l’utilisation du CPU par des groupes de processus.

Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/cpuacct.rst (ou Documentation/cgroup-v1/cpuacct.txt dans Linux 5.2 et les versions antĂ©rieures).

cpuset (depuis Linux 2.6.24 ; CONFIG_CPUSETS )

Ce cgroup peut ĂȘtre utilisĂ© pour lier les processus dans un cgroup Ă  un ensemble spĂ©cifiĂ© de CPU ou de nƓuds NUMA.

Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/cpusets.rst (ou Documentation/cgroup-v1/cpusets.txt dans Linux 5.2 et les versions prĂ©cĂ©dentes).

memory (depuis Linux 2.6.25 ; CONFIG_MEMCG )

Le contrĂŽleur de mĂ©moire prend en charge le rapport et la limitation de la mĂ©moire du processus, de la mĂ©moire du noyau et de la partition d’échange utilisĂ©es par les cgroups.

Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/memory.rst (ou Documentation/cgroup-v1/memory.txt dans Linux 5.2 et les versions antĂ©rieures).

devices (depuis Linux 2.6.26 ; CONFIG_CGROUP_DEVICE )

Ce contrĂŽleur prend en charge la dĂ©finition des processus qui pourront crĂ©er (mknod) des pĂ©riphĂ©riques et les ouvrir en lecture ou Ă©criture. Les politiques peuvent ĂȘtre prĂ©cisĂ©es dans des listes d’autorisations ou de refus. La hiĂ©rarchie est imposĂ©e, aussi des rĂšgles nouvelles ne doivent pas violer les rĂšgles existantes pour la cible ou pour des cgroups ancĂȘtres.

Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/devices.rst (ou Documentation/cgroup-v1/devices.txt dans Linux 5.2 et les versions antĂ©rieures).

freezer (depuis Linux 2.6.28 ; CONFIG_CGROUP_FREEZER )

Le cgroup freezer peut suspendre ou restaurer (reprendre) tous les processus d’un cgroup. Geler un cgroup /A fait que ses enfants, par exemple les processus dans /A/B , sont gelĂ©s.

Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/freezer-subsystem.rst (ou Documentation/cgroup-v1/freezer-subsystem.txt dans Linux 5.2 et les versions antĂ©rieures).

net_cls (depuis Linux 2.6.29 ; CONFIG_CGROUP_NET_CLASSID )

Ce contrĂŽleur place un identificateur de classe (classid), prĂ©cisĂ© pour le cgroup, sur des paquets rĂ©seau créés par un cgroup. Ces identificateurs peuvent ĂȘtre utilisĂ©s dans des rĂšgles de pare-feu, ainsi que pour canaliser le trafic en utilisant tc (8). Cela s’applique aux paquets quittant le cgroup, pas au trafic y arrivant.

Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/net_cls.rst (ou Documentation/cgroup-v1/net_cls.txt dans Linux 5.2 et les versions antĂ©rieures).

blkio (depuis Linux 2.6.33 ; CONFIG_BLK_CGROUP )

Le cgroup blkio contrĂŽle et limite l’accĂšs aux pĂ©riphĂ©riques en mode bloc indiquĂ©s en appliquant un contrĂŽle d’E/S sous forme de restrictions et de limites d’accĂšs Ă  l’encontre de nƓuds feuilles et de nƓuds intermĂ©diaires dans la hiĂ©rarchie de stockage.

Deux politiques sont possibles. La premiĂšre est une division du disque proportionnelle au poids basĂ©e sur la durĂ©e et implĂ©mentĂ©e avec CFQ (Completely Fair Queuing — file d’attente complĂštement Ă©quitable). C’est le cas pour les nƓuds feuilles utilisant CFQ. La seconde est une politique d’étranglement qui prĂ©cise les limites supĂ©rieures de taux d’E/S sur un pĂ©riphĂ©rique.

Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/blkio-controller.rst (ou Documentation/cgroup-v1/blkio-controller.txt dans Linux 5.2 et les versions antĂ©rieures).

perf_event (depuis Linux 2.6.39 ; CONFIG_CGROUP_PERF )

Ce contrĂŽleur permet Ă  perf de superviser l’ensemble des processus groupĂ©s dans un cgroup.

Plus d’informations sont disponibles dans le fichier des sources du noyau.

net_prio (depuis Linux 3.3 ; CONFIG_CGROUP_NET_PRIO )

Ce contrÎleur permet de définir des priorités par interface réseau pour les cgroups.

Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/net_prio.rst (ou Documentation/cgroup-v1/net_prio.txt dans Linux 5.2 et les versions antĂ©rieures).

hugetlb (depuis Linux 3.5 ; CONFIG_CGROUP_HUGETLB )

Ce contrîleur prend en charge la limitation de l’utilisation de trùs grandes pages par les cgroups.

Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/hugetlb.rst (ou Documentation/cgroup-v1/hugetlb.txt dans Linux 5.2 et les versions antĂ©rieures).

pids (depuis Linux 4.3 ; CONFIG_CGROUP_PIDS )

Ce contrĂŽleur permet de limiter le nombre de processus pouvant ĂȘtre créés dans un cgroup (et ses descendants).

Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/pids.rst (ou Documentation/cgroup-v1/pids.txt dans Linux 5.2 et les versions antĂ©rieures).

rdma (depuis Linux 4.11 ; CONFIG_CGROUP_RDMA )

Le contrĂŽleur RDMA permet de limiter l’utilisation de ressources spĂ©cifiques Ă  RDMA/IB.

Plus d’informations sont disponibles dans le fichier des sources du noyau Documentation/admin-guide/cgroup-v1/rdma.rst (ou Documentation/cgroup-v1/rdma.txt dans Linux 5.2 et les versions antĂ©rieures).

Création de cgroups et déplacement de processus

Un systÚme de fichiers de cgroup contient initialement un seul cgroup racine, « / », auquel tous les processus appartiennent. Un nouveau cgroup est créé en créant un répertoire dans le systÚme de fichiers de cgroup :

mkdir /sys/fs/cgroup/cpu/cg1

Cette commande crée un nouveau cgroup vide.

Un processus peut ĂȘtre transfĂ©rĂ© dans ce cgroup en Ă©crivant son PID dans le fichier cgroup.procs du cgroup :

echo $$ > /sys/fs/cgroup/cpu/cg1/cgroup.procs

Un seul PID Ă  la fois peut ĂȘtre Ă©crit dans ce fichier.

Écrire la valeur 0 dans un fichier cgroup.procs fait que le processus Ă©crivain est transfĂ©rĂ© dans le cgroup correspondant.

Quand un PID est écrit dans le fichier cgroup.procs , tous les threads du processus sont transférés ensemble dans le nouveau cgroup.

Dans une hiĂ©rarchie, un processus peut ĂȘtre membre d’un et un seul cgroup. Écrire un PID de processus dans un fichier cgroup.procs le retire automatiquement du cgroup auquel il appartenait prĂ©cĂ©demment.

Le fichier cgroup.procs peut ĂȘtre lu pour obtenir une liste des processus qui sont membres d’un cgroup. L’absence de doublons dans la liste renvoyĂ©e des PID n’est pas garantie et cette derniĂšre ne sera pas forcĂ©ment triĂ©e. Par exemple, un PID peut ĂȘtre recyclĂ© pendant la lecture de la liste.

Dans cgroups version 1, un thread individuel peut ĂȘtre transfĂ©rĂ© dans un autre cgroup en Ă©crivant son ID de thread (c’est-Ă -dire l’ID de thread du noyau renvoyĂ© par clone (2) et gettid (2)) dans le fichier tasks d’un rĂ©pertoire de cgroup. Ce fichier peut ĂȘtre lu pour dĂ©couvrir l’ensemble des threads membres du cgroup.

Suppression de cgroups

Pour supprimer un cgroup, il doit tout d’abord n’avoir aucun cgroup enfant et ne contenir aucun processus (non zombie). Tant que c’est le cas, on peut simplement supprimer le nom de chemin de rĂ©pertoire correspondant. Remarquez que les fichiers dans le rĂ©pertoire de cgroup ne peuvent et n’ont pas besoin d’ĂȘtre supprimĂ©s.

Notification de publication de cgroups version 1

Deux fichiers peuvent ĂȘtre utilisĂ©s pour dĂ©terminer si le noyau fournit des notifications quand un cgroup devient vide. Un cgroup est considĂ©rĂ© comme vide quand il ne contient ni cgroup enfant, ni processus membre.

Un fichier spĂ©cial dans le rĂ©pertoire racine de chaque hiĂ©rarchie de cgroup, release_agent , peut ĂȘtre utilisĂ© pour enregistrer le nom de chemin d’un programme pouvant ĂȘtre invoquĂ© quand un cgroup dans la hiĂ©rarchie devient vide. Le nom de chemin du cgroup nouvellement vide (relatif au point de montage du cgroup) est fourni comme seul argument de ligne de commande quand le programme release_agent est invoquĂ©. Le programme release_agent pourrait supprimer le rĂ©pertoire du cgroup ou, peut ĂȘtre, le repeupler avec un processus.

Par dĂ©faut, le fichier release_agent est vide, signifiant qu’aucun agent de publication n’est invoquĂ©.

Le contenu du fichier release_agent peut ĂȘtre spĂ©cifiĂ© Ă  l’aide d’une option de montage quand le systĂšme de fichiers de cgroup est monté :

mount -o release_agent=pathname ...

Que le programme release_agent soit invoquĂ© ou pas quand un cgroup particulier devient vide est dĂ©terminĂ© par la valeur inscrite dans le fichier notify_on_release dans le rĂ©pertoire de cgroup correspondant. Si ce fichier contient la valeur 0, alors le programme release_agent n’est pas invoquĂ©. Si cette valeur est 1, le programme release_agent est invoquĂ©. La valeur par dĂ©faut inscrite dans ce fichier dans le cgroup racine est 0. Au moment de la crĂ©ation d’un nouveau cgroup, la valeur dans ce fichier est hĂ©ritĂ©e du fichier correspondant dans le cgroup parent.

Hiérarchies nommées de cgroups version 1

Dans cgroups version 1, il est possible de monter une hiĂ©rarchie de cgroup qui n’a pas de contrĂŽleurs attachĂ©s.

mount -t cgroup -o none,name=un_nom none /un/point/de/montage

Plusieurs instances de telles hiĂ©rarchies peuvent ĂȘtre montĂ©es, chaque hiĂ©rarchie devant avoir un nom unique. Le seul but de telles hiĂ©rarchies est de suivre les processus (consultez les explications de notification de publication ci-dessous). La hiĂ©rarchie de cgroup name=systemd qui est utilisĂ©e par systemd (1) pour suivre les services et les sessions d’utilisateur en est un exemple.

Depuis Linux 5.0, l’option d’amorçage cgroup_no_v1 du noyau (dĂ©crite ci-aprĂšs) peut ĂȘtre utilisĂ©e pour dĂ©sactiver les hiĂ©rarchies nommĂ©es de cgroups version 1, en spĂ©cifiant cgroup_no_v1=named .

CGROUPS VERSION 2

Dans cgroups version 2, tous les contrĂŽleurs montĂ©s rĂ©sident dans une seule hiĂ©rarchie unifiĂ©e. Alors que des contrĂŽleurs (diffĂ©rents) peuvent ĂȘtre montĂ©s simultanĂ©ment dans des hiĂ©rarchies version 1 ou 2, il n’est pas possible de monter le mĂȘme contrĂŽleur simultanĂ©ment dans les deux hiĂ©rarchies version 1 et version 2.

Les nouveaux comportements dans cgroups version 2 sont résumés ici et, dans quelques cas, développés dans les sous-sections suivantes.

-

Les cgroups version 2 fournissent une hiérarchie unifiée pour laquelle tous les contrÎleurs sont montés.

-

Les processus « internes » ne sont pas autorisĂ©s. À l’exception du cgroup racine, les processus ne peuvent rĂ©sider que dans les nƓuds feuilles (les cgroups qui ne contiennent pas eux-mĂȘmes de cgroups enfants). Les dĂ©tails sont un peu plus subtils que ça et sont dĂ©crits ci-aprĂšs.

-

Les cgroups actifs doivent ĂȘtre indiquĂ©s Ă  l’aide des fichiers cgroup.controllers et cgroup.subtree_control .

-

Le fichier tasks et le fichier cgroup.clone_children qui est utilisé par le contrÎleur cpuset ont été supprimés.

-

Un mécanisme amélioré pour la notification de cgroups vides est fourni par le fichier cgroup.events .

Pour plus de détails sur les modifications, consultez le fichier Documentation/admin-guide/cgroup-v2.rst dans les sources du noyau (ou Documentation/cgroup-v2.txt dans Linux 4.17 et les versions antérieures).

Certains de ces nouveaux comportements intĂšgrent une modification avec l’ajout dans Linux 4.14 du « mode thread » (dĂ©crit ci-aprĂšs).

Hiérarchie unifiée de cgroups version 2

Dans les cgroups version 1, la possibilitĂ© de monter diffĂ©rents contrĂŽleurs pour diffĂ©rentes hiĂ©rarchies Ă©tait voulue pour permettre une grande flexibilitĂ© dans la conception des applications. En pratique, la flexibilitĂ© s’est avĂ©rĂ©e moins utile qu’espĂ©rĂ©e et, dans de nombreux de cas, a ajoutĂ© de la complexitĂ©. Par consĂ©quent, dans cgroups version 2, tous les contrĂŽleurs disponibles sont montĂ©s pour une seule hiĂ©rarchie. Les contrĂŽleurs disponibles sont automatiquement montĂ©s, ce qui signifie qu’il n’est pas nĂ©cessaire (ou possible) d’indiquer les contrĂŽleurs lors du montage d’un systĂšme de fichiers cgroups version 2 en utilisant une commande telle que la suivante :

mount -t cgroup2 none /mnt/cgroup2

Un contrĂŽleur cgroups version 2 est disponible seulement s’il n’est pas en cours d’utilisation Ă  l’aide d’un montage pour une hiĂ©rarchie de cgroups version 1. Ou, pour dire les choses autrement, il n’est pas possible d’employer le mĂȘme contrĂŽleur pour les deux hiĂ©rarchies version 1 et version 2 unifiĂ©e. Cela signifie qu’il peut ĂȘtre nĂ©cessaire d’abord de dĂ©monter un contrĂŽleur version 1 (comme dĂ©crit ci-dessus) avant que ce contrĂŽleur soit disponible en version 2. Puisque systemd (1) utilise abondamment quelques contrĂŽleurs version 1 par dĂ©faut, il peut dans certains cas ĂȘtre plus simple d’amorcer le systĂšme avec ces contrĂŽleurs version 1 dĂ©sactivĂ©s. Pour ce faire, spĂ©cifier l’option cgroup_no_v1=list sur la ligne de commande d’amorçage du noyau. list est une liste de noms sĂ©parĂ©s par des virgules des contrĂŽleurs Ă  dĂ©sactiver ou le mot all pour dĂ©sactiver tous les contrĂŽleurs version 1. Cette situation est gĂ©rĂ©e correctement par systemd (1), ce qui revient Ă  un amorçage sans ces contrĂŽleurs.

Remarquez que sur de nombreux systùmes modernes, systemd (1) monte automatiquement le systùme de fichiers cgroup2 dans /sys/fs/cgroup/unified lors du processus d’amorçage.

Options de montage pour cgroups version 2

Les options suivantes ( mount -o ) peuvent ĂȘtre spĂ©cifiĂ©es lors du montage de systĂšmes de fichiers de groupe version 2 :
nsdelegate
(depuis Linux 4.15)

Traitement des espaces de noms cgroup comme des limites de délégation. Pour plus de détails, voir ci-dessous.

memory_localevents (depuis Linux 5.2)

memory.events devrait afficher des statistiques seulement pour le cgroup lui-mĂȘme, pas pour les cgroups descendants. C’était le comportement avant Linux 5.2. Depuis Linux 5.2, le comportement par dĂ©faut consiste Ă  inclure des statistiques pour les cgroups descendants dans memory.events et cette option de montage peut ĂȘtre utilisĂ©e pour revenir au comportement traditionnel. Cette option s’applique au systĂšme entier et peut ĂȘtre dĂ©finie au moment du montage ou modifiĂ©e Ă  travers un remontage seulement Ă  partir de l’espace de noms montage initial. Elle est silencieusement ignorĂ©e dans les espaces de noms non initiaux.

ContrÎleurs de cgroups version 2

Les contrÎleurs suivants, documentés dans le fichier source du noyau Documentation/admin-guide/cgroup-v2.rst (ou Documentation/cgroup-v2.txt dans Linux 4.17 et les versions antérieures) sont pris en charge dans cgroups version 2 :
cpu
(depuis Linux 4.15)

C’est le successeur des contrîleurs version 1 cpu et cpuacct .

cpuset (depuis Linux 5.0)

C’est le successeur du contrîleur version 1 cpuset .

freezer (depuis Linux 5.2)

C’est le successeur du contrîleur version 1 freezer .

hugetlb (depuis Linux 5.6)

C’est le successeur du contrîleur version 1 hugetlb .

io (depuis Linux 4.5)

C’est le successeur du contrîleur version 1 blkio .

memory (depuis Linux 4.5)

C’est le successeur du contrîleur version 1 memory .

perf_event (depuis Linux 4.11)

Identique au contrÎleur version 1 perf_event .

pids (depuis Linux 4.5)

Identique au contrÎleur version 1 pids .

rdma (depuis Linux 4.11)

Identique au contrÎleur version 1 rdma .

Il n’existe pas d’équivalent direct des contrĂŽleurs net_cls et net_prio de cgroups version 1. À la place, une prise en charge a Ă©tĂ© ajoutĂ©e Ă  iptables (8) pour permettre aux filtres eBPF qui s’attachent aux noms de chemin de cgroups version 2 de prendre des dĂ©cisions Ă  partir du trafic rĂ©seau selon le cgroup.

Les contrĂŽleurs version 2 devices ne fournissent pas de fichiers d’interface. À la place, le contrĂŽle de pĂ©riphĂ©rique est sĂ©curisĂ© en attachant un programme eBPF ( BPF_CGROUP_DEVICE ) Ă  un cgroup version 2.

ContrĂŽle de sous-arbres de cgroups version 2

Chaque cgroup dans une hiérarchie version 2 contient les deux fichiers suivants :
cgroup.controllers

Ce fichier en lecture seule contient une liste des contrĂŽleurs qui sont disponibles dans ce cgroup. Le contenu de ce fichier correspond au contenu du fichier cgroup.subtree_control dans le cgroup parent.

cgroup.subtree_control

Ce fichier contient une liste de contrĂŽleurs qui sont actifs ( permis ) dans le cgroup. L’ensemble des contrĂŽleurs dans ce fichier est un sous-ensemble de l’ensemble cgroup.controllers de ce cgroup. L’ensemble des contrĂŽleurs actifs est modifiĂ© en Ă©crivant des chaĂźnes dans ce fichier contenant des noms de contrĂŽleurs sĂ©parĂ©s par des espaces, chacun Ă©tant prĂ©cĂ©dĂ© par un « + » (pour autoriser le contrĂŽleur) ou un « - » (pour interdire le contrĂŽleur), comme dans l’exemple suivant :

echo '+pids -memory' > x/y/cgroup.subtree_control

Un essai pour autoriser un contrĂŽleur qui n’est pas prĂ©sent dans cgroup.controllers provoque une erreur ENOENT lors d’une Ă©criture dans le fichier cgroup.subtree_control .

Parce que la liste de contrĂŽleurs dans cgroup.subtree_control est un sous-ensemble de ces cgroup.controllers , un contrĂŽleur qui n’est plus autorisĂ© dans un cgroup de la hiĂ©rarchie ne peut jamais ĂȘtre rĂ©autorisĂ© dans un sous-arbre de ce cgroup.

Un fichier cgroup.subtree_control de cgroup dĂ©termine l’ensemble des contrĂŽleurs qui sont activĂ©s dans les cgroups enfants . Quand un contrĂŽleur (par exemple, pids ) est prĂ©sent dans le fichier cgroup.subtree_control d’un cgroup parent, les fichiers correspondants interface-contrĂŽleur (par exemple, pids.max ) sont automatiquement créés dans l’enfant de ce cgroup et peuvent ĂȘtre utilisĂ©s pour exercer le contrĂŽle des ressources dans les cgroups enfants.

RÚgle « pas de processus internes » pour cgroups version 2

Cgroups version 2 applique une rĂšgle appelĂ©e « pas de processus internes ». En gros, cette rĂšgle veut dire que, Ă  l’exception du cgroup racine, les processus ne peuvent rĂ©sider que dans les nƓuds feuilles (des cgroups ne contenant pas eux-mĂȘmes de cgroup enfant). Cela Ă©vite d’avoir Ă  dĂ©cider comment partager les ressources entre les processus qui sont membres du cgroup A et les processus dans des cgroups enfants de A.

Par exemple, si le cgroup /cg1/cg2 existe, un processus peut rĂ©sider dans /cg1/cg2 , mais pas dans /cg1 . Cela permet d’éviter une ambiguĂŻtĂ© dans cgroups version 1 par rapport Ă  la dĂ©lĂ©gation de ressources entre les processus dans /cg1 et les cgroups enfants. L’approche recommandĂ©e dans cgroups version 2 consiste Ă  crĂ©er un sous-rĂ©pertoire appelĂ© feuille pour n’importe quel cgroup non feuille qui contiendrait des processus mais pas de cgroup enfant. Ainsi, les processus qui auparavant seraient allĂ©s dans /cg1 iraient maintenant dans /cg1/feuille . Cela a l’avantage de rendre explicite la relation entre les processus dans /cg1/feuille et les autres enfants de /cg1 .

La rĂšgle « pas de processus internes » est en fait plus subtile que ce qui est dĂ©crit ci-dessus. Plus prĂ©cisĂ©ment, la rĂšgle stipule qu’un cgroup (non racine) ne peut pas Ă  la fois avoir des processus membres et distribuer des ressources aux cgroups enfants — c’est-Ă -dire avoir un fichier cgroup.subtree_control non vide. Par consĂ©quent, il est possible pour un cgroup d’avoir Ă  la fois des processus membres et des cgroups enfants, mais pour que les contrĂŽleurs puissent ĂȘtre autorisĂ©s pour ce cgroup, les processus membres doivent ĂȘtre dĂ©placĂ©s en dehors du cgroup (par exemple, dans les cgroups enfants).

Avec l’addition dans Linux 4.14 du « mode thread » (dĂ©crit ci-aprĂšs), la rĂšgle « pas de processus internes » a Ă©tĂ© assouplie dans certains cas.

Fichier cgroup.events de cgroups version 2

Chaque cgroup non racine dans la hiĂ©rarchie version 2 contient un fichier en lecture seule, cgroup.events , dont le contenu consiste en paires clĂ©-valeur (dĂ©limitĂ©es par des caractĂšres de nouvelle ligne, avec les clĂ©s et valeurs sĂ©parĂ©es par des espaces) fournissant des informations d’état sur le cgroup :

$ cat mygrp/cgroup.events
populated 1
frozen 0

Les clés suivantes peuvent apparaßtre dans ce fichier :
populated

La valeur de cette clĂ© est soit 1 si ce cgroup ou n’importe lequel de ses descendants a des processus membres, soit 0 dans le cas contraire.

frozen (depuis Linux 5.2)

La valeur de cette clĂ© est 1 si ce cgroup est actuellement gelĂ© ou 0 s’il ne l’est pas.

Le fichier cgroup.events peut ĂȘtre surveillĂ© dans le but de recevoir des notifications quand la valeur d’une des clĂ©s change. Cette surveillance peut ĂȘtre rĂ©alisĂ©e en utilisant inotify (7), qui notifie les changements tels que les Ă©vĂšnements IN_MODIFY ou poll (2) qui notifie les changements en renvoyant les bits POLLPRI et POLLERR dans le champ revents .

Notification de libération de cgroups version 2

Les cgroups version 2 fournissent un nouveau mĂ©canisme pour recevoir des notifications lorsqu’un cgroup devient vide. Les fichiers cgroups version 1 release_agent et notify_on_release sont supprimĂ©s et remplacĂ©s par la clĂ© populated dans le fichier cgroup.events . Cette clĂ© a soit la valeur 0, signifiant que le cgroup (et ses descendants) ne contient aucun processus membre (non zombie), ou 1, signifiant que le cgroup (ou un de ses descendants) contient des processus membres.

Le mécanisme de notification de libération de cgroups version 2 offre les avantages suivants par rapport au mécanisme release_agent de cgroups version 1 :

-

IL permet une notification moins coĂ»teuse puisqu’un seul processus peut contrĂŽler plusieurs fichiers cgroup.events (en utilisant les techniques dĂ©crites prĂ©cĂ©demment). En revanche, le mĂ©canisme de cgroups version 1 requiert la charge de crĂ©er un processus pour chaque notification.

-

Les notifications pour des sous-hiĂ©rarchies diffĂ©rentes de cgroup peuvent ĂȘtre dĂ©lĂ©guĂ©es Ă  des processus diffĂ©rents. En revanche, le mĂ©canisme de cgroups version 1 permet seulement un agent de notification pour la hiĂ©rarchie complĂšte.

Fichier cgroup.stat de cgroups version 2

Chaque cgroup d’une hiĂ©rarchie version 2 contient un fichier cgroup.stat en lecture seule (introduit en premier dans Linux 4.14) qui consiste en lignes contenant des paires clĂ©-valeur. Les clĂ©s suivantes apparaissent actuellement dans ce fichier :
nr_descendants

C’est le nombre total de cgroups descendants visibles (c’est-à-dire en vivants) en dessous de ce cgroup.

nr_dying_descendants

C’est le nombre de cgroups descendants mourants en dessous de ce cgroup. Un cgroup devient mourant aprĂšs avoir Ă©tĂ© supprimĂ©. Il reste dans cet Ă©tat pour une pĂ©riode indĂ©finie (qui dĂ©pend de la charge du systĂšme) pendant que les ressources sont libĂ©rĂ©es avant que le cgroup soit dĂ©truit. Remarquez que la prĂ©sence de quelques cgroups dans l’état mourant est normal et n’indique pas un quelconque problĂšme.

Un processus ne peut devenir membre d’un cgroup mourant et celui-ci ne peut redevenir actif.

Limitation du nombre de cgroups descendants

Chaque cgroup dans une hiĂ©rarchie version 2 contient les fichiers suivants qui peuvent ĂȘtre utilisĂ©s pour afficher et dĂ©finir les limites du nombre de cgroups descendants dans ce cgroup :
cgroup.max.depth
(depuis Linux 4.14)

Ce fichier dĂ©finit une limite sur le niveau d’imbrication de cgroups descendants. Une valeur de 0 dans ce fichier signifie qu’aucun cgroup descendant ne peut ĂȘtre créé. Un essai de crĂ©ation dont le niveau d’imbrication excĂšde la limite Ă©chouera ( mkdir (2) Ă©choue avec l’erreur EAGAIN ).

Écrire la chaĂźne "max" dans ce fichier signifie qu’aucune limite n’est imposĂ©e. La valeur par dĂ©faut dans ce fichier est "max" .

cgroup.max.descendants (depuis Linux 4.14)

Ce fichier dĂ©finit une limite du nombre de cgroups descendants actifs que ce cgroup peut possĂ©der. Un essai de crĂ©er plus de descendants qu’autorisĂ©s par la limite Ă©choue ( mkdir (2) Ă©choue avec l’erreur EAGAIN ).

Écrire la chaĂźne "max" dans ce fichier signifie qu’aucune limite n’est imposĂ©e. La valeur par dĂ©faut dans ce fichier est "max" .

DÉLÉGATION DE CGROUPS À UN UTILISATEUR AVEC DES PRIVILÈGES MOINDRES

Dans le contexte de cgroups, dĂ©lĂ©guer signifie transmettre la gestion d’un sous-arbre de la hiĂ©rarchie de cgroup Ă  un utilisateur non privilĂ©giĂ©. Cgroups version 1 fournit une prise en charge de la dĂ©lĂ©gation basĂ©e sur les permissions de fichier dans la hiĂ©rarchie de cgroup, mais avec des rĂšgles de confinement moins strictes que dans la version 2 (comme signalĂ© ci-dessous). Cgroups version 2 gĂšre la dĂ©lĂ©gation avec confinement selon un modĂšle explicite. L’explication dans cette section se concentre sur la dĂ©lĂ©gation dans cgroups version 2, avec quelques diffĂ©rences pour cgroups version 1 signalĂ©es au fur et Ă  mesure.

Un peu de terminologie est nĂ©cessaire pour expliquer la dĂ©lĂ©gation. Un dĂ©lĂ©gant est un utilisateur privilĂ©giĂ© (c’est-Ă -dire le superutilisateur) qui possĂšde un cgroup parent. Un dĂ©lĂ©guĂ© est un utilisateur non privilĂ©giĂ© Ă  qui sont accordĂ©es les permissions nĂ©cessaires pour gĂ©rer une sous-hiĂ©rarchie sous le cgroup parent, connue comme le sous-arbre dĂ©lĂ©guĂ© .

Pour rĂ©aliser la dĂ©lĂ©gation, le dĂ©lĂ©gant autorise l’écriture par le dĂ©lĂ©guĂ© sur certains rĂ©pertoires et fichiers, typiquement en transfĂ©rant la propriĂ©tĂ© des objets Ă  l’ID utilisateur du dĂ©lĂ©guĂ©. En supposant une dĂ©lĂ©gation de hiĂ©rarchie de racine (par exemple) /dlgt_grp et qu’il n’y a pas encore de cgroup enfant sous ce cgroup, la propriĂ©tĂ© de ce qui suit est transfĂ©rĂ©e Ă  l’ID utilisateur du dĂ©lĂ©gué :
/dlgt_grp

Modifier le propriĂ©taire de la racine d’un sous-arbre signifie que n’importe quel cgroup nouvellement créé dans ce sous-arbre (et les fichiers qu’il contient) sera aussi la propriĂ©tĂ© du dĂ©lĂ©guĂ©.

/dlgt_grp/cgroup.procs

Modifier le propriétaire de ce fichier signifie que le délégué peut déplacer les processus dans la racine du sous-arbre délégué.

/dlgt_grp/cgroup.subtree_control (cgroups version 2 seulement)

Modifier le propriĂ©taire de ce fichier signifie que le dĂ©lĂ©guĂ© peut activer des contrĂŽleurs (qui sont prĂ©sents dans /dlgt_grp/cgroup.controllers ) dans le but d’une redistribution postĂ©rieure des ressources Ă  des niveaux infĂ©rieurs du sous-arbre. Comme alternative au changement de propriĂ©taire de ce fichier, le dĂ©lĂ©gant pourrait Ă  la place ajouter les contrĂŽleurs sĂ©lectionnĂ©s dans ce fichier.

/dlgt_grp/cgroup.threads (cgroups version 2 seulement)

Modifier le propriĂ©taire de ce fichier est nĂ©cessaire si un sous-arbre threaded est sous le coup d’une dĂ©lĂ©gation (consultez la description du « mode thread » ci-dessous). Cela permet au dĂ©lĂ©guĂ© d’écrire des ID de thread dans ce fichier. Le propriĂ©taire de ce fichier peut ĂȘtre aussi changĂ© lors de la dĂ©lĂ©gation d’un sous-arbre de domaine, mais actuellement cela ne sert Ă  rien puisque, comme dĂ©crit ci-dessous, il n’est pas possible de dĂ©placer un thread entre des cgroups de domaine en inscrivant son ID de thread dans le fichier cgroup.threads .

Pour les cgroups version 1, le fichier correspondant qui doit ĂȘtre dĂ©lĂ©guĂ© est le fichier tasks .

Le dĂ©lĂ©gant ne doit pas changer le propriĂ©taire de n’importe quel fichier d’interface de contrĂŽleur (par exemple, pids.max , memory.high ) dans dlgt_grp . Ces fichiers sont utilisĂ©s au niveau juste au-dessus du sous-arbre dĂ©lĂ©guĂ© dans le but de distribuer les ressources dans le sous-arbre, et le dĂ©lĂ©gant ne doit pas avoir la permission de modifier les ressources qui sont distribuĂ©es dans le sous-arbre dĂ©lĂ©guĂ©.

Consultez aussi l’explication dans le fichier /sys/kernel/cgroup/delegate dans NOTES pour des informations sur les autres fichiers dĂ©lĂ©gables dans cgroups version 2.

AprĂšs que les Ă©tapes prĂ©citĂ©es aient Ă©tĂ© rĂ©alisĂ©es, le dĂ©lĂ©guĂ© peut crĂ©er des cgroups enfants dans le sous-arbre dĂ©lĂ©guĂ© (les sous-rĂ©pertoires et les fichiers de cgroup qu’ils contiennent seront la propriĂ©tĂ© du dĂ©lĂ©guĂ©) et dĂ©placer des processus entre des cgroups dans le sous-arbre. Si quelques contrĂŽleurs sont prĂ©sents dans dlgt_grp/cgroup.subtree_control , ou si la propriĂ©tĂ© de ce fichier a Ă©tĂ© transfĂ©rĂ©e au dĂ©lĂ©guĂ©, celui-ci peut aussi contrĂŽler une prochaine redistribution des ressources correspondantes dans le sous-arbre dĂ©lĂ©guĂ©.

Délégation de cgroups version 2 : nsdelegate et espace de noms cgroup

Depuis Linux 4.13, une seconde maniĂšre existe pour rĂ©aliser une dĂ©lĂ©gation de cgroup dans une hiĂ©rarchie de cgroups version 2. Cela est fait en montant ou remontant le systĂšme de fichiers de cgroups version 2 avec l’option de montage nsdelegate . Par exemple, si un systĂšme de fichiers de cgroups version 2 a dĂ©jĂ  Ă©tĂ© montĂ©, il est possible de le remonter avec l’option nsdelegate comme suit :

mount -t cgroup2 -o remount,nsdelegate \
none /sys/fs/cgroup/unified

L’effet de cette option de montage est que l’espace de noms cgroup deviennent automatiquement les limites de dĂ©lĂ©gation. Plus particuliĂšrement, les restrictions suivantes s’appliquent pour les processus Ă  l’intĂ©rieur de l’espace de noms cgroup :

-

Inscrire les fichiers des interfaces de contrĂŽleur dans le rĂ©pertoire racine de l’espace de noms Ă©chouera avec l’erreur EPERM . Les processus Ă  l’intĂ©rieur de l’espace de noms cgroup peuvent toujours Ă©crire dans les fichiers dĂ©lĂ©gables dans le rĂ©pertoire racine de l’espace de noms cgroup tels que cgroup.procs et cgroup.subtree_control , et peuvent crĂ©er des sous-hiĂ©rarchies au-dessous du rĂ©pertoire racine.

-

Les essais de migrer des processus Ă  travers des limites d’espace de noms sont interdits (avec l’erreur ENOENT ). Les processus Ă  l’intĂ©rieur d’un espace de noms cgroup peuvent toujours (soumis aux rĂšgles de confinement dĂ©crites ci-aprĂšs) dĂ©placer des processus entre cgroups Ă  l’intĂ©rieur de la sous-hiĂ©rarchie sous l’espace de noms racine.

La possibilitĂ© de dĂ©finir des espaces de noms cgroup comme des limites de dĂ©lĂ©gation rend les espaces de noms cgroup beaucoup plus utiles. Pour en comprendre la raison, supposons qu’il existe dĂ©jĂ  une hiĂ©rarchie de cgroup qui a Ă©tĂ© dĂ©lĂ©guĂ©e Ă  un utilisateur non privilĂ©giĂ©, cecilia , en utilisant la technique ancienne de dĂ©lĂ©gation dĂ©crite ci-dessus. Supposons que plus tard cecilia veuille dĂ©lĂ©guer une sous-hiĂ©rarchie sous la hiĂ©rarchie dĂ©lĂ©guĂ©e existante (par exemple, la hiĂ©rarchie dĂ©lĂ©guĂ©e peut ĂȘtre associĂ©e avec un conteneur non privilĂ©giĂ© exĂ©cutĂ© par cecilia ). MĂȘme si un espace de noms cgroup Ă©tait employĂ©, parce que les deux hiĂ©rarchies sont la propriĂ©tĂ© de l’utilisateur cecilia non privilĂ©giĂ©, les actions illĂ©gitimes suivantes pourraient ĂȘtre rĂ©alisĂ©es :

-

Un processus dans la hiérarchie inférieure pourrait modifier les réglages du contrÎleur de ressources dans le répertoire racine de cette hiérarchie (ces réglages sont conçus pour permettre le contrÎle à exercer à partir du cgroup parent ; un processus dans le cgroup enfant ne devrait pas pouvoir les modifier) ;

-

un processus Ă  l’intĂ©rieur de hiĂ©rarchie subalterne pourrait dĂ©placer des processus dans ou en dehors de la hiĂ©rarchie infĂ©rieure si les cgroups dans la hiĂ©rarchie supĂ©rieure Ă©taient de quelque façon visibles.

L’utilisation de l’option de montage nsdelegate empĂȘche les deux possibilitĂ©s.

L’option de montage nsdelegate a seulement un effet lorsque elle est utilisĂ©e dans l’espace de noms initial montage, dans d’autres espaces de noms montage cette option est ignorĂ©e silencieusement.

Remarque : sur certains systĂšmes, systemd (1) monte automatiquement le systĂšme de fichiers de cgroup version 2. Dans le but de tester l’opĂ©ration nsdelegate , il peut ĂȘtre utile d’amorcer le noyau avec les options de ligne de commande suivantes :

cgroup_no_v1=all systemd.legacy_systemd_cgroup_controller

Ces options font que le noyau amorce avec les contrĂŽleurs cgroups version 1 dĂ©sactivĂ©s (signifiant que les contrĂŽleurs sont disponibles dans une hiĂ©rarchie version 2) et indique Ă  systemd (1) de ne pas monter et utiliser la hiĂ©rarchie de cgroup version 2, de façon que la hiĂ©rarchie version 2 puisse ĂȘtre montĂ©e manuellement avec les options dĂ©sirĂ©es aprĂšs l’amorçage.

RÚgles de confinement de délégation de cgroup

Certaines rĂšgles de confinement de dĂ©lĂ©gation assurent que le dĂ©lĂ©guĂ© peut dĂ©placer des processus entre des cgroups Ă  l’intĂ©rieur du sous-arbre dĂ©lĂ©guĂ©, mais ne puisse pas dĂ©placer les processus de l’extĂ©rieur du sous-arbre dĂ©lĂ©guĂ© dans le sous-arbre ou vice versa. Un processus non privilĂ©giĂ© (c’est-Ă -dire le dĂ©lĂ©guĂ©) peut Ă©crire le PID d’un processus « cible » dans un fichier cgroup.procs seulement si toutes les conditions suivantes sont remplies :

-

l’écrivain a la permission d’écriture dans le fichier cgroup.procs du cgroup de destination ;

-

l’écrivain a la permission d’écrire dans le fichier cgroup.procs dans le plus proche ancĂȘtre commun des cgroups source et de destination. Remarquez que dans certains cas, ce plus proche ancĂȘtre commun peut ĂȘtre le cgroup source ou celui de destination eux-mĂȘmes. Ce besoin n’est pas imposĂ© pour les hiĂ©rarchies version 1, avec pour consĂ©quence que le confinement dans la version 1 est moins strict que dans la version 2 (par exemple, dans cgroups version 1 l’utilisateur possĂ©dant deux sous-hiĂ©rarchies dĂ©lĂ©guĂ©es distinctes peut dĂ©placer un processus entre les hiĂ©rarchies) ;

-

si le systĂšme de fichiers d’un cgroup version 2 a Ă©tĂ© montĂ© avec l’option nsdelegate , l’écrivain doit ĂȘtre capable de voir les cgroups source et destination Ă  partir de son espace de noms cgroup ;

-

Dans cgroups version 1, l’UID effectif de l’écrivain (c’est-Ă -dire le dĂ©lĂ©guĂ©) correspond Ă  l’ID rĂ©el utilisateur ou au set-user-ID enregistrĂ© du processus cible. Avant Linux 4.11, cette exigence s’appliquait aussi dans cgroups version 2 (c’était une exigence historique hĂ©ritĂ©e de cgroups version 1 qui a Ă©tĂ© plus tard estimĂ©e non nĂ©cessaire, puisque les autres rĂšgles suffisent pour le confinement dans cgroups version 2).

Remarque : une consĂ©quence des ces rĂšgles de confinement de dĂ©lĂ©gation est que le dĂ©lĂ©guĂ© non privilĂ©giĂ© ne peut placer le premier processus dans le sous-arbre dĂ©lĂ©guĂ©. À la place, le dĂ©lĂ©gant doit placer le premier processus (un processus possĂ©dĂ© par le dĂ©lĂ©guĂ©) dans le sous-arbre dĂ©lĂ©guĂ©.

MODE THREAD DE CGROUPS VERSION 2

Parmi les restrictions imposĂ©es par cgroups version 2 qui n’étaient pas prĂ©sentes dans cgroups version 1 :

-

pas contrĂŽle de granularitĂ© au niveau thread : tous les threads d’un processus doivent ĂȘtre dans le mĂȘme cgroup ;

-

pas de processus internes : un cgroup ne peut à la fois avoir des processus membres et mettre en Ɠuvre des contrîleurs sur des cgroups enfants.

Ces deux restrictions ont Ă©tĂ© ajoutĂ©es parce que l’absence de ces restrictions a causĂ© des problĂšmes dans cgroups version 1. En particulier, la possibilitĂ© de cgroups version 1 de permettre une granularitĂ© au niveau threads pour l’appartenance Ă  un cgroup n’avait aucun sens pour certains contrĂŽleurs. Un exemple notable Ă©tait le contrĂŽleur memory : puisque les threads partagent un espace d’adressage, cela n’avait aucun sens de rĂ©partir les threads Ă  travers des cgroups memory diffĂ©rents.

MalgrĂ© le fait de la dĂ©cision initiale de conception de cgroups version 2, des cas d’utilisation existaient pour certains contrĂŽleurs, notablement le contrĂŽleur cpu , pour lesquels la granularitĂ© au niveau thread du contrĂŽle Ă©tait justifiĂ©e et utile. Pour tenir compte de tels cas, Linux 4.14 a ajoutĂ© le mode thread pour cgroups version 2.

Le mode thread permet les choses suivantes :

-

la crĂ©ation de sous-arbres threaded dans lesquels les threads d’un processus peuvent ĂȘtre rĂ©partis Ă  travers des cgroups Ă  l’intĂ©rieur de l’arbre (un sous-arbre threaded peut contenir plusieurs processus multithreads) ;

-

le concept de contrÎleurs threaded qui peuvent distribuer des ressources à travers les cgroups dans un sous-arbre threaded ;

-

un relĂąchement de la rĂšgle « pas de processus internes », de façon Ă  ce que, Ă  l’intĂ©rieur d’un sous-arbre threaded, un cgroup puisse Ă  la fois avoir des processus membres et mettre en Ɠuvre des contrĂŽleurs de ressources de cgroups enfants.

Avec l’ajout du mode thread, chaque cgroup non racine contient dĂ©sormais un nouveau fichier, cgroup.type , qui expose, et dans certaines circonstances qui peut ĂȘtre utilisĂ© pour modifier, le « type » d’un cgroup. Ce fichier contient une des valeurs de type suivantes :

domain

C’est un cgroup version 2 normal fournissant un contrĂŽle de niveau de granularitĂ© processus. Si un processus est membre de ce cgroup, alors tous les threads de ce processus sont (par dĂ©finition) dans le mĂȘme cgroup. C’est le type par dĂ©faut de cgroup et il fournit le mĂȘme comportement qui Ă©tait fourni pour les cgroups dans l’implĂ©mentation initiale de cgroups version 2.

threaded

Ce cgroup est un membre d’un sous-arbre threaded. Des threads peuvent ĂȘtre ajoutĂ©s Ă  ce cgroup et des contrĂŽleurs peuvent ĂȘtre activĂ©s pour le cgroup.

domain threaded

C’est un cgroup domain qui sert de racine Ă  un sous-arbre threaded. Ce type de cgroup est aussi connu comme « threaded root ».

domain invalid

C’est un cgroup Ă  l’intĂ©rieur d’un sous-arbre threaded qui est dans un Ă©tat « invalid ». Un processus ne peut ĂȘtre ajoutĂ© au cgroup et un contrĂŽleur ne peut ĂȘtre activĂ© pour le cgroup. La seule chose qui puisse ĂȘtre faite avec ce cgroup (Ă  part le supprimer) est de le convertir en cgroup threaded en inscrivant la chaine « threaded » dans le fichier cgroup.type .

La raison de l’existence de ce type « transitoire » lors de la crĂ©ation d’un sous-arbre threaded (plutĂŽt que le noyau ne convertisse simplement immĂ©diatement tous les cgroups sous la racine threaded au type threaded ) est de permettre des extensions futures au modĂšle de mode thread.

Threaded versus contrĂŽleurs de domaine

Avec l’ajout du mode threads, cgroups version 2 distingue dĂ©sormais deux types de contrĂŽleurs de ressource :

-

contrĂŽleurs Threaded : ces contrĂŽleurs gĂšrent la granularitĂ© au niveau thread pour le contrĂŽle des ressources et peuvent ĂȘtre activĂ©s Ă  l’intĂ©rieur de sous-arbres threaded avec pour rĂ©sultat que les fichiers de l’interface de contrĂŽleur correspondants apparaissent dans les cgroups du sous-arbre threaded. Depuis Linux 4.19, les contrĂŽleurs suivants sont threaded : cpu , perf_event , et pids ;

-

contrĂŽleurs Domain : ces contrĂŽleurs gĂšrent seulement une granularitĂ© au niveau processus pour le contrĂŽle de ressource. Du point de vue contrĂŽleur de domaine, tous les threads d’un processus sont toujours dans le mĂȘme cgroup. Les contrĂŽleurs de domaine ne peuvent ĂȘtre activĂ©s Ă  l’intĂ©rieur d’un sous-arbre threaded.

CrĂ©ation d’un sous-arbre threaded

Il existe deux maniÚres qui conduisent à la création de sous-arbre threaded. La premiÚre maniÚre fonctionne comme ceci :

(1)

Nous Ă©crivons La chaine « threaded » dans le fichier cgroup.type d’un cgroup y/z ayant actuellement le type domain . Cela a les effets suivants :

-

le type du cgroup y/z devient threaded ;

-

le type du cgroup parent, y , devient domain threaded . Le cgroup parent est la racine d’un sous-arbre threaded (aussi connu comme « threaded root » – racine threaded) ;

-

Tous les autres cgroups sous y qui n’étaient pas dĂ©jĂ  de type threaded (parce qu’ils Ă©taient dĂ©jĂ  dans des sous-arbres threaded existants sous la nouvelle racine root threaded) sont convertis au type domain invalid . Tout cgroup créé aprĂšs sous y aura aussi le type domain invalid .

(2)

Nous écrivons La chaine « threaded » pour chacun des cgroups domain invalid sous y , dans le but de les convertir au type threaded . Comme conséquence de cette étape, tous les threads sous la racine threaded ont désormais le type threaded et le sous-arbre threaded est désormais pleinement utilisable. Les conditions nécessaires pour écrire « threaded » pour chacun de ces cgroups sont quelque peu laborieuses, mais permettent de futures extensions au modÚle de mode thread.

La second maniÚre de créer un sous-arbre threaded est la suivante :

(1)

Dans un cgroup existant, z , qui actuellement a le type domain , nous (1.1) activons un ou plusieurs contrĂŽleurs threaded et (1.2) faisons d’un processus un membre de z (ces deux Ă©tapes pouvant ĂȘtre rĂ©alisĂ©es dans n’importe quel ordre). Cela a les consĂ©quences suivantes :

-

le type de z devient domain threaded ;

-

tous les cgroups descendants de z qui n’étaient dĂ©jĂ  de type threaded sont convertis au type domain invalid .

(2)

Comme auparavant, nous rendons le sous-arbre threaded utilisable en écrivant la chaine « threaded » pour chacun des cgroups domain invalid sous z , dans le but de les convertir au type threaded .

Une des consĂ©quences des maniĂšres ci-dessus de crĂ©er un sous-arbre threaded est qu’un cgroup de racine threaded peut ĂȘtre un parent pour seulement des cgroups threaded (et domain invalid ). Le cgroup racine threaded ne peut pas ĂȘtre un parent d’un cgroup domain et un cgroup threaded ne peut avoir de frĂšre qui soit un cgroup domain .

Utilisation de sous-arbre threaded

À l’intĂ©rieur d’un sous-arbre threaded, des contrĂŽleurs threaded peuvent ĂȘtre activĂ©s dans chaque sous-groupe dont le type a Ă©tĂ© changĂ© Ă  threaded . Ce faisant, les fichiers de l’interface de contrĂŽleur correspondants apparaissent dans l’enfant de ce cgroup.

Un processus peut ĂȘtre dĂ©placĂ© dans un sous-arbre threaded en Ă©crivant son PID dans le fichier cgroup.procs dans un des cgroups de l’arbre. Cela a pour effet de rendre tous les threads du processus membres du cgroup correspondant et de faire du processus un membre du sous-arbre threaded. Les threads du processus peuvent ĂȘtre rĂ©partis Ă  travers le sous-arbre threaded en Ă©crivant leurs ID de thread (voir gettid (2)) dans les fichiers cgroup.threads dans diffĂ©rents cgroups Ă  l’intĂ©rieur du sous-arbre. Les threads d’un processus doivent tous rĂ©sider dans le mĂȘme sous-arbre threaded.

Comme pour l’écriture dans cgroup.procs , quelques rĂšgles de confinement s’appliquent pour l’écriture dans le fichier cgroup.threads :

-

l’écrivain doit avoir la permission d’écriture dans le fichier cgroup.threads dans le cgroup de destination ;

-

l’écrivain doit avoir la permission d’écriture dans le fichier cgroup.procs dans l’ancĂȘtre commun des cgroups source et destination (dans certains cas, cet ancĂȘtre peut ĂȘtre le cgroup source ou destination eux-mĂȘmes) ;

-

les cgroups source et destination doivent ĂȘtre dans le mĂȘme sous-arbre threaded (en dehors d’un sous-arbre threaded, un essai de dĂ©placer un thread en Ă©crivant son ID de thread dans le fichier cgroup.threads dans un cgroup domain diffĂ©rent Ă©choue avec l’erreur EOPNOTSUPP ).

Le fichier cgroup.threads est prĂ©sent dans chaque cgroup (incluant les cgroups domain ) et peut ĂȘtre lu pour dĂ©couvrir l’ensemble de threads prĂ©sents dans le cgroup. L’ensemble d’ID de threads obtenu lors de la lecture de ce fichier n’est pas garanti d’ĂȘtre ordonnĂ© ou ne pas avoir de doublons.

Le fichier cgroup.procs dans la racine threaded affiche le PID de tous les processus membres du sous-arbre threaded. Les fichiers cgroup.procs dans les autres cgroups du sous-arbre ne sont pas lisibles.

Les contrĂŽleurs de domaine ne peuvent ĂȘtre activĂ©s dans un sous-arbre threaded. Aucun fichier d’interface de contrĂŽleur n’apparait dans les cgroups sous la racine threaded. Du point de vue du contrĂŽleur de domaine, les sous-arbres threaded sont invisibles : un processus multithreaded Ă  l’intĂ©rieur d’un sous-arbre threaded apparait pour un contrĂŽleur de domaine comme un processus qui rĂ©side dans le cgroup racine threaded.

Dans un sous-arbre threaded, la rĂšgle « pas de processus internes » ne s’applique pas : un cgroup peut contenir des processus membres (ou des threads) et utiliser des contrĂŽleurs sur des cgroups enfants.

RÚgles pour écrire dans cgroup.type et créer des sous-arbres threaded

Un certain nombre de rĂšgles s’appliquent lors de l’écriture dans le fichier cgroup.type :

-

seule la chaine « threaded » peut ĂȘtre Ă©crite. En d’autres mots, la seule transition explicite possible est de convertir un cgroup domain au type threaded ;

-

l’effet d’écrire « threaded » dĂ©pend de la valeur en cours dans cgroup.type , comme suit :

-

domain ou domain threaded : dĂ©but de la crĂ©ation d’un sous-arbre threaded (dont la racine est le parent de ce cgroup) Ă  l’aide de la premiĂšre des maniĂšres dĂ©crites ci-dessus,

-

domain invalid : conversion de ce cgroup (qui est Ă  l’intĂ©rieur d’un sous-arbre threaded) pour ĂȘtre dans un Ă©tat utilisable (c’est-Ă -dire threaded ),

-

threaded : aucun effet (une « no-op ») ;

-

il n’est pas possible d’écrire dans un fichier cgroup.type si le type du parent est domain invalid . En d’autres mots, les cgroups d’un sous-arbre threaded doivent ĂȘtre convertis dans l’état threaded d’une maniĂšre descendante.

Quelques contraintes doivent aussi ĂȘtre satisfaites pour crĂ©er un sous-arbre threaded dont la racine est le cgroup x :

-

il ne peut exister de processus membres dans les cgroups descendants de x (le cgroup_ x peut lui avoir des processus membres) ;

-

aucun contrĂŽleur de domaine ne peut ĂȘtre activĂ© dans le fichier cgroup.subtree_control de x .

Si n’importe laquelle des contraintes ci-dessus n’est pas satisfaite, alors un essai d’écrire « threaded » dans un fichier cgroup.type Ă©chouera avec l’erreur ENOTSUP .

Le type « domain threaded » de cgroup

Selon les chemins dĂ©crits ci-dessus, le type d’un cgroup peut changer Ă  domain threaded dans chacun des cas suivants :

-

la chaine « threaded » est écrite pour un cgroup enfant ;

-

un contrÎleur threaded est activé dans le cgroup et un processus est fait membre du cgroup.

Un cgroup domain threaded , x , peut redevenir du type domain si les conditions ci-dessus ne sont plus vraies, c’est-Ă -dire si tous les cgroups enfants threaded de x ont Ă©tĂ© supprimĂ©s et si x n’a plus de contrĂŽleurs threaded activĂ©s ou n’a plus de processus membres.

Quand un cgroup domain threaded x redevient du type domain :

-

tous les descendants domain invalid de x qui ne sont pas dans des sous-arbres threaded de bas niveau redeviennent du type domain ;

-

les cgroups racines dans n’importe quels sous-arbres threaded de bas niveau redeviennent de type domain threaded .

Exceptions pour le cgroup racine

Le cgroup racine de la hiĂ©rarchie version 2 est traitĂ© exceptionnellement : il peut ĂȘtre le parent Ă  la fois de cgroups domain et threaded . Si la chaine « threaded » est Ă©crite dans le fichier cgroup.type d’un des enfants du cgroup racine, alors :

-

le type de ce cgroup devient threaded ;

-

le type de tous les descendants de ce cgroup qui ne fait pas partie de sous-arbres threaded de bas niveau change Ă  domain invalid .

Remarquez que dans ce cas, il n’y a pas de cgroup qui deviennent domain threaded (thĂ©oriquement, le cgroup racine peut ĂȘtre considĂ©rĂ© comme la racine threaded pour le cgroup dont le type a Ă©tĂ© changĂ© Ă  threaded ).

Le but de ce traitement exceptionnel pour le cgroup racine est de permettre Ă  un cgroup threaded qui emploie le contrĂŽleur cpu d’ĂȘtre placĂ© aussi haut que possible dans la hiĂ©rarchie, de façon Ă  minimiser le (faible) coĂ»t de parcourir la hiĂ©rarchie de cgroup.

Le contrÎleur « cpu » de cgroups version 2 et les threads en temps réel

Depuis Linux 4.19, le contrĂŽleur cpu de cgroups version 2 ne prend pas en charge le contrĂŽle des threads en temps rĂ©el (particuliĂšrement les threads ordonnancĂ©s sous les politiques SCHED_FIFO , SCHED_RR , SCHED_DEADLINE ; voir sched (7)). Par consĂ©quent, le contrĂŽleur cpu ne peut ĂȘtre activĂ© dans le cgroup racine seulement si tous les threads en temps rĂ©el sont dans le cgroup racine (si des threads en temps rĂ©el sont dans des cgroups non racines, alors une Ă©criture write (2) de la chaine « +cpu » dans le fichier cgroup.subtree_control Ă©choue avec l’erreur EINVAL ).

Dans certains systĂšmes, systemd (1) place certains threads en temps rĂ©el dans des cgroups non racines dans la hiĂ©rarchie version 2. Pour de tels systĂšmes, ces threads doivent d’abord ĂȘtre dĂ©placĂ©s dans le cgroup racine avant que le contrĂŽleur cpu ne soit activĂ©.

ERREURS

Les erreurs suivantes peuvent survenir pour mount (2) :

EBUSY

Un essai de monter un systĂšme de fichiers cgroup version 1 n’indiquait ni l’option name= (pour monter une hiĂ©rarchie nommĂ©e) ni un nom de contrĂŽleur (ou all ).

NOTES

Un processus enfant créé Ă  l’aide de fork (2) hĂ©rite des appartenances de cgroup de son parent. Les appartenances de cgroup de processus sont prĂ©servĂ©es Ă  travers execve (2).

Le drapeau CLONE_INTO_CGROUP de clone3 (2) peut ĂȘtre utilisĂ© pour crĂ©er un processus enfant qui dĂ©bute son existence dans un cgroup version 2 diffĂ©rent du processus parent.

Fichiers /proc

/proc/cgroups (depuis Linux 2.6.24)

Ce fichier contient des informations sur les contrÎleurs qui sont compilés dans le noyau. Un exemple du contenu de ce fichier (reformaté pour une meilleure lisibilité) est ce qui suit :

#subsys_name hierarchy num_cgroups enabled
cpuset 4 1 1
cpu 8 1 1
cpuacct 8 1 1
blkio 6 1 1
memory 3 1 1
devices 10 84 1
freezer 7 1 1
net_cls 9 1 1
perf_event 5 1 1
net_prio 9 1 1
hugetlb 0 1 0
pids 2 1 1

Les champs dans ce fichier sont de gauche à droite :

[1]

Le nom du contrĂŽleur.

[2]

L’ID unique de la hiĂ©rarchie de cgroup pour laquelle le contrĂŽleur est montĂ©. Si plusieurs contrĂŽleurs de cgroups version 1 sont liĂ©s Ă  la mĂȘme hiĂ©rarchie, chacun d’entre eux affichera le mĂȘme ID de hiĂ©rarchie dans ce champ. La valeur dans ce champ sera zĂ©ro si :

-

le contrĂŽleur n’est pas montĂ© pour une hiĂ©rarchie de cgroups version 1 ;

-

le contrÎleur est lié à la seule hiérarchie unifiée de cgroups version 2 ;

-

le contrÎleur est désactivé (voir ci-dessous).

[3]

Le nombre de groupes de contrÎle dans cette hiérarchie utilisant ce contrÎleur.

[4]

Ce champ contient la valeur 1 si le contrĂŽleur est activĂ© ou zĂ©ro s’il a Ă©tĂ© dĂ©sactivĂ© (Ă  l’aide du paramĂštre cgroup_disable d’amorçage du noyau dans la ligne de commande).

/proc/ pid /cgroup (depuis Linux 2.6.24)

Ce fichier dĂ©crit les groupes de contrĂŽle auxquels le processus ayant le PID correspondant appartient. L’information affichĂ©e diffĂšre pour les hiĂ©rarchies version 1 et version 2 de cgroups.

Pour chaque hiérarchie de cgroup dont le processus est membre, il existe une entrée contenant trois champs séparés par des deux-points :

ID_hiérarchie:liste_contrÎleurs:chemin_cgroup

Par exemple :

5:cpuacct,cpu,cpuset:/daemons

De gauche à droite, ces trois champs séparés par des deux-points sont :

[1]

Pour les hiĂ©rarchies de cgroups version 1, ce champ contient un numĂ©ro d’ID unique de hiĂ©rarchie qui peut ĂȘtre comparĂ© avec un ID de hiĂ©rarchie dans /proc/cgroups . Pour les hiĂ©rarchies de cgroups version 2, ce champ contient la valeur 0.

[2]

Pour les hiérarchies de cgroups version 1, ce champ contient une liste séparée par des virgules de contrÎleurs liés à la hiérarchie. Pour les hiérarchies de cgroups version 2, ce champ est vide.

[3]

Ce champ contient le chemin du groupe de contrÎle dans la hiérarchie à laquelle le processus appartient. Ce chemin est relatif au point de montage de la hiérarchie.

Fichiers /sys/kernel/cgroup

/sys/kernel/cgroup/delegate (depuis Linux 4.15)

Ce fichier exporte une liste de fichiers cgroups version 2 (un par ligne) qui sont dĂ©lĂ©gables (c’est-Ă -dire dont la propriĂ©tĂ© peut ĂȘtre changĂ©e Ă  l’ID utilisateur du dĂ©lĂ©guĂ©). Dans le futur, l’ensemble des fichiers dĂ©lĂ©gables peut ĂȘtre modifiĂ© ou grossir, et ce fichier fournit un moyen pour le noyau d’informer les applications en espace utilisateur quels fichiers doivent ĂȘtre dĂ©lĂ©guĂ©s. Depuis Linux 4.15, il est possible de voir ce qui suit lors de l’inspection de ce fichier :

$ cat /sys/kernel/cgroup/delegate
cgroup.procs
cgroup.subtree_control
cgroup.threads

/sys/kernel/cgroup/features (depuis Linux 4.15)

Avec le temps, l’ensemble de fonctionnalitĂ©s de cgroups version 2 fournies par le noyau peut Ă©voluer ou grossir, ou certaines fonctionnalitĂ©s pourraient ne pas ĂȘtre activĂ©es par dĂ©faut. Ce fichier fournit un moyen aux applications en espace utilisateur de dĂ©couvrir quelles fonctionnalitĂ©s le noyau utilisĂ© gĂšre et a d’activĂ©es. Les fonctionnalitĂ©s sont listĂ©es, une par ligne :

$ cat /sys/kernel/cgroup/features
nsdelegate
memory_localevents

Les entrées pouvant apparaitre dans ce fichier sont :
memory_localevents
(depuis Linux 5.2)

Le noyau gùre l’option de montage memory_localevents .

nsdelegate (depuis Linux 4.15)

Le noyau gùre l’option de montage nsdelegate .

memory_recursiveprot (depuis Linux 5.7)

Le noyau gùre l’option de montage memory_recursiveprot .

VOIR AUSSI

prlimit (1), systemd (1), systemd-cgls (1), systemd-cgtop (1), clone (2), ioprio_set (2), perf_event_open (2), setrlimit (2), cgroup_namespaces (7), cpuset (7), namespaces (7), sched (7), user_namespaces (7)

Le fichier des sources du noyau Documentation/admin-guide/cgroup-v2.rst .

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .