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 ( A
et 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, C
obtient 66% du processeur A
et se B
divise à 33%. Si je tue C
alors A
, B
j'obtiens 50% chacun (comme prévu).
Pourquoi C
obtient-on 66%? Je m'attendais à 33% chacun dans ce scénario, ou peut-être 50% (C), 25% (A) et 25% (B). 66% va C
ne fonctionne pas, peu importe comment je fais les calculs.
En général, je veux comprendre comment les processus lancés sans cgexec
interagir avec les processus lancés avec cgexec
en 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).
top
et je pense qu'ils ont été démarrés assez simplement à partir d'une invite de commande:cgexec -g cpu:foo myprogram
et./myprogram
. Cela fait un moment donc je ne m'en souviens pas avec certitude.cpu.shares
est une option de configuration très particulière; Je recommande de diviser les choses par CPU si possible en utilisant à lacpuset.cpus
place.Réponses:
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%.
la source
cgexec
. Ainsi, le non-cgexec
processus 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?cgexec
obtient 1024 partages. Tout processus lancé aveccgexec
obtient 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?1024 + 512 + 512 = 2048
.512/2048 == 25%
. Je ne crois pas que cette réponse soit réellement correcte, du moins pas en surface.