Comment limiter les ressources à l’aide de cgroups sur CentOS 6

introduction

Les groupes de contrôle, ou cgroups, sont une fonctionnalité du noyau introduite dans CentOS 6 pour fournir un nouveau moyen de limiter l’accès aux ressources système des processus. Vous pouvez créer vos propres groupes de contrôle, surveiller les groupes de contrôle que vous configurez, refuser l’accès à certaines ressources des groupes de contrôle et même reconfigurer vos groupes de contrôle de manière dynamique sur un système en cours d’exécution.

Dans ce didacticiel, nous verrons comment limiter le processeur, la mémoire et les E / S disque pour les processus. Pour ce faire, nous allons d’abord créer des groupes de contrôle, leur ajouter des processus et voir leur performance.

Conditions préalables

Avant de commencer à utiliser ce didacticiel, vous devez avoir un utilisateur non root doté de la configuration sudo sur votre CentOS 6 Droplet. Pour configurer un utilisateur de ce type, suivez notre tutoriel Initial Initial Server avec CentOS 6. Toutes les commandes seront exécutées sous cet utilisateur.

Étape 1 - Installation

Dans cette section, nous installerons les packages nécessaires au fonctionnement du groupe de contrôle.

Les groupes de contrôle et les sous-systèmes auxquels ils se rapportent peuvent être manipulés à l’aide de commandes shell et d’utilitaires. Cependant, le moyen le plus simple de travailler avec cgroups consiste à installer le paquetage + libcgroup +. Le package + libcgroup + fournit des utilitaires de ligne de commande, des fichiers de configuration et des pages de manuel liés à cgroups. Ce package n’est pas installé par défaut sur un serveur CentOS 6. Pour l’installer, lancez la commande suivante:

sudo yum install libcgroup

Étape 2 - Démarrage du service

Le service + cgconfig + (configuration du groupe de contrôle) est utilisé pour créer des groupes de contrôle et gérer des sous-systèmes. Il peut être configuré pour démarrer au démarrage et rétablir vos groupes de contrôle prédéfinis, ce qui les rend persistants lors des redémarrages. Le service + cgconfig + n’est pas démarré par défaut sur CentOS 6, commençons-le donc:

sudo service cgconfig start

Le démarrage du service + cgconfig + crée un système de fichiers virtuel monté sur + / cgroup + avec tous les sous-systèmes. Laissez-nous vérifier ceci:

sudo ls /cgroup

Cette commande devrait afficher les sous-systèmes suivants:

blkio  cpu  cpuacct  cpuset  devices  freezer  memory  net_cls

Vous pouvez également exécuter la commande `lscgroup’ pour vérifier:

sudo lscgroup

Vous verrez les sous-systèmes dans une disposition légèrement différente:

cpuset:/
cpu:/
cpuacct:/
memory:/
devices:/
freezer:/
net_cls:/
blkio:/

Ressources système

Les ressources système sont appelées sous-systèmes et chaque sous-système possède plusieurs paramètres auxquels nous pouvons attribuer des valeurs. CentOS 6 fournit dix sous-systèmes de groupe de contrôle:

  • * blkio * - ce sous-système définit des limites d’accès en entrée / sortie vers et depuis des périphériques en mode bloc, tels que des lecteurs physiques (disque, semi-conducteurs, USB, etc.).

  • * cpu * - ce sous-système définit des limites sur le temps CPU disponible

  • * cpuacct * - ce sous-système génère des rapports automatiques sur les ressources CPU utilisées par les tâches d’un groupe de contrôle

  • * cpuset * - ce sous-système affecte des processeurs individuels (sur un système multicœur) et des nœuds de mémoire aux tâches d’un groupe de contrôle

  • * devices * - ce sous-système autorise ou refuse l’accès aux périphériques par les tâches d’un groupe de contrôle

  • * freezer * - ce sous-système suspend ou reprend les tâches dans un groupe de contrôle

  • * memory * - ce sous-système fixe des 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 de mémoire utilisées par ces tâches

  • * net_cls * - ce sous-système marque les paquets réseau avec un identifiant de classe (classid) permettant au contrôleur de trafic Linux (tc) d’identifier les paquets provenant d’une tâche cgroup particulière

  • * net_prio * - ce sous-système permet de définir de manière dynamique la priorité du trafic réseau par interface réseau.

  • * ns * - c’est le sous-système d’espace de noms

Étape 3 - Configuration

Dans cette section, nous allons créer des exemples de groupes de contrôle et définir des limites de ressources pour ces groupes de contrôle. Le fichier de configuration du groupe de contrôle est + / etc / cgconfig.conf +. 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 des paramètres de sous-système (limites de ressources) pour chaque groupe de contrôle.

Une hiérarchie est un ensemble de groupes de contrôle organisés dans une arborescence, de sorte que chaque tâche du système se trouve exactement dans l’un des groupes de contrôle de la hiérarchie. Dans une configuration CentOS 6 par défaut, chaque sous-système est placé dans sa propre hiérarchie.

Commençons par créer quelques groupes de contrôle nommés limitcpu, limitmem, limitio et navigateurs. Le fichier + / etc / cgconfig.conf contient deux types principaux d’entrées -` + mount` et + groupe +. Les lignes commençant par + group + créent des groupes de contrôle et définissent des paramètres de sous-système. Editez le fichier + / etc / cgconfig.conf + et ajoutez les entrées suivantes du groupe de travail:

/etc/cgconfig.conf

group limitcpu{
       cpu {
               cpu.shares = 400;
       }
}

group limitmem{
       memory {
               memory.limit_in_bytes = 512m;
       }
}

group limitio{
       blkio {
               blkio.throttle.read_bps_device = "252:0         2097152";
       }
}

group browsers{
       cpu {
               cpu.shares = 200;
       }
       memory {
               memory.limit_in_bytes = 128m;
       }
}
  • Dans le groupe de contrôle + limitcpu +, nous limitons à 400 le nombre de parts de processeur disponibles pour les processus de ce groupe de contrôle. + cpu.shares + spécifie la part relative de temps CPU disponible pour les tâches du groupe de contrôle.

  • Dans le groupe de contrôle + limitmem +, nous limitons à 512 Mo la mémoire disponible pour les processus de groupe de travail.

  • Dans le groupe de contrôle + limitio +, nous limitons le débit de lecture du disque à 2 Mo / s. Ici, nous limitons les E / S de lecture au disque principal, / dev / vda, avec majeur: numéro mineur 252: 0 et 2 Mo / s sont convertis en octets par seconde (2x1024x1024 = 2097152).

  • Dans le groupe de contrôle + navigateurs +, nous limitons les partages de processeurs à 200 et la mémoire disponible à 128 Mo.

Nous devons redémarrer le service + cgconfig + pour que les modifications apportées au fichier + / etc / cgconfig.conf + prennent effet:

sudo service cgconfig restart

Permettons à + ​​cgconfig + de démarrer au démarrage du système. Lorsque vous activez le service avec chkconfig, il lit le fichier de configuration du groupe de contrôle + / etc / cgconfig.conf + au moment du démarrage. Les groupes de contrôle sont recréés de session en session et restent persistants.

sudo chkconfig cgconfig on

Ensuite, vérifiez que les groupes de contrôle que nous avons configurés s’affichent correctement:

lscgroup

Si tout s’est bien passé, vous devriez voir:

cpuset:/
cpu:/
cpu:/browsers
cpu:/limitcpu
cpuacct:/
memory:/
memory:/browsers
memory:/limitmem
devices:/
freezer:/
net_cls:/
blkio:/
blkio:/limitio

Notre prochain objectif est d’ajouter les processus (tâches) pour lesquels nous souhaitons limiter les ressources aux groupes de contrôle créés précédemment.

+ Cgred + (démon du moteur de règles du groupe de contrôle) est un service qui déplace les tâches dans des groupes de contrôle en fonction des paramètres définis dans le fichier + / etc / cgrules.conf +. Les entrées du fichier + / etc / cgrules.conf peuvent prendre l’une des deux formes suivantes:

user subsystems control_group

or

user:command subsystems control_group

+ utilisateur + fait référence à un nom d’utilisateur ou à un nom de groupe préfixé par le caractère "@". + subsystems + fait référence à une liste de noms de sous-systèmes séparés par des virgules. + groupe_contrôle + représente un chemin d’accès au groupe de contrôle, et + commande + représente un nom de processus ou un chemin de commande complet d’un processus. Les entrées du fichier + / etc / cgrules.conf + peuvent inclure les notations supplémentaires suivantes:

  • + @ + - indique un groupe au lieu d’un utilisateur individuel. Par exemple, + @ admin + indique tous les utilisateurs du groupe admin.

  • + * + - représente “tous”. Par exemple, «+ * +» dans le champ utilisateur représente tous les utilisateurs.

  • +% + - représente un élément identique à celui de la ligne ci-dessus.

Ajoutons maintenant les programmes / processus que nous souhaitons limiter. Éditez + / etc / cgrules.conf + et ajoutez ce qui suit en bas:

/etc/cgrules.conf

*:firefox       cpu,memory      browsers/
*:hdparm        blkio   limitio/
sammy   blkio   limitio/
@admin:memhog  memory  limitmem/
*:cpuhog        cpu     limitcpu/

Dans les lignes ci-dessus, nous définissons les règles suivantes:

  • Les processus * firefox * exécutés par n’importe quel utilisateur seront automatiquement ajoutés au cgroup + navigateurs + et limités en sous-systèmes cpu et mémoire.

  • Les processus * hdparm * exécutés par n’importe quel utilisateur seront ajoutés au groupe de contrôle + limitio + et seront limités dans le sous-système blkio en fonction des valeurs de paramètre spécifiées dans ce groupe de contrôle.

  • Tous les processus exécutés par l’utilisateur * sammy * seront ajoutés au groupe de contrôle + limitio + et limités dans le sous-système blkio.

  • Les processus * memhog * exécutés par n’importe qui du groupe + admin + seront ajoutés au cgroup + limitmem + et limités en sous-système de mémoire.

  • Les processus * cpuhog * exécutés par n’importe quel utilisateur seront ajoutés au cgroup + limitcpu + et limités dans le sous-système cpu.

Nous devons démarrer le service + cgred + pour que les modifications de configuration de cgrules prennent effet. Pour cela, utilisez la commande suivante:

sudo service cgred start

Nous devons également nous assurer que le service + cgred + est activé pour démarrer au démarrage du système afin que nos règles persistent après le redémarrage:

sudo chkconfig cgred on

Étape 4 - Test

Dans cette étape, nous vérifierons que la limite de débit de lecture du disque de 2 Mo / s est correctement appliquée conformément à la règle que nous avons ajoutée dans + cgrules.conf +. Pour ce faire, nous allons installer et exécuter l’outil + hdparm +. L’outil + hdparm + permet de définir et de visualiser les paramètres matériels des unités de disque dur, de mesurer les vitesses de lecture et d’écriture, etc. Laissez-nous installer hdparm en utilisant:

sudo yum install hdparm

Lançons maintenant une commande pour mesurer la vitesse de lecture de votre disque dur / dev / vda:

sudo hdparm --direct -t /dev/vda

Vous devriez voir la sortie suivante:

/dev/vda:
Timing O_DIRECT disk reads:   6 MB in  3.00 seconds =   2.00 MB/sec

La sortie indique un débit de lecture du disque de 2 Mo / s. Si vous arrêtez à la fois les services + cgconfig + et + cgred + et exécutez à nouveau la commande + hdparm + ci-dessus, vous pouvez voir la vitesse de lecture d’origine / par défaut à partir du moment où les règles de groupe de contrôle n’étaient pas implémentées.

Conclusion

Ce didacticiel présente uniquement certaines des tâches élémentaires que vous pouvez effectuer avec les groupes de contrôle. Il est également possible de créer des sous-groupes de contrôle, de compter et de rapporter la quantité de ressources consommées par un groupe de contrôle, de suspendre un groupe de processus à l’aide du sous-système * freezer *, etc.

Consultez les ressources suivantes pour plus de détails: