<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://doc.ycharbi.fr/index.php?action=history&amp;feed=atom&amp;title=Cgroup2</id>
	<title>Cgroup2 - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ycharbi.fr/index.php?action=history&amp;feed=atom&amp;title=Cgroup2"/>
	<link rel="alternate" type="text/html" href="https://doc.ycharbi.fr/index.php?title=Cgroup2&amp;action=history"/>
	<updated>2026-04-05T12:45:10Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://doc.ycharbi.fr/index.php?title=Cgroup2&amp;diff=1542&amp;oldid=prev</id>
		<title>Ycharbi : Page créée avec « Category:Pseudo_systèmes_de_fichiers  {{chantier}}  [https://fr.wikipedia.org/wiki/Cgroups Cgroups] (''control groups'') est une fonctionnalité du [https://fr.wikipedia.org/wiki/Noyau_Linux noyau Linux] pour limiter, compter et isoler l'utilisation des ressources (processeur, mémoire, utilisation disque, RDMA, [https://www.man7.org/linux/man-pages/man7/cgroups.7.html#CGROUPS_VERSION_2 etc]...).   Il est issus d'un travail initié par des ingénieurs de [ht... »</title>
		<link rel="alternate" type="text/html" href="https://doc.ycharbi.fr/index.php?title=Cgroup2&amp;diff=1542&amp;oldid=prev"/>
		<updated>2024-12-04T22:16:39Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « &lt;a href=&quot;/index.php/Cat%C3%A9gorie:Pseudo_syst%C3%A8mes_de_fichiers&quot; title=&quot;Catégorie:Pseudo systèmes de fichiers&quot;&gt;Category:Pseudo_systèmes_de_fichiers&lt;/a&gt;  {{chantier}}  [https://fr.wikipedia.org/wiki/Cgroups Cgroups] (&amp;#039;&amp;#039;control groups&amp;#039;&amp;#039;) est une fonctionnalité du [https://fr.wikipedia.org/wiki/Noyau_Linux noyau Linux] pour limiter, compter et isoler l&amp;#039;utilisation des ressources (processeur, mémoire, utilisation disque, RDMA, [https://www.man7.org/linux/man-pages/man7/cgroups.7.html#CGROUPS_VERSION_2 etc]...).   Il est issus d&amp;#039;un travail initié par des ingénieurs de [ht... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Pseudo_systèmes_de_fichiers]]&lt;br /&gt;
&lt;br /&gt;
{{chantier}}&lt;br /&gt;
&lt;br /&gt;
[https://fr.wikipedia.org/wiki/Cgroups Cgroups] (''control groups'') est une fonctionnalité du [https://fr.wikipedia.org/wiki/Noyau_Linux noyau Linux] pour limiter, compter et isoler l'utilisation des ressources (processeur, mémoire, utilisation disque, RDMA, [https://www.man7.org/linux/man-pages/man7/cgroups.7.html#CGROUPS_VERSION_2 etc]...). &lt;br /&gt;
&lt;br /&gt;
Il est issus d'un travail initié par des ingénieurs de [https://fr.wikipedia.org/wiki/Google Google] en 2006 et intégré à la version 2.6.24 du noyau. La version 1 étant dépréciée (mais encore présente dans la branche principale de ''Linux''), seule son évolution, ''Cgroups2'', sera traité.&lt;br /&gt;
&lt;br /&gt;
Le principe général de cette technologie présentée comme un [[:Category:Pseudo_systèmes_de_fichiers|pseudo système de fichiers]] monté par défaut dans &amp;lt;code&amp;gt;/sys/fs/cgroup/&amp;lt;/code&amp;gt; est, de façon arbitraire, de créer des groupes de processus qui se verront tous appliquer des limitations communes. Il est ainsi possible de mitiger les risques de dénis de services occasionnés par un programme un peu trop gourmand en ressources. Son usage est de fait très plébiscité dans les environnements [[:Category:Conteneurisation|conteneurisés]].&lt;br /&gt;
&lt;br /&gt;
=Limitation des ressources=&lt;br /&gt;
''Cgroups2'' permet de limiter les ressources systèmes suivantes :&lt;br /&gt;
* '''cpu''' (depuis ''Linux'' 4.15) : limitation de l'usage processeur&lt;br /&gt;
&lt;br /&gt;
* '''cpuset''' (depuis ''Linux'' 5.0) : permet de faire fonctionner les processus sur des nœuds [https://fr.wikipedia.org/wiki/Non_uniform_memory_access NUMA] et des processeurs spécifiques (plateformes matérielles multi socket)&lt;br /&gt;
&lt;br /&gt;
* '''freezer''' (depuis ''Linux'' 5.2) : permet de geler et de reprendre les processus du groupe&lt;br /&gt;
&lt;br /&gt;
* '''hugetlb''' (depuis ''Linux'' 5.6) : limite l'utilisation des grandes pages mémoires ([https://www.kernel.org/doc/html/latest/admin-guide/mm/hugetlbpage.html huge pages])&lt;br /&gt;
&lt;br /&gt;
* '''io''' (depuis ''Linux'' 4.5) : limite l'utilisation des entrées/sorties sur les [[:Category:Périphériques bloc|périphériques de type bloc]] spécifiés dans le groupe&lt;br /&gt;
&lt;br /&gt;
* '''memory''' (depuis ''Linux'' 4.5) : limite l'utilisation de la mémoire (''RAM'') des processus ; du noyau et de la ''SWAP''&lt;br /&gt;
&lt;br /&gt;
* '''perf_event''' (depuis ''Linux'' 4.11) : permet la supervision des performances ([https://www.kernel.org/doc/html/latest/arch/arm64/perf.html perf]) des processus du groupe&lt;br /&gt;
&lt;br /&gt;
* '''pids''' (depuis ''Linux'' 4.5) : limite le nombre de processus (''PID'') pouvant être créés dans le groupe&lt;br /&gt;
&lt;br /&gt;
* '''rdma''' (depuis ''Linux'' 4.11) : permet de limiter l'usage du [https://en.wikipedia.org/wiki/Remote_direct_memory_access RDMA] et de l'[https://fr.wikipedia.org/wiki/Bus_InfiniBand Infiniband] dans le groupe&lt;br /&gt;
&lt;br /&gt;
Leur portage depuis la [https://www.man7.org/linux/man-pages/man7/cgroups.7.html#CGROUPS_VERSION_1 version 1] est progressif. Les nouvelles versions du noyau sont donc susceptibles d'en supporter d'avantage.&lt;br /&gt;
&lt;br /&gt;
Tous les processus nouvellement créés s'ajoutent dans le groupe racine (''cgroup'' par défaut) via la liste &amp;lt;code&amp;gt;/sys/fs/cgroup/cgroup.procs&amp;lt;/code&amp;gt; qui ne comporte aucune limitation.&lt;br /&gt;
Pour limiter un ou plusieurs processus, il faut alors créer un groupe dédié aux limitations que nous voulons leur appliquer.&lt;br /&gt;
&lt;br /&gt;
{{info|Il est à noter qu'un ''PID'' ne peut appartenir qu'à un seul ''cgroup'' à la fois. Cette notion est importante pour la suite.}}&lt;br /&gt;
&lt;br /&gt;
Un groupe se créé par l'ajout d'un répertoire dans la racine du point de montage :&lt;br /&gt;
 mkdir /sys/fs/cgroup/toto&lt;br /&gt;
&lt;br /&gt;
Dès la création, son contenu est automatiquement peuplé des fichiers de configuration du groupe. Pour appliquer une limitation à ce dernier, il suffit donc d'inscrire une valeur dans le fichier correspondant à celle-ci.&lt;br /&gt;
&lt;br /&gt;
Pour l'annuler, il suffit de supprimer son répertoire&lt;br /&gt;
 rmdir /sys/fs/cgroup/toto/&lt;br /&gt;
&lt;br /&gt;
''Note : La suppression d'un cgroup n'est possible que si aucun processus ne lui est affecté.''&lt;br /&gt;
&lt;br /&gt;
==Limitation CPU==&lt;br /&gt;
===Attribution manuelle===&lt;br /&gt;
Pour limiter l'usage du processeur à 50% d'un cœur, il est possible d'inscrire des limites de temps (en microsecondes) dans le fichier &amp;lt;code&amp;gt;cpu.max&amp;lt;/code&amp;gt; :&lt;br /&gt;
 echo &amp;quot;50000 100000&amp;quot; &amp;gt; /sys/fs/cgroup/toto/cpu.max&lt;br /&gt;
&lt;br /&gt;
Description :&lt;br /&gt;
* '''50000''' : limite de temps ''CPU'' en microsecondes que le ''cgroup'' peut utiliser dans une période donnée. Dans cet exemple, cela signifie que le groupe &amp;lt;code&amp;gt;toto&amp;lt;/code&amp;gt; peut utiliser jusqu'à 50 000 microsecondes (soit 50 millisecondes) de temps processeur&lt;br /&gt;
* '''100000''' : période de temps en microsecondes sur laquelle la limite est appliquée. Dans cet exemple, cela signifie que la période est de 100 000 microsecondes (soit 100 millisecondes).&lt;br /&gt;
&lt;br /&gt;
Donc le ''cgroup'' peut utiliser jusqu'à 50 millisecondes de temps ''CPU'' dans une période de 100 millisecondes. S'il dépasse cette limite, il sera restreint dans son utilisation du processeur jusqu'à la fin de la période. 100% équivaut à la charge d'un cœur, une valeur supérieure en concernera donc plusieurs.&lt;br /&gt;
&lt;br /&gt;
{{info|Pour rappel, la limite est globale au groupe. Tous les ''PID'' en faisant parti consommeront donc au maximum un total de 50% du CPU sur un seul cœur.}}&lt;br /&gt;
&lt;br /&gt;
Le programme utilisé pour tester notre bridage sera &amp;lt;code&amp;gt;stress&amp;lt;/code&amp;gt;, un outil de charge processeur disponible dans les dépôts ''Debian''. Nous allons l'utiliser pour charger un cœur à 100% :&lt;br /&gt;
 stress -c 1&lt;br /&gt;
&lt;br /&gt;
Pour rappel, tout nouveau processus appartient par défaut (nous verrons plus loin commun influencer ce critère) au ''cgroup'' racine, il faut donc récupérer son ''PID'' afin de l'ajouter dans la liste de processus &amp;lt;code&amp;gt;/sys/fs/cgroup/toto/cgroup.procs&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Récupération du PID (ici 1355)&lt;br /&gt;
ps -aux | grep stress&lt;br /&gt;
&lt;br /&gt;
# Ajout du processus au cgroup toto&lt;br /&gt;
echo &amp;quot;1355&amp;quot; &amp;gt; /sys/fs/cgroup/toto/cgroup.procs&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Note : L'usage du cœur sollicité a été réduit instantanément de moitié.''&lt;br /&gt;
&lt;br /&gt;
Pour retirer le processus du ''cgroup'', il convient de le replacer dans la racine&lt;br /&gt;
 echo &amp;quot;1355&amp;quot; &amp;gt; /sys/fs/cgroup/cgroup.procs&lt;br /&gt;
&lt;br /&gt;
''Note : Le cœur est reparti à 100%.''&lt;br /&gt;
&lt;br /&gt;
===Attribution à l'exécution===&lt;br /&gt;
La méthode exposée déroule un procédé manuel et asynchrone : le processus est d'abord créé dans le ''cgroup'' racine pour être déplacé après coup dans un groupe spécifique. Bien que cela puisse s'avérer utile pour limiter un programme déjà en cours d'exécution, il n'est pas envisageable de réaliser ces opérations manuellement à chaque lancement (d'autant plus que le PID change à chaque occurrence).&lt;br /&gt;
&lt;br /&gt;
La commande &amp;lt;code&amp;gt;cgexec&amp;lt;/code&amp;gt; du paquet &amp;lt;code&amp;gt;cgroup-tools&amp;lt;/code&amp;gt; permet d'effectuer ces opérations automatiquement au lancement d'un programme (tous les ''PID'' fils sont concernés). Le ''cgroup'' doit toutefois être créé au préalable.&lt;br /&gt;
 cgexec -g cpu:/toto stress -c 1&lt;br /&gt;
&lt;br /&gt;
===Attribution de service===&lt;br /&gt;
[[:Category:Systemd|Systemd]] permet d'exécuter des processus dans un ''cgroup'' via les options [https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html#Options systemd.resource-control] des unités  &amp;lt;code&amp;gt;slice.slice&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;scope.scope&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;service.service&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;socket.socket&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;mount.mount&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;swap.swap&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
À faire...&lt;br /&gt;
&lt;br /&gt;
===Persistance===&lt;br /&gt;
Comme tout pseudo système de fichier, ''cgroup2'' est volatile et ne survivra pas à un redémarrage. Une persistance peut être configurée via les fichiers (non existants par défaut) &amp;lt;code&amp;gt;/etc/cgconfig.conf&amp;lt;/code&amp;gt; et &amp;lt;code&amp;gt;/etc/cgconfig.conf.d/*.conf&amp;lt;/code&amp;gt; du paquet &amp;lt;code&amp;gt;cgroup-tools&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Comme il est bientôt minuit et que comme à l'accoutumé, les outils simples en lignes commandes, ont des fichiers de configurations de l'espace (pourquoi ne reprennent-ils pas simplement les commandes qui fonctionnent comme &amp;lt;code&amp;gt;iptables-persistent&amp;lt;/code&amp;gt; ?), je ne vais pas me coucher à 5 heure du matin juste pour tenter de convertir 3 pauvres lignes de commande en une série de galères longues comme le bras et complexe comme le cerveau torturé des développeurs de ce merdier. Cherchez par vous même et je documenterai peut-être ça un jour...&lt;br /&gt;
&lt;br /&gt;
=Sources=&lt;br /&gt;
* https://www.man7.org/linux/man-pages/man7/cgroups.7.html#CGROUPS_VERSION_2&lt;br /&gt;
* https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html&lt;br /&gt;
* https://wiki.archlinux.org/title/Cgroups&lt;/div&gt;</summary>
		<author><name>Ycharbi</name></author>
	</entry>
</feed>