Parece que você precisa de contabilidade de processo.
No Ubuntu, as ferramentas de contabilidade de processo estão no acct
package
Para obter um relatório por usuário, execute
sa -m
Em um sistema multiusuário, quero medir o uso de CPU de cada usuário em segundos de tempo de CPU. Para o propósito desta medida, eu assumo que se um PID pertence a um usuário, este usuário está causando o tempo de CPU - ou seja, eu estou ignorando daemons e o kernel.
Atualmente estou fazendo isso a cada cinco segundos:
ps aux
x
, a soma de utime , cutime, stime e cstime de /proc/[pid]/stat
t = x / interval
(o intervalo nem sempre é exatamente 5 segundos quando há carga alta) Se eu executar isso, obtenho valores sensatos. Por exemplo: Um usuário neste sistema estava girando em python ( while True: pass
), e o sistema estava mostrando cerca de 750 milissegundos de tempo de CPU por segundo. Quando o sistema ficou pendurado por um pouco, ele relatou 1600ms para um intervalo de 1 segundo. O que parece certo, mas eu entendo que esses valores podem ser enganosos, especialmente considerando que eu não os entendo realmente
Então, minha pergunta é esta:
Qual é a maneira correta e correta de medir a carga da CPU por usuário?
O método tem que ser bastante preciso. Pode haver muitas centenas de usuários nesse sistema, portanto, extrair porcentagens de ps aux
não será preciso o suficiente, especialmente para encadeamentos de curta duração que 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 acompanha o tempo de criação de um processo, bem como o tempo de CPU que ele consome durante sua vida útil. A cada pulso de clock, o kernel atualiza a quantidade de tempo em jiffies que o processo atual passou no sistema e no modo de usuário. - (do projeto de documentação do Linux )
O valor que eu sou depois é a quantidade de segundos (ou passagens) que um usuário gastou na CPU, não uma porcentagem do carregamento do sistema ou do uso da CPU.
É importante medir o tempo de CPU enquanto os processos ainda estão em execução. Alguns processos durarão apenas meio segundo, alguns durarão por muitos meses - e precisamos capturar os dois tipos, para que possamos contabilizar o tempo de CPU dos usuários com granularidade fina.
Uma das respostas mais óbvias é simplesmente estender o que você está fazendo atualmente.
Eu me deparei com esse processo de monitoramento para usar o bash scripting e o mysql para rastrear o tempo de CPU dos usuários, mas ele foi dividido em um período de tempo muito maior do que o que você estava falando.
Espero que isso possa lhe dar mais algumas ideias sobre a direção que você está procurando.
link
Isso fornecerá uma linha para cada usuário mostrando o nome de usuário e o tempo total da CPU:
ps -w -e --no-header -o uid,user \
| sort -u \
| while read uid user; do
echo -e "$user\t"$(
ps --no-headers -u $uid --cumulative -o time \
| sed -e s/:/*3600+/ -e s/:/*60+/ \
| paste -sd+ \
| bc
);
done
Isso também lida com processos que estão em execução há dias. Não sei como expandir por semanas / meses / anos.
ps -w -e --no-header -o uid,user \
| sort -u \
| while read uid user; do
echo -e "$user\t"$(
ps --no-headers -u $uid --cumulative -o time \
| sed -e s/-/*86400+/ -e s/:/*3600+/ -e s/:/*60+/
| paste -sd+ \
| bc
);
done