A soma de todos os PIDs é o tempo total do sistema?

8

Para medir o tempo total de CPU de um usuário, estou usando o campo "utime" de /proc/[pid]/stat :

utime %lu   Amount of time that this process has been scheduled in user
            mode, measured in clock ticks (divide by
            sysconf(_SC_CLK_TCK).  This includes guest time, guest_time
            (time spent running a virtual CPU, see below), so that
            applications that are not aware of the guest time field do
            not lose that time from their calculations.

(de man proc (5) )

Então, meu "user utime" é a soma do utime de todos os PIDs que este usuário está executando.

Espero que isso me dê um valor preciso para o número de segundos de CPU que esse usuário gastou. Estou no caminho certo?

Algumas das coisas que ainda não entendi ou levo em conta:

  • Cada PID também possui um PID pai (ou zero). Mas eu estou contando cada PID, não apenas aqueles com um ppp de 0. Isso está correto?
  • Há, além do tempo, o stime, o cutime e o cstime. Preciso me preocupar com isso? Estou assumindo que utime é o número total de segundos de cpu para um PID, sem contar o pai.

Se eu calcular o tempo total de CPU do sistema usando /proc/uptime , esse valor é bastante próximo à minha soma para todos os usuários, mas a diferença é significativa. Por exemplo (em minutos):

system cpu_time:         96.13
sum of users_cputime:   111.45

Correção:

Eu obtenho valores "sensatos" para todos os tipos de coisas. No momento, estou usando a soma do tempo, do ritmo e do tempo. E relata valores que, embora eu não os entenda, se correlacionam muito bem com as medições de time .

Se eu estiver completamente errado, há outra pergunta:

por Stefano Palazzo 24.02.2012 / 19:49

1 resposta

3

A maneira tradicional de registrar e acompanhar o tempo de CPU do usuário é contabilidade do processo . No Linux, instale os utilitários de contabilidade GNU , normalmente fornecidos por um pacote chamado acct . Não tenho certeza de quão preciso será manter o controle do tempo gasto em processos de vida muito curta, mas pelo menos listará todos os processos já executados.

Execute lastcomm para obter uma lista de todos os comandos executados por qualquer usuário e o tempo gasto em cada (arredondado para ~ 10ms para processos de curta duração, espere ver muito 0.00 ). Execute sa para exibir várias somas e estatísticas. Em particular, sa -m exibe totais por usuário. As estatísticas acumuladas por sa são executadas a partir da última rotação dos registros contábeis (geralmente localizada em /var/log/account/ ).

Note que você não vai pegar todos os processos por amostragem em intervalos, não de longe. Você perderá quase todos os processos de curta duração e os últimos segundos de processos longos. A contabilidade de processos lista todos os processos anteriores.

Em /proc/$pid/stat , o tempo do usuário é o tempo gasto fazendo computação, em oposição ao tempo gasto no sistema fazendo I / O. Qual deles depende depende do que você quer fazer com a informação.

A contagem de todos os PIDs está correta. Eu não sei o que o pai PID tem a ver com isso.

No lado do sistema, sua descrição de /proc/uptime parece errada. Wikipedia está certo quando escrevo. O primeiro campo é o tempo real decorrido desde o início do sistema, menos o tempo gasto suspenso ou em hibernação. O segundo campo é o tempo acumulado gasto na tarefa ociosa em todas as CPUs. Não tenho certeza do que isso realmente significa; certamente não é o tempo ocioso total na minha máquina. No kernel, o valor é somado em uptime_proc_show de variáveis atualizadas em account_idle_time .

    
por 25.02.2012 / 02:12