Calcula o uso total de CPU de um namespace PID

2

Gostaria de monitorar o uso da CPU para todos os processos em um namespace PID específico. Eu gostaria de fazer isso de forma programática (C, se possível). Eu tenho uma ideia de como fazê-lo, mas gostaria de saber se o Linux oferece uma maneira mais simples / melhor.

Por exemplo, posso usar apenas os valores cutime e cstime do processo init do namespace para obter o uso total da CPU? Além disso, se montar o sistema de arquivos /proc do namespace (em vez do namespace raiz), /proc/stat mostrará apenas a utilização da CPU desse namespace específico?

Solução possível:

  • Iniciar um novo processo dentro do namespace do PID
  • Monte o sistema de arquivos /proc do namespace em algum lugar seguro
  • A cada alguns milissegundos, leia o diretório /proc e calcule o uso da CPU para cada processo listado dentro
  • Use o IPC para comunicar o valor agregado ao processo pai
por Azmisov 02.02.2016 / 18:34

1 resposta

1

For instance, could I just use the cutime and cstime values of the namespace's init process to get total CPU usage?

Isso incluirá apenas o tempo dos filhos e descendentes esperados para (e, portanto, terminados) (ou processos processados no caso de init ). Então você só terá tempo para os órfãos mortos.

Se você calcular a soma do cutime e cstime de todos os processos no namespace (cuidado com as condições de corrida), você deve obter o tempo acumulado de todos os processos atuais e passados nesse namespace, exceto aqueles que se juntaram ao namespace nsenter -p ) cujo tempo será contabilizado para seu pai no namespace original (eu acho que esses processos têm um PPID de 0 no namespace inserido).

Also, if I mount the namespace's /proc filesystem (rather than the root namespace's), will /proc/stat only show CPU utilization of that particular namespace?

Isso é facilmente verificado:

$ grep cpu /proc/stat
cpu  69003764 88576 8499514 244070762 5120799 0 407453 0 0 0
cpu0 34269946 49008 4228860 122466614 2365498 0 55409 0 0 0
cpu1 34733818 39567 4270653 121604147 2755300 0 352044 0 0 0
$ sudo unshare --mount-proc -mpf grep cpu /proc/stat
cpu  69005266 88576 8499588 244072663 5120837 0 407462 0 0 0
cpu0 34270449 49008 4228896 122467803 2365522 0 55410 0 0 0
cpu1 34734816 39567 4270692 121604860 2755315 0 352051 0 0 0

Então, parece que não.

AFAICT, você deve ser capaz de calcular as estatísticas do namespace raiz.

Por exemplo, para o namespace de pid $pid , com zsh e perl :

perl -l -0777 -ne '
   if (/\(.*\)(?: .*?){12} (.*?) (.*?) (.*?) (.*?)/) {$s+=$1+$2+$3+$4}
   END{print $s}' /proc/*/ns/pid(e:'[[ $REPLY -ef /proc/$pid/ns/pid ]]'::h:s/ns/stat)

Ou seja, some os campos 14 a 17 do / proc / pid / stat de todos os processos que tenham o mesmo namespace pid como $pid .

Como dito acima, isso não inclui o tempo de processos que têmnsenter ed o espaço do nome mais tarde e morreram (nem os filhos que eles esperaram (os outros parecem ser copiados pelo init do namespace) ).

    
por 02.02.2016 / 23:24

Tags