Comment les groupes de contrôle interagissent-ils avec les processus non groupés?

12

J'ai 3 processus sur une machine monocœur. Chaque processus est exactement le même et brûle le processeur aussi vite qu'il le peut (boucle serrée). Deux d'entre eux ( Aet B) sont lancés avec cgexec dans des groupes séparés avec des partages définis sur 512 et 512. Le troisième ( C) est lancé régulièrement, pas avec cgexec.

Une fois que tout est opérationnel, Cobtient 66% du processeur Aet se Bdivise à 33%. Si je tue Calors A, Bj'obtiens 50% chacun (comme prévu).

Pourquoi Cobtient-on 66%? Je m'attendais à 33% chacun dans ce scénario, ou peut-être 50% (C), 25% (A) et 25% (B). 66% va Cne fonctionne pas, peu importe comment je fais les calculs.

En général, je veux comprendre comment les processus lancés sans cgexecinteragir avec les processus lancés avec cgexecen matière de partage de ressources (CPU en particulier, mais une réponse plus générale serait appréciée si elle n'est pas trop complexe).

Micah Zoltu
la source
Tout d'abord, je me demande comment mesurez-vous le pourcentage d'utilisation du processeur? Quelles sont vos priorités A, B et C?
KWubbufetowicz
Je crois que je mesurais l'utilisation du processeur avec topet je pense qu'ils ont été démarrés assez simplement à partir d'une invite de commande: cgexec -g cpu:foo myprogramet ./myprogram. Cela fait un moment donc je ne m'en souviens pas avec certitude.
Micah Zoltu
Est-il possible que mon programme utilise plus qu'un seul thread / processus? Btw êtes-vous toujours intéressé à résoudre ce problème?
KWubbufetowicz
Le programme était une application de test écrite juste pour tester ce comportement. Il était intentionnellement monothread pour réduire les résultats. Je suis toujours intéressé par une réponse à cette question.
Micah Zoltu
Cette page de RedHat peut être utile ici. cpu.sharesest une option de configuration très particulière; Je recommande de diviser les choses par CPU si possible en utilisant à la cpuset.cpusplace.
Wildcard

Réponses:

3

Les groupes de contrôle sont hiérarchiques et sont hérités par tous les sous-processus. Tous les processus doivent donc être dans un groupe de contrôle. Par défaut, c'est le groupe racine et par défaut, il a 1024 partages, ce qui est deux fois A et B dans votre exemple.

Le temps CPU est partagé entre les cgroups en fonction du poids qui leur est attribué dans cpu.shares.

Si A avait 1024 actions et B 512 et C 256 et D 256, la distribution temporelle du processeur serait A - 50%, B - 25%, C et D 12,5%.

Lazy404
la source
Ainsi, tout processus non lancé avec cgexec se trouve dans le groupe racine avec 1024 partages, répartis également entre tous les enfants immédiats. Un tel enfant immédiat est le cgroup généré par l'appel cgexec. Ainsi, le non- cgexecprocessus obtiendrait 50% et les processus cgrouped partageraient tous les 50% restants. Dans les processus cgrouped, ils partagent leurs 50% également, ce qui signifie que les deux obtiennent 25%. Cela aurait du sens, mais ce n'est pas le comportement que j'ai observé. Ce que j'ai vu, c'est 66%, 33% et 33%. Pouvez-vous mettre à jour la réponse pour inclure plus de détails et peut-être un exemple de distribution?
Micah Zoltu
Oh, je pense que je vois. Tout processus sur le système d'exploitation lancé sans cgexecobtient 1024 partages. Tout processus lancé avec cgexecobtient les partages spécifiés. Donc, dans ce cas, un processus obtient 1024 partages et les deux autres 512, chacun, résultant en la distribution que j'ai vue. Pourriez-vous mettre à jour votre réponse pour donner un peu plus de clarté, par exemple avec un exemple?
Micah Zoltu
En fait, cela ne correspond toujours pas. 1024 + 512 + 512 = 2048. 512/2048 == 25%. Je ne crois pas que cette réponse soit réellement correcte, du moins pas en surface.
Micah Zoltu
avez-vous d'autres groupes de contrôle? Cela pourrait affecter les chiffres. Vous pouvez également consulter les documents redhat, il s'agit d'un exemple simmilar access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
Lazy404
Rien d'autre de significatif ne fonctionnait, la boîte était inactive avant et après le test. Tous les exemples montrent uniquement ce qui se passe lorsque tous les processus sont démarrés avec la configuration de cgroups. Il ne traite pas de ce qui se passe lorsque certains processus n'utilisent pas de groupes de contrôle, ce que j'essaie de comprendre.
Micah Zoltu