Para medir o tempo total de CPU de um usuário, estou usando o campo "utime" em /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.
(do homem proc (5) )
Portanto, meu "user utime" é a soma utime
de todos os PIDs que este usuário está executando.
Espero que isso me dê um valor exato para o número de segundos de CPU que esse usuário gastou. Estou no caminho certo?
Algumas das coisas que ainda não entendo ou levo em consideração:
- Cada PID também possui um PID pai (ou zero). Mas estou contando todos os PID, não apenas aqueles com um ppid de 0. Isso está correto?
- Existem, além do horário de trabalho, horário, horário e horário. Preciso me preocupar com isso? Estou assumindo que utime é o número total de segundos da CPU para um PID, sem contar o pai.
Se eu calcular o tempo total da CPU do sistema usando /proc/uptime
, esse valor será bastante próximo da 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:
Recebo valores de "aparência sensata" para todos os tipos de coisas. No momento, estou usando a soma de utime, stime, cutime e cstime. E relata valores que, embora eu não os entenda, se correlacionam muito bem com as medidas de time
.
Se eu estou completamente no caminho errado, há outra pergunta:
- Qual é a maneira mais justa de monitorar o tempo total de CPU - por usuário? (+500 Recompensas) no Ask Ubuntu
/proc/cputime
não possui nenhuma informação sobre o tempo gasto pelos processos de execução das CPUs, por isso estou intrigado com o cálculo do seu "system cpu_time". Se você estiver fazendo algo com o segundo número, é o tempo gasto na tarefa inativa ; Não sei exatamente o que isso significa na prática./proc/uptime
? Então acho que a E / S atribuída à tarefa ociosa explicaria a diferença. Como não sei nada sobre o assunto, suspeito que esteja perdendo algo importante: não esperaria que muita coisa acontecesse na tarefa ociosa, especialmente considerando que sua soma de cputime de usuários provavelmente está perdendo muito tempo. processos vividos.Respostas:
A maneira tradicional de registrar e rastrear o tempo de CPU do usuário é a contabilidade do processo . No Linux, instale os utilitários de contabilidade GNU , geralmente fornecidos por um pacote chamado
acct
. Não tenho certeza de quão preciso será em acompanhar o 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 um (arredondado para ~ 10ms para processos de curta duração, esperamos ver muitos0.00
). Executesa
para exibir várias somas e estatísticas. Em particular,sa -m
exibe totais por usuário. As estatísticas acumuladas porsa
execução a partir da última rotação dos logs contábeis (normalmente localizadas em/var/log/account/
).Observe que você não irá capturar todos os processos amostrando a intervalos, e não muito longe. Você perderá quase todos os processos de vida curta 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 na computação, em oposição ao tempo do sistema gasto na E / S. Qual contar depende do que você deseja fazer com as informações.Contar todos os PIDs está certo. Não sei o que o pai PID tem a ver com isso.
No lado do sistema, sua descrição
/proc/uptime
parece errada. A Wikipedia está certa como eu escrevo. O primeiro campo é o tempo real decorrido desde a inicialização do sistema, menos o tempo gasto em suspensão ou hibernação. O segundo campo é o tempo acumulado gasto na tarefa inativa em todas as CPUs. Não tenho certeza do que isso realmente significa; certamente não é o tempo total ocioso na minha máquina. No kernel, o valor é somado na partir de variáveis atualizados em .uptime_proc_show
account_idle_time
fonte
sa
encerramento do processo antes de informar que é hora da CPU?