Não tenho certeza de expressar esta pergunta corretamente e tentei ler o man proc
, mas não consigo encontrar uma resposta adequada e não consegui encontrar uma maneira simples de verificá-la.
Tento obter o consumo de CPU/RAM para um PID, mas não sei quantos processos filhos serão convertidos pelo programa e quero obter a quantidade total de consumo de CPU e RAM, não apenas o processo principal.
Eu sei de fato e experiência que /proc/[PID]/io
é de fato cumulativo em todos os processos filhos, mas gostaria de saber e, se possível, com provas, se o mesmo se aplica a /proc/[PID]/stat
.
Conclusã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 somente quando o processo filho morre.
Explicação:
De acordo com o
man time
tempo retorna as seguintes estatísticas:Se alguém lê
man times
, pode aprender que a estrutura é definida como:O que significa que este comando retorna o usuário acumulado e o tempo de CPU do sistema do processo e todos os seus filhos.
Agora precisamos saber do que podemos extrair
/proc
. Naman proc
seção in/proc/[PID]/stat
você pode extrair as seguintes informações:Então, basicamente, este
/proc/[PID]/stat
arquivo contém o valor usado pelo tempo para determinar o tempo da CPU em segundosCom esse conhecimento, tentei executar meu script assim
time load.sh
e adiciono o final do scriptcat /proc/$$/stat
Aqui estão os resultados:saída do
time
comando:De acordo com
man proc
, precisamos olhar para as colunas 14,15,16 e 17:192 520 3964 1165
então, se somarmos o tempo gasto na CPU do usuário/sistema por processo e seus filhos.Et voilà, o tempo de CPU não é exatamente cumulativo, mas você pode calcular com bastante precisão (centissegundos) o tempo de CPU usado pelo seu programa e seus filhos usando
/proc/[PID]/stat
.EDIT:
Depois de mais testes e conversas com as pessoas, finalmente obtive uma resposta, executei um script que simplesmente contém:
E usando o relógio para monitorar a métrica
/proc/$$/stat
ao mesmo tempo. Enquanto o processo filho não for concluído, o contador não será atualizado. Quandostress
termina, o valor exibido em/proc/$$/stat
é atualizado e termina com resultado semelhante entretime
o comando e a coluna 14 a 17 de/proc
.Edição antiga
, pensei que tivesse acabado, mas depois de fazer mais algumas pesquisas, tentei o mesmo com o comandostress
Durante a execução observo 2 vezes/segundo o resultado do comando:
Enquantops faux | grep stress
me daria esse PID específico como pai dos quatrostress
threads.