Como os cgroups interagem com processos não-cgrouped?

11

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 cgexec em grupos separados com compartilhamentos definidos para 512 e 512. O terceiro ( C ) é lançado regularmente, não com cgexec.

Quando todos estiverem em execução, C obterá 66% da CPU, enquanto A e B dividirão 33%. Se eu matar C , então A e B obterão 50% cada (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% indo para C não funciona, não importa como eu faço a matemática.

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

    
por Micah Zoltu 19.08.2015 / 21:55

1 resposta

2

Os 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, ele tem 1024 compartilhamentos, o que é duas vezes como A e B em Seu exemplo.

O tempo de CPU é compartilhado entre cgroups 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 de tempo de CPU seria A - 50%, B - 25%, C e D 12,5%.

    
por 31.05.2016 / 22:53

Tags