20.2. Contrôle de la répartition du temps d'utilisation de l'unité centrale pour les applications en ajustant le poids de l'unité centrale

Vous devez attribuer des valeurs aux fichiers pertinents du contrôleur cpu pour réguler la distribution du temps de CPU aux applications sous l'arborescence spécifique du cgroup.

Conditions préalables

  • Vous disposez des droits d'accès à la racine.
  • Vous disposez d'applications pour lesquelles vous souhaitez contrôler la répartition du temps de l'unité centrale.
  • Vous avez créé une hiérarchie à deux niveaux de child control groups à l'intérieur de /sys/fs/cgroup/ root control group comme dans l'exemple suivant :

    …​
      ├── Example
      │   ├── g1
      │   ├── g2
      │   └── g3
    …​
  • Vous avez activé le contrôleur cpu dans le groupe de contrôle parent et dans les groupes de contrôle enfants de la même manière que celle décrite dans la section Création de cgroups et activation de contrôleurs dans le système de fichiers cgroups-v2.

Procédure

  1. Configurez les poids CPU souhaités afin de respecter les restrictions de ressources au sein des groupes de contrôle :

    # echo "150" > /sys/fs/cgroup/Example/g1/cpu.weight
    # echo "100" > /sys/fs/cgroup/Example/g2/cpu.weight
    # echo "50" > /sys/fs/cgroup/Example/g3/cpu.weight
  2. Ajoutez les PID des applications aux groupes enfants g1, g2, et g3:

    # echo "33373" > /sys/fs/cgroup/Example/g1/cgroup.procs
    # echo "33374" > /sys/fs/cgroup/Example/g2/cgroup.procs
    # echo "33377" > /sys/fs/cgroup/Example/g3/cgroup.procs

    Les commandes de l'exemple garantissent que les applications souhaitées deviennent membres des cgroups enfants Example/g*/ et que leur temps d'utilisation de l'unité centrale est réparti conformément à la configuration de ces cgroups.

    Les poids des cgroups enfants (g1, g2, g3) qui ont des processus en cours sont additionnés au niveau du cgroup parent (Example). Les ressources de l'unité centrale sont ensuite réparties proportionnellement en fonction des poids respectifs.

    Par conséquent, lorsque tous les processus s'exécutent en même temps, le noyau alloue à chacun d'entre eux un temps d'utilisation proportionnel basé sur le fichier cpu.weight de leur cgroupe respectif :

    Enfant cgroupcpu.weight fichierAttribution du temps de l'unité centrale

    g1

    150

    ~50% (150/300)

    g2

    100

    ~33% (100/300)

    g3

    50

    ~16% (50/300)

    La valeur du fichier du contrôleur cpu.weight n'est pas un pourcentage.

    Si un processus cessait de fonctionner, laissant le cgroup g2 sans aucun processus en cours, le calcul ne tiendrait pas compte du cgroup g2 et ne prendrait en compte que les poids des cgroups g1 et g3:

    Enfant cgroupcpu.weight fichierAttribution du temps de l'unité centrale

    g1

    150

    ~75% (150/200)

    g3

    50

    ~25% (50/200)

    Important

    Si un cgroup enfant a plusieurs processus en cours d'exécution, le temps CPU alloué au cgroup respectif sera distribué de manière égale aux processus membres de ce cgroup.

Vérification

  1. Vérifiez que les applications s'exécutent dans les groupes de contrôle spécifiés :

    # cat /proc/33373/cgroup /proc/33374/cgroup /proc/33377/cgroup
    0::/Example/g1
    0::/Example/g2
    0::/Example/g3

    La sortie de la commande montre les processus des applications spécifiées qui s'exécutent dans les cgroups enfants Example/g*/.

  2. Examinez la consommation actuelle de l'unité centrale des applications limitées :

    # top
    top - 05:17:18 up 1 day, 18:25,  1 user,  load average: 3.03, 3.03, 3.00
    Tasks:  95 total,   4 running,  91 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 18.1 us, 81.6 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.3 hi,  0.0 si,  0.0 st
    MiB Mem :   3737.0 total,   3233.7 free,    132.8 used,    370.5 buff/cache
    MiB Swap:   4060.0 total,   4060.0 free,      0.0 used.   3373.1 avail Mem
    
        PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      33373 root      20   0   18720   1748   1460 R  49.5   0.0 415:05.87 sha1sum
      33374 root      20   0   18720   1756   1464 R  32.9   0.0 412:58.33 sha1sum
      33377 root      20   0   18720   1860   1568 R  16.3   0.0 411:03.12 sha1sum
        760 root      20   0  416620  28540  15296 S   0.3   0.7   0:10.23 tuned
          1 root      20   0  186328  14108   9484 S   0.0   0.4   0:02.00 systemd
          2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthread
    ...
    Note

    Nous avons forcé tous les processus de l'exemple à s'exécuter sur une seule unité centrale pour une illustration plus claire. Le poids de l'unité centrale applique les mêmes principes lorsqu'il est utilisé sur plusieurs unités centrales.

    Notez que la ressource CPU pour les applications PID 33373, PID 33374 et PID 33377 a été allouée en fonction des poids, 150, 100, 50, que vous avez attribués aux groupes enfants respectifs. Ces poids correspondent à environ 50 %, 33 % et 16 % du temps d'utilisation de l'unité centrale pour chaque application.