Desejo calcular programaticamente [em C] a porcentagem de uso da CPU para um determinado ID de processo no Linux.
Como podemos obter a% de uso da CPU em tempo real para um determinado processo?
Para deixar mais claro:
- Devo ser capaz de determinar o uso da CPU para o processid ou processo fornecido.
- O processo não precisa ser filho.
- Quero a solução em linguagem 'C'.
Respostas:
Você precisa analisar os dados de
/proc/<PID>/stat
. Estes são os primeiros campos (daDocumentation/filesystems/proc.txt
fonte do kernel):Você provavelmente está atrás
utime
e / oustime
. Você também precisará ler acpu
linha de/proc/stat
, que se parece com:Isso informa o tempo de CPU cumulativo que foi usado em várias categorias, em unidades de jiffies. Você precisa obter a soma dos valores nesta linha para obter uma
time_total
medida.Leia ambos
utime
estime
para o processo que você está interessado, e lertime_total
a partir/proc/stat
. Em seguida, durma por um segundo ou mais e leia todos novamente. Agora você pode calcular o uso da CPU do processo ao longo do tempo de amostragem, com:Faz sentido?
fonte
/proc/stat
informa quantos jiffies a CPU executou no total e/proc/<PID>/stat
quantos jiffies foram executados por um único processo.man proc
is your friend (pesquisar por/proc/[pid]/stat
)/proc
pseudo-sistema de arquivos: o ensino das funções de acesso do sistema de arquivos C padrão é semelhantefopen()
e nãoscanf()
vem ao caso.getrusage () pode ajudá-lo a determinar o uso do processo atual ou de seu filho
Atualização: não me lembro de uma API. Mas todos os detalhes estarão em / proc / PID / stat, então se pudermos analisá-los, podemos obter a porcentagem.
EDIT: Uma vez que CPU% não é fácil de calcular, você poderia usar o tipo de amostragem aqui. Leia ctime e utime para um PID em um ponto no tempo e leia os mesmos valores novamente após 1 segundo. Encontre a diferença e divida por cem. Você obterá a utilização desse processo por mais de um segundo.
(pode ficar mais complexo se houver muitos processadores)
fonte
Passo a passo fácil para iniciantes como eu:
/proc/stat
para obtertotal_cpu_usage1
./proc/pid/stat
ondepid
está o PID do processo que deseja saber o uso da CPU, assim:usertime
esystemtime
e getproc_times1
total_cpu_usage2
eproc_times2
A fórmula é:
Você pode obter a quantidade de CPU de
/proc/cpuinfo
.fonte
#include <unistd.h>
e chame este métodoint nb = sysconf(_SC_NPROCESSORS_ONLN);
Eu escrevi duas pequenas funções C com base na resposta de cafs para calcular o uso de CPU + kernel de um processo: https://github.com/fho/code_snippets/blob/master/c/getusage.c
fonte
Você pode ler o manual do proc para obter mais detalhes, mas em resumo, você pode ler / proc / [número] / stat para obter as informações sobre um processo. Isso também é usado pelo comando 'ps'.
Todos os campos e seus especificadores de formato scanf são documentados no proc manpag e.
Aqui estão algumas das informações da página de manual copiada (é bem longa):
fonte
ps aux
is better :)Dê uma olhada no comando "pidstat", soa exatamente como você precisa.
fonte
Esta é a minha solução ...
fonte
Quando você deseja monitorar o processo especificado, geralmente isso é feito por script. Aqui está um exemplo de perl. Isso coloca as porcentagens da mesma forma que no topo, transferindo-as para uma CPU. Então, quando algum processo está ativo trabalhando com 2 threads, o uso da CPU pode ser superior a 100%. Observe especialmente como os núcleos da CPU são contados: D, então, deixe-me mostrar meu exemplo:
Espero que ajude em algum monitoramento. É claro que você deve usar scanf ou outras funções C para converter qualquer regexpes perl que usei em código-fonte C. Claro que 1 segundo para dormir não é obrigatório. você pode usar a qualquer momento. efeito é, você obterá carga média no período de tempo especificado. Quando você for usá-lo para monitorar, é claro que os últimos valores que você deve colocar de fora. É necessário, porque o monitoramento geralmente chama scripts periodicamente, e o script deve terminar seu trabalho o mais rápido possível.
fonte
Instale
psacct
ouacct
empacote. Em seguida, use osa
comando para exibir o tempo de CPU usado para vários comandos. uma página de manualUm bom tutorial do site nixCraft.
fonte
Acho que vale a pena olhar o código-fonte do comando GNU "time". time Produz o tempo da CPU do usuário / sistema junto com o tempo real decorrido. Ele chama a chamada do sistema wait3 / wait4 (se disponível) e, caso contrário, ele chama a chamada do sistema vezes. wait * chamada do sistema retorna uma variável de estrutura "rusage" e vezes que a chamada do sistema retorna "tms". Além disso, você pode dar uma olhada na chamada do sistema getrusage, que também retorna informações de tempo muito interessantes. Tempo
fonte
Em vez de analisar isso a partir de proc, pode-se usar funções como getrusage () ou clock_gettime () e calcular o uso da cpu como uma razão ou tempo de parede e tempo do processo / thread usado na cpu.
fonte
Use strace encontrado que o uso da CPU precisa ser calculado por um período de tempo:
fonte