3.4. cpuset

Le sous-système cpuset assigne les CPU individuels et les noeuds de mémoire à des groupes de contrôle. Chaque cpuset peut être spécifié en fonction des paramètres suivants, chacun dans un pseudo-fichier différent du système de fichiers virtuel du groupe de contrôle :

Important

Certains sous-systèmes ont des paramètres obligatoires à définir avant de pouvoir déplacer une tâche dans un groupe de contrôle qui utilise l'un de ces sous-systèmes. Par exemple, avant de déplacer une tâche dans un cgroup qui utilise le sous-système cpuset. les paramètres cpuset.cpus et cpuset.mems doivent être définis pour ce cgroup.
cpuset.cpus (obligatoire)
spécifie à quels CPU les tâches dans ce groupe de contrôle ont la permission d'accéder. Ceci est une liste séparée par des virgules sous le format ASCII, avec des tirets ("-") pour représenter l'étendue. Par exemple :
0-2,16
représente les CPUs 0, 1, 2, et 16.
cpuset.mems (obligatoire)
spécifie les noeuds de mémoire auxquels les tâches de ce groupe de contrôle auront la permission d'accéder. Ceci est une liste séparée par des virgules sous le format ASCII, avec des tirets ("-") pour repésenter l'étendue. Par exemple,
0-2,16
représente les noeuds de mémoire 0, 1, 2, et 16.
cpuset.memory_migrate
contient un indicateur (0 ou 1) spécifiant si une page en mémoire devrait migrer vers un nouveau noeud si les valeurs dans cpuset.mems changent. Par défaut, la migration de mémoire est désactivée (0) et les pages restent sur le noeud auquel elles ont été assignées à l'origine, même si celui-ci ne fait maintenant plus partie des noeuds spécifiés dans cpuset.mems. Si la migration est activée (1), le système migrera les pages vers les noeuds de mémoire faisant partie des nouveaux paramètres spécifiés par cpuset.mems, tout en maintenant leur position respective dans la mesure du possible — par exemple, les pages sur le second noeud sur la liste spécifiée à l'origine par cpuset.mems seront allouées au second noeud sur la liste maintenant spécifiée par cpuset.mems, si cette position est disponible.
cpuset.cpu_exclusive
contient un indicateur (0 ou 1) spécifiant si des cpusets autres que celui-ci, que ses parents ou que ses enfants peuvent partager les CPUs spécifiés pour ce cpuset. Par défaut (0), les CPUs ne sont pas exclusivement alloués à un seul cpuset.
cpuset.mem_exclusive
contient un indicateur (0 ou 1) spécifiant si d'autres cpusets peuvent partager les noeuds de mémoire spécifiés pour ce cpuset. Par défaut (0), les noeuds de mémoire ne sont pas exclusivement alloués à un seul cpuset. Réserver des noeuds de mémoire pour une utilisation exclusive d'un seul cpuset ((1) est fonctionnellement la même chose qu'activer un hardwall de mémoire avec cpuset.mem_hardwall.
cpuset.mem_hardwall
contient un indicateur (0 ou 1) spécifiant si les allocations au noyau de pages mémoire et de données de tampon devraient être restreintes aux noeuds de mémoire spécifiés pour ce cpuset. Par défaut (0), les pages et les données de tampon sont partagées par les processus appartenant à de multiples utilisateurs. Avec un hardwall activé (1), la mémoire allouée aux tâches de chaque utilisateur peut être séparée de la mémoire allouée aux tâches de tous les autres utilisateurs.
cpuset.memory_pressure
un fichier en lecture seule qui contient une moyenne en cours d'exécution de la solicitation de mémoire (memory pressure), créée par les processus dans ce cpuset. La valeur dans ce pseudofichier est automatiquement mise à jour lorsque cpuset.memory_pressure_enabled est activé, sinon le pseudofichier contient la valeur 0.
cpuset.memory_pressure_enabled
contient un indicateur (0 ou 1) spécifiant si le système doit calculer la solicitation de mémoire (memory pressure) créée par les processus dans ce groupe de contrôle. Les valeurs calculées sortent dans cpuset.memory_pressure et représentent le taux auquel les processus tentent de libérer la mémoire utilisée, ces valeurs sont rapportées en chiffres entiers et s'expliquent par le nombre de tentatives de récupération de mémoire par seconde, multiplié par 1000.
cpuset.memory_spread_page
contient un indicateur (0 ou 1) spécifiant si les tampons de systèmes de fichiers doivent être placés de manière régulièresur les noeuds de mémoire alloués à ce cpuset. Par défaut (0), aucune tentative de placer les pages de mémoire sur ces tampons de manière régulière n'est faite, et ceux-ci sont placés sur le noeud où le processus qui les a créés est en cours d'exécution.
cpuset.memory_spread_slab
contient un indicateur (0 ou 1) spécifiant si les caches slab du noyau pour opérations d'entrée/sortie doivet être placés de manière régulière sur le cpuset. Par défaut (0), aucune tentative de placer les caches slab du noyau de manière régulière n'est faite, et ceux-ci sont placés sur le noeud où le processus qui les a créés est en cours d'exécution.
cpuset.sched_load_balance
contient un indicateur (0 ou 1) spécifiant si le noyau va équilibrer les charges sur les CPU dans ce cpuset. Par défaut (1), le noyau équilibre les charges en déplaçant les processus des CPUs surchargés sur des CPUs moins solicités.
Remarquez cependant que définir cet indicateur dans un cgroup n'a aucun effet si l'équilibrage des charges est activé dans tout cgroup parent, car l'équilibrage des charges est déjà en cours à un niveau plus élevé. Ainsi, pour désactiver l'équilibrage des charges dans un cgroup, désactivez aussi l'équilibrage des charges dans chacun de ses parents dans la hiérarchie. Dans ce cas, vous devriez aussi vous demander si l'équilibrage des charges devrait être activé sur les autres relations de même parenté du groupe de contrôle en question.
cpuset.sched_relax_domain_level
contient un entier entre -1 et une petite valeur positive, qui représente la largeur de l'étendue des CPUs sur laquelle le noyau va essayer d'équilibrer les charges. Cette valeur n'a aucun sens si cpuset.sched_load_balance est désactivé.
L'effet précis de cette valeur varie en fonction de l'architecture du système, mais les valeurs suivantes sont typiques :
Valeurs de cpuset.sched_relax_domain_level
ValeurEffet
-1Utilise la valeur par défaut du système pour l'équilibrage des charges
0N'effectue pas d'équilibrage des charges immédiat ; équilibre les charges de manière périodique uniquement
1Équilibre immédiatement les charges sur les threads du même coeur
2Équilibre immédiatement les charges sur les coeurs dans le même paquetage
3Équilibre immédiatement les charges sur les CPUs du même noeud ou de la même lame
4Équilibre immédiatement les charges sur plusieurs CPUs sur des architectures à accès non uniforme à la mémoire (NUMA)
5Équilibre immédiatement les charges sur tous les CPUs sur architectures avec NUMA