Qual é a maneira mais justa de monitorar o tempo total da CPU - por usuário?

23

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:

  1. Obtenha cada usuário e os PIDs que estão executando por meio de ps aux
  2. Para cada PID, obtenha x , a soma de utime , cutime, stime e cstime de /proc/[pid]/stat
  3. calcule 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.

    
por Stefano Palazzo 24.02.2012 / 23:51

4 respostas

11

Parece que você precisa de contabilidade de processo.

link

No Ubuntu, as ferramentas de contabilidade de processo estão no acct package

Para obter um relatório por usuário, execute

sa -m
    
por Alan Bell 25.02.2012 / 01:40
2

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

    
por Linztm 05.03.2012 / 16:23
1

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
    
por Marques Johansson 10.04.2015 / 23:09
0

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
    
por Patrik Arlos 16.05.2017 / 14:52