(uptime-(idle_time/num_core))
Pode dar uma ideia de há quanto tempo o sistema está ocupado, em segundos. A multiplicação por 100 faz com que seja centésimos de segundos - essa é a sua intenção?
IMO faria mais sentido considerar quantos segundos do processador estavam disponíveis e subtrair o tempo ocioso daquele:
uptime * num_core - idle_time = total active processor seconds
Uma métrica de utilização pode ser:
active seconds / (uptime * num_core)
Por exemplo, se o sistema estiver ativo por 10 segundos em 4 núcleos com 5 segundos de idle_time:
(10 * 4 - 5) / (10 * 4) = 0.875
87,5% de utilização.
Ou:
(10 - 5 / 4) / 10 = 0.875
A mesma coisa, salva uma operação.
Is there a better way to get CPU utilization as a counter?
Eu fiz isso em uma biblioteca C ++ de diagnóstico do sistema analisando a primeira linha de /proc/stat
, que é um total combinado para todos os núcleos. Os três primeiros campos são hora do usuário, baixa prioridade (aka nice) e hora do sistema. O total destes é a quantidade de tempo ativo (note que a unidade aqui não é segundos, veja /proc/stat
sob man proc
).
Se você fizer polling por mais de 5 segundos, assumindo um USER_HZ de 100, onde total_a
é
o primeiro exemplo (user + nice + sys) e total_b
é o segundo exemplo:
(total_b - total_a) / 5 / 100 / num_cores = usage ratio
Se você multiplicar isso por 100, terá uma porcentagem indicando uma média no intervalo de 5 segundos.
Veja a lógica:
-
total_b - total_a
= tempo ativo entre as amostras -
Dividido pela duração da amostra, 5 segundos.
-
Dividido pelas unidades por segundo da medida (USER_HZ)
-
Dividido pelo número de núcleos
USER_HZ é quase certamente 100. Para verificar:
#include <stdio.h>
#include <unistd.h>
int main (void) {
printf (
"%ld\n",
sysconf(_SC_CLK_TCK)
);
return 0;
}
Compilação: gcc whatever.c
, executar ./a.out
.
Será difícil obter uma duração precisa para isso com ferramentas de shell, para que você possa manter uma medida crescente do tempo total de atividade (acho que é sua intenção) ou usar um intervalo bastante longo, por exemplo, 30+ segundos