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
.