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 ( A
e 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, C
obtém 66% da CPU A
e B
dividem 33%. Se eu matar C
em seguida, A
e B
obter 50% de cada um (como esperado).
Por que C
obtém 66%? Eu teria esperado 33% cada neste cenário, ou talvez 50% (C), 25% (A) e 25% (B). 66% C
não dão certo, não importa como eu faça as contas.
Em geral, quero entender como os processos iniciados sem cgexec
interagem com os processos iniciados cgexec
quando se trata de compartilhamento de recursos (CPU em particular, mas uma resposta mais geral seria apreciada se não fosse muito complexo).
top
e acredito que eles foram iniciados de maneira bastante simples a partir de um prompt de comando:cgexec -g cpu:foo myprogram
e./myprogram
. Já faz um tempo, então não me lembro com certeza.cpu.shares
é uma opção de configuração muito peculiar; Eu recomendo dividir as coisas por CPUs, se possível usando em seucpuset.cpus
lugar.Respostas:
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%.
fonte
cgexec
. Portanto, o nãocgexec
processo 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?cgexec
recebe 1024 compartilhamentos. Qualquer processo iniciado comcgexec
obté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?1024 + 512 + 512 = 2048
.512/2048 == 25%
. Não acredito que essa resposta esteja correta, pelo menos não na superfície.