Calculando o uso de CPU de um cgroup durante um período de tempo

0

Se eu tiver um cgroup como user.slice e tiver CPUAccounting=true configurado, estou imaginando como calcular o uso da CPU desse cgroup em particular durante um período de tempo (como 1s), usando cpuacct.usage ou cpuacct.stat . Eu sei que cpuacct.usage fornece o tempo de CPU (em nanossegundos), que pode ser usado para calcular a porcentagem de CPU subtraindo dois instantâneos dele durante um período de tempo e dividindo-o pelo tempo total de CPU do sistema durante o mesmo período de tempo (corrija-me se estiver errado), mas não tenho certeza de como obter o tempo total da CPU durante um período de tempo.

Existe uma maneira de obter o tempo total da CPU durante um período de tempo ou usar um recurso de fórmula / cgroup diferente para calcular o uso da CPU? Agradecemos antecipadamente:)

Nota: estou ciente de systemd-cgtop , que fornece algumas dessas informações, no entanto, quero calcular o uso da CPU programaticamente sem ter que analisar systemd-cgtop

    
por Dylan 20.06.2018 / 01:52

1 resposta

1

A porcentagem de uso da CPU é a relação entre o tempo total em que a CPU estava ativa e o tempo decorrido do relógio na sua parede. Se você tentar comparar um tempo de CPU com outro tempo de CPU, isso não é porcentagem de uso. Não há nome para isso, é apenas a razão de um tempo de CPU para outro tempo de CPU.

Você já declarou que sabe como obter o tempo de CPU decorrido (tomando a diferença de tempo de CPU antes de & após seu período), portanto, basta dividir isso por tempo de relógio de parede.

cgroup=$(awk -F: '$2 == "cpu,cpuacct" { print $3 }' /proc/self/cgroup)

tstart=$(date +%s%N)
cstart=$(cat /sys/fs/cgroup/cpu/$cgroup/cpuacct.usage)

sleep 5

tstop=$(date +%s%N)
cstop=$(cat /sys/fs/cgroup/cpu/$cgroup/cpuacct.usage)

bc -l <<EOF
($cstop - $cstart) / ($tstop - $tstart) * 100
EOF

Se você quiser evitar a chamada para date (e cat ), use algo como: read tstart _ < /proc/uptime .

    
por 21.06.2018 / 03:18