Como os cgroups interagem com processos não agrupados?

12

Eu tenho 3 processos em uma máquina de núcleo único. Cada processo é exatamente o mesmo e queima a CPU o mais rápido possível (loop apertado). Dois deles ( Ae B) são lançados com o cgexec em grupos separados com compartilhamentos definidos para 512 e 512. O terceiro ( C) é iniciado regularmente, não com o cgexec.

Uma vez que todos estejam em operação, Cobtém 66% da CPU Ae Bdividem 33%. Se eu matar Cem seguida, Ae Bobter 50% de cada um (como esperado).

Por que Cobtém 66%? Eu teria esperado 33% cada neste cenário, ou talvez 50% (C), 25% (A) e 25% (B). 66% Cnão dão certo, não importa como eu faça as contas.

Em geral, quero entender como os processos iniciados sem cgexecinteragem com os processos iniciados cgexecquando se trata de compartilhamento de recursos (CPU em particular, mas uma resposta mais geral seria apreciada se não fosse muito complexo).

Micah Zoltu
fonte
Primeiro de tudo, eu me pergunto como você mede a porcentagem de uso da CPU? Quais são as prioridades que você executa A, B e C?
KWubbufetowicz
Acredito que estava medindo o uso da CPU tope acredito que eles foram iniciados de maneira bastante simples a partir de um prompt de comando: cgexec -g cpu:foo myprograme ./myprogram. Já faz um tempo, então não me lembro com certeza.
Micah Zoltu
Pode ser que o meu programa use mais do que um único thread / processo? Btw você ainda está interessado em resolver este problema?
KWubbufetowicz 27/02
O programa era um aplicativo de teste escrito apenas para testar esse comportamento. Foi intencionalmente único encadeado para restringir os resultados. Ainda estou interessado em uma resposta a esta pergunta.
Micah Zoltu
Esta página da RedHat pode ser útil aqui. cpu.sharesé uma opção de configuração muito peculiar; Eu recomendo dividir as coisas por CPUs, se possível usando em seu cpuset.cpuslugar.
Curinga

Respostas:

3

Cgroups são hierárquicos e são herdados por todos os subprocessos. Portanto, todos os processos devem estar em algum cgroup. Por padrão, é o cgroup raiz e, por padrão, possui 1024 compartilhamentos, que são duas vezes mais que A e B no seu exemplo.

O tempo da CPU é compartilhado entre os grupos de acordo com o peso atribuído a eles em cpu.shares.

Se A tivesse 1024 ações e B 512 e C 256 e D 256, a distribuição do tempo da CPU seria A - 50%, B - 25%, C e D 12,5%.

Lazy404
fonte
Portanto, qualquer processo não iniciado com o cgexec está no cgroup raiz com 1024 compartilhamentos, dividido igualmente entre todos os filhos imediatos. Um desses filhos imediatos é o cgroup gerado pela chamada cgexec. Portanto, o não cgexecprocesso obteria 50% e os processos agrupados compartilhariam os 50% restantes. Dentro dos processos agrupados, eles compartilham seus 50% igualmente, o que significa que ambos recebem 25%. Isso faria sentido, mas não é o comportamento que observei. O que eu vi é 66%, 33% e 33%. Você pode atualizar a resposta para incluir mais detalhes e talvez um exemplo de distribuição?
Micah Zoltu
Oh, acho que estou vendo. Qualquer processo iniciado no sistema operacional cgexecrecebe 1024 compartilhamentos. Qualquer processo iniciado com cgexecobtém os compartilhamentos especificados. Portanto, nesse caso, um processo recebe 1024 compartilhamentos e os outros dois recebem 512 cada, resultando na distribuição que eu vi. Você se importaria de atualizar sua resposta para dar um pouco mais de clareza, por exemplo, com um exemplo?
Micah Zoltu
Na verdade, isso ainda não corresponde. 1024 + 512 + 512 = 2048. 512/2048 == 25%. Não acredito que essa resposta esteja correta, pelo menos não na superfície.
Micah Zoltu
Você tem outros cgroups? Isso pode afetar os números. Você também pode verificar docs RedHat, ther é um exemplo simmilar access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/...
Lazy404
Nada mais importante em execução, a caixa estava ociosa antes e depois da execução do teste. Todos os exemplos mostram apenas o que acontece quando todos os processos são iniciados com a configuração do cgroups. Ele não discute o que acontece quando alguns processos não estão usando o cgroups, que é o que estou tentando descobrir.
Micah Zoltu