AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 426972
Accepted
Kiwy
Kiwy
Asked: 2018-02-28 08:36:15 +0800 CST2018-02-28 08:36:15 +0800 CST 2018-02-28 08:36:15 +0800 CST

/proc/[PID]/stat exibe estatísticas cumulativas de CPU sobre processos filho

  • 772

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.

proc
  • 1 1 respostas
  • 4311 Views

1 respostas

  • Voted
  1. Best Answer
    Kiwy
    2018-03-13T03:02:55+08:002018-03-13T03:02:55+08:00

    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 timetempo retorna as seguintes estatísticas:

    Essas estatísticas consistem em (i) o tempo real decorrido entre a invocação e o encerramento, (ii) o tempo de CPU do usuário (a soma dos valores tms_utime e tms_cutime em um struct tms conforme retornado por times(2)) e (iii) o tempo de CPU do sistema (a soma dos valores tms_stime e tms_cstime em um struct tms conforme retornado por times(2)).

    Se alguém lê man times, pode 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 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. Na man procseção in /proc/[PID]/statvocê pode extrair as seguintes informações:

    (14) utime %lu
    Quantidade de tempo que este processo foi agendado no modo de usuário, medido em pulsos de clock (dividir por sysconf(_SC_CLK_TCK)). Isso inclui o tempo do convidado, guest_time (tempo gasto executando uma CPU virtual, veja abaixo), para que os aplicativos que não estão cientes do campo de tempo do convidado não percam esse tempo de seus cálculos.
    (15) stime %lu
    Quantidade de tempo que este processo foi agendado no modo kernel, medido em pulsos de clock (dividir por sysconf(_SC_CLK_TCK)).
    (16) cutime %ld
    Quantidade de tempo que os filhos esperados deste processo foram agendados no modo de usuário, medido em pulsos de relógio (dividir por sysconf(_SC_CLK_TCK)). (Consulte também times(2).) Isso inclui o tempo do convidado, cguest_time (tempo gasto executando uma CPU virtual, veja abaixo).
    (17) cstime %ld
    Quantidade de tempo que os filhos esperados deste processo foram agendados no modo kernel, medido em pulsos de relógio (dividir por sysconf(_SC_CLK_TCK)).

    Então, basicamente, este /proc/[PID]/statarquivo contém o valor usado pelo tempo para determinar o tempo da CPU em segundos

    Com esse conhecimento, tentei executar meu script assim time load.she adiciono o final do script cat /proc/$$/statAqui 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 timecomando:

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

    De acordo com man proc, precisamos olhar para as colunas 14,15,16 e 17: 192 520 3964 1165então, se somarmos o tempo gasto na CPU do usuário/sistema por 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 (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:

    #!/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 /proc/$$/statao mesmo tempo. Enquanto o processo filho não for concluído, o contador não será atualizado. Quando stresstermina, o valor exibido em /proc/$$/staté atualizado e termina com resultado semelhante entre timeo 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

    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 observo 2 vezes/segundo o resultado do comando:

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

    Enquanto ps faux | grep stressme daria esse PID específico como pai dos quatro stressthreads.

    • 5

relate perguntas

  • Unidades de medida em /proc/<pid>/schedstat

  • Faça alterações permanentes em `/proc/acpi/wakeup`

  • Leia /proc/pid/maps usando read()

  • quais são as desvantagens de dividir /proc/pid/stat por espaço em branco?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve