Em um sistema multiusuário, desejo medir o uso da CPU de cada usuário em segundos de tempo da CPU. Para os fins desta medição, presumo que, se um PID pertence a um usuário, ele está causando o tempo de CPU - ou seja, estou ignorando os daemons e o kernel.
Atualmente, estou fazendo isso a cada cinco segundos:
- Obtenha cada usuário e os PIDs que estão executando por meio de
ps aux
- Para cada PID, obtenha
x
a soma de utime, cutime, stime e cstime de/proc/[pid]/stat
- calcular
t = x / interval
(o intervalo nem sempre é exatamente 5 segundos quando há carga alta)
Se eu executar isso, obtenho valores de aparência sensatos. Por exemplo: Um usuário neste sistema estava girando em python ( while True: pass
) e o sistema mostrava cerca de 750 milissegundos de tempo de CPU por segundo. Quando o sistema travou um pouco, ele relatou 1600ms por um inverval de 1 segundo. O que parece certo, mas eu entendo que esses valores podem ser enganosos, especialmente porque eu realmente não os entendo.
Então, minha pergunta é esta:
Qual é uma maneira justa e correta de medir a carga da CPU por usuário?
O método deve ser bastante preciso. Pode haver muitas centenas de usuários nesse sistema, portanto, a extração de porcentagens ps aux
não será precisa o suficiente, especialmente para threads de vida curta, dos quais muitos softwares gostam de gerar.
Embora isso possa ser complicado, eu absolutamente sei que é possível. Este foi o meu ponto de partida:
O kernel controla o tempo de criação de processos, bem como o tempo de CPU que consome durante sua vida útil. A cada tique do relógio, o kernel atualiza a quantidade de tempo em instantes que o processo atual passou no sistema e no modo de usuário. - (do projeto de documentação do Linux )
O valor que busco é a quantidade de segundos (ou instantes) que um usuário gasta na CPU, não uma porcentagem da carga do sistema ou uso da CPU.
É importante medir o tempo da CPU enquanto os processos ainda estão em execução. Alguns processos duram apenas meio segundo, outros duram muitos meses - e precisamos capturar os dois tipos, para podermos contabilizar o tempo de CPU dos usuários com granularidade fina.
top
pode fazer o modo em lote? top -b -n 1 -u {user} | awk 'NR>7 { sum += $9; } END { print sum; }'
deve mostrar a carga para {usuário} naquele momento.