Meu cgroup está sobrecarregado?

2

Suponha que eu limite os núcleos que um conjunto de processos pode usar com a opção cgroup / cpuset.

Eu preciso saber se tenho muitos threads alocados para esse cgroup, se os threads estiverem com uma competição excessiva pelos núcleos disponíveis.

Como posso fazer isso?

Sem o cgropups, basta usar a média de carregamento em top com a regra geral de que a média de carga deve ser menor que o número de núcleos. Existe algo semelhante que leva cgroup / cpuset em conta?

    
por Arkadiy 18.04.2018 / 16:02

1 resposta

1

Dependendo do que exatamente você gosta, existem duas opções:

Se você se importa com quantos threads / processos estão no cgroup, mas não com a 'média de carga':

Simplesmente conte as linhas no arquivo tasks para o cgroup. Este arquivo será atualizado automaticamente sempre que um thread ou processo for criado ou removido no cgroup.

Se você se preocupa com a utilização real:

Isso é um pouco mais complicado. Você pode obter uma lista de processos / threads no cgroup do arquivo tasks acima mencionado e, em seguida, verificar o uso de cada PID usando /proc , mas essa abordagem tem tantas condições de corrida que você pode monetizar como um esporte competitivo. Como alternativa, se você estiver usando cgroups da versão 2, poderá verificar o arquivo cpu.stat no cgroup. Este arquivo terá algumas linhas contando microssegundos de tempo de CPU consumidos pelo cgroup, para que você possa obter uma estimativa aproximada do uso, verificando duas vezes um segundo e dividindo a diferença por 10 para obter uma porcentagem de utilização (100% para total utilização de um núcleo, 20% para a plena utilização de dois, etc). Uma abordagem semelhante pode ser feita com os cgroups da versão 1 com o controlador cpuacct (crie um cgroup sob esse controlador espelhando o que você criou sob o controlador cpuset).

    
por 18.04.2018 / 21:56