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.Respostas:
Parece que você precisa da contabilidade do processo.
http://www.faqs.org/docs/Linux-mini/Process-Accounting.html
No Ubuntu, as ferramentas de contabilidade de processo estão no
acct
pacotePara obter um relatório por usuário, execute
fonte
/proc/[pid]/stat
.sa
(.ps.gz) . E também tenho uma boa maneira de "estimar" esses processos de longa execução, antes de, eventualmente, obter um valor preciso para eles também. Afinal, vamos usá-lo, e estou mais do que feliz em atribuir a recompensa à sua resposta. Muito obrigado!Isso fornecerá uma linha para cada usuário, mostrando o nome de usuário e o tempo total da CPU:
fonte
Uma das respostas mais óbvias é apenas estender o que você está fazendo atualmente.
Me deparei com esse processo de monitor usando o bash scripting e o mysql para rastrear o tempo da CPU dos usuários, mas ele se estendeu por um período muito maior do que você estava falando.
Espero que isso possa lhe dar mais algumas idéias sobre a direção que você está procurando seguir.
http://www.dba-oracle.com/t_oracle_unix_linux_vmstat_capture.htm
fonte
Isso também tratará dos processos que estão em execução há dias .. não sei como expandir por semanas / meses / anos.
fonte