# Cgroups

cgroups (control groups) est une fonctionnalité du noyau Linux pour limiter, compter et isoler l'utilisation des ressources (processeur, mémoire, utilisation disque, etc.).
Ce travail a été initié par des ingénieurs de Google (d'abord Paul Menage et Rohit Seth) en 2006 sous le nom « conteneur de processus» ; à la fin 2007, il a été renommé Control Groups (à cause de la confusion causée par les différentes significations du terme « conteneur » dans le noyau Linux) et intégré à la version 2.6.24 du noyau Linux. Depuis lors, de nombreuses nouvelles fonctionnalités et contrôleurs ont été ajoutés.

## Fonctionnalités

L'un des buts de la conception de cgroups a été de fournir une interface unifiée à différents cas d'utilisation, en allant du contrôle de simples processus (comme nice) à la virtualisation au niveau du système d'exploitation (comme OpenVZ, Linux-VServer, LXC). Cgroups fournit :
* Limitation des ressources : des groupes peuvent être mis en place afin de ne pas dépasser une limite de mémoire — cela inclut aussi le cache du système de fichier (en). L'article original a été présenté au Linux Symposium et s'intitule Containers: Challenges with the memory resource controller and its performance
* Priorisation : certains groupes peuvent obtenir une plus grande part de ressources processeur ou de bande passante d'entrée-sortie.
* Comptabilité : permet de mesurer la quantité de ressources consommées par certains systèmes en vue de leur facturation par exemple.
* Isolation : séparation par espace de nommage pour les groupes, afin qu'ils ne puissent pas voir les processus des autres, leurs connexions réseaux ou leurs fichiers.
* Contrôle : figer les groupes ou créer un point de sauvegarde et redémarrer.

## Utilisation

Un groupe de contrôle est une suite de processus qui sont liés par le même critère. Ces groupes peuvent être organisés hiérarchiquement, de façon que chaque groupe hérite des limites de son groupe parent. Le noyau fournit l'accès à plusieurs contrôleurs (sous-systèmes) à travers l'interface cgroup. Par exemple, le contrôleur « memory » limite l'utilisation de la mémoire, « cpuacct » comptabilise l'utilisation du processeur, etc.
Les Control groups peuvent être utilisés de plusieurs façons :
* En accédant au système de fichier virtuel cgroup manuellement en utilisant la commande mount
* En créant et gérant des groupes à la volée en utilisant des outils tels que cgcreate, cgexec, cgclassify (de libcgroup)
* Le « démon de moteur de règles » qui peut automatiquement déplacer les processus de certains utilisateurs, groupes ou commandes vers un cgroup en respectant ce qui est spécifié dans la configuration.
* Indirectement à travers d'autres logiciels qui utilisent cgroups, tels que la virtualisation LXC, libvirt, systemd, Open Grid Scheduler/Grid Engine.
La documentation du noyau Linux contient de nombreux détails sur l'installation et l'utilisation des groupes de contrôle.

## Isolation par espace de nommage

Bien que ne faisant pas techniquement partie du travail des groupes de contrôle, une fonctionnalité liée est l’isolation par espace de nommage, dans laquelle des ensembles de processus sont séparés de telle façon qu'ils ne puissent pas « voir » les ressources des autres groupes. Par exemple, un espace de nommage par identifiant de processus (PID) fournit un ensemble distinct d'identifiants de processus dans chaque espace de nommage. Sont aussi disponibles des espaces de nommage par mount, UTS, réseau et SysV IPC. Très tôt dans le développement des groupes de contrôle, le sous-système « ns » a été ajouté, pour intégrer les espaces de nommage et les groupes de contrôle. Si le groupe de contrôle « ns » était monté, chaque espace de nommage aurait dû aussi créer un nouveau groupe dans la hiérarchie des groupes de nommage. Ce fut une tentative qui fut jugée plus tard peu adaptée pour l'API cgroups, et supprimée du noyau.
* L'espace de nommage par identifiant de processus (PID namespace) fournit l'isolation pour l'allocation des identifiants de processus (PIDs), la liste des processus et de leurs détails. Tandis que le nouvel espace de nom est isolé de ses adjacents, les processus dans son espace de nommage « parent » voient toujours tous les processus dans les espaces de nommage enfants — quoiqu'avec des numéros de PID différents.
* L'espace de nommage réseau (Network namespace) isole le contrôleur de l'interface réseau (physique ou virtuel), les règles de pare-feu iptables, les tables de routage, etc. Les espaces de nommage réseau peuvent être connectés les uns avec chacun des autres en utilisant le périphérique virtuel Ethernet « veth ».
* L'espace de nommage « UTS » (“UTS” namespace) permet le changement de nom d'hôte.
* L'espace de nommage de montage (Mount namespace) permet de créer différents modèles de systèmes de fichiers, ou de créer certains points de montage en lecture-seule.
* L'espace de nommage IPC (IPC namespace) isole le System V de communication inter-processus entre les espaces de nommage.
Les espaces de nom sont créés avec la commande « unshare » ou un appel système, ou en tant que nouveaux marqueurs dans un appel système « clone ».