O / proc / [PID] / stat exibe estatísticas cumulativas da CPU sobre processos filhos

1

Não tenho certeza de expressar essa pergunta corretamente e tento ler o man proc , mas não consigo encontrar uma resposta adequada e não consegui encontrar uma maneira simples de verificá-la. < br> Eu tento obter o consumo de CPU / RAM para um PID, mas eu não sei quantos processos filho serão lançados pelo programa e eu quero obter o total de CPU e consumo de RAM não apenas o processo principal. Eu sei de fato e experiência que /proc/[PID]/io é de fato cumulativo através de todos os processos filhos, mas eu gostaria de saber e se possível com prova se o mesmo se aplica a /proc/[PID]/stat .

    
por Kiwy 27.02.2018 / 17:36

1 resposta

2

Conlusão:
Se você não quiser ler toda a explicação, leia isto:
Sim, o valor contido em / proc / [PID] / stat permite determinar a quantidade de tempo de CPU usado por um processo e seus filhos.
No entanto, você não pode usá-lo para monitoramento em tempo real, porque o valor para o tempo de CPU dos filhos é atualizado apenas quando o processo filho morrer.

Explicação:
De acordo com o man time time, retorna as seguintes estatísticas:

These statistics consist of (i) the elapsed real time between invocation and termination, (ii) the user CPU time (the sum of the tms_utime and tms_cutime values in a struct tms as returned by times(2)), and (iii) the system CPU time (the sum of the tms_stime and tms_cstime values in a struct tms as returned by times(2)).

Se alguém ler man times , poderá aprender que a estrutura é definida como:

struct tms {
   clock_t tms_utime;  /* user time */
   clock_t tms_stime;  /* system time */
   clock_t tms_cutime; /* user time of children */
   clock_t tms_cstime; /* system time of children */
};

O que significa que esse comando retorna o tempo de CPU acumulado do usuário e do sistema do processo e de todos os seus filhos.
Agora precisamos saber o que podemos extrair de /proc . No man proc na seção /proc/[PID]/stat , você pode extrair as seguintes informações:

(14) 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.
(15) stime %lu
Amount of time that this process has been scheduled in kernel mode, measured in clock ticks (divide by sysconf(_SC_CLK_TCK)).
(16) cutime %ld
Amount of time that this process's waited-for children have been scheduled in user mode, measured in clock ticks (divide by sysconf(_SC_CLK_TCK)). (See also times(2).) This includes guest time, cguest_time (time spent running a virtual CPU, see below).
(17) cstime %ld
Amount of time that this process's waited-for children have been scheduled in kernel mode, measured in clock ticks (divide by sysconf(_SC_CLK_TCK)).

Então, basicamente, esse arquivo /proc/[PID]/stat contém o valor usado pelo tempo para determinar o tempo de CPU em segundos

strong desse conhecimento Eu tentei executar o meu script como este time load.sh e eu adiciono o final do script cat /proc/$$/stat Aqui estão os resultados:

9398 (load.sh) S 5379 9398 5379 34817 9398 4194304 1325449 7562836 0 0 192 520 3964 1165 20 0 1 0 814903 14422016 1154 18446744073709551615 4194304 5242124 140726473818336 0 0 0 65536 4 65538 1 0 0 17 3 0 0 818155 0 0 7341384 7388228 9928704 140726473827029 140726473827049 140726473827049 140726473830382 0  

saída do comando time :

real    0m38,783s
user    0m41,576s
sys     0m16,866s

De acordo com man proc , precisamos examinar as colunas 14,15,16 e 17: 192 520 3964 1165 so, se somarmos o tempo gasto na CPU do usuário / sistema pelo processo e seus filhos.

192+3964 = 4156  <=>  user 0m41,576s
520+1165 = 1685  <=>  sys  0m16,866s

Et voilà, o tempo de CPU não é exatamente cumulativo, mas você pode calcular com bastante precisão (centésimo segundo) o uso do tempo de CPU pelo seu programa e seus filhos usando /proc/[PID]/stat .

EDITAR:
Depois de mais testes e conversas com pessoas, finalmente recebi uma resposta, eu executei um script que simplesmente contém:

#!/bin/bash
sleep 5
time stress --cpu 4 -t 60s --vm-hang 15
sleep 5
cat /proc/$$/stat | cut -d ' ' -f 14-17
exit

E usando o relógio para monitorar a métrica em /proc/$$/stat ao mesmo tempo. Enquanto o processo filho não estiver concluído, o contador não será atualizado. Quando stress terminar, o valor exibido em /proc/$$/stat será atualizado e terminará com resultado semelhante entre o comando time e as colunas 14 a 17 de /proc .

Edição antiga Eu pensei que tinha acabado, mas depois de fazer mais algumas pesquisas, tentei o mesmo com o comando stress

time stress --cpu 4 -t 60s  
stress: info: [18598] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
stress: info: [18598] successful run completed in 60s
real    1m0,003s
user    3m53,663s
sys     0m0,349s

Durante a execução eu vejo 2 vezes / segundo o resultado do comando:

cat /proc/11223/stat | cut -d ' ' -f 14-17
0 0 0 0

Enquanto ps faux | grep stress me daria esse PID em particular como pai do thread de quatro stress .

    
por 12.03.2018 / 12:02

Tags