Como obter uma média de carga de processo sem ferramentas

0

Eu quero listar processos e suas informações no meu programa. A maior quantidade de informação que posso obter de / proc / [pid]. Como o top, o htop etc obtém a carga média de um processo?

    
por ManuelSchneid3r 15.11.2017 / 20:21

2 respostas

2

A carga de um sistema, é o número médio de processos (thread) na fila de execução (isto é, executando ou esperando para ser executado) (e no Linux processos em sono ininterrupto , o estado D abaixo) durante algum período.

No Linux, disponível em /proc/loadavg nos últimos 1, 5 e 15 minutos.

Para ver o que esses threads atualmente (pelo menos no momento em que ps lê os respectivos arquivos /proc/pid/task/tid/stat ), você pode fazer:

ps -eLo state,tid,args | awk '$1 ~ [RD]'

Ou:

grep -ho '.*) [RD]' /proc/[1-9]*/task/*/stat

(como uma aproximação, assumindo que os nomes dos processos não contêm nova linha ou ) caracteres. Para ser correto, para o terceiro campo e acima, você precisa começar na última ocorrência de ) no arquivo).

A carga de um processo não faz muito sentido, o que você provavelmente está pensando é o tempo gasto pelas CPUs para executar o processo durante um período.

Por exemplo, com top imprimindo uma página a cada 1,5 segundos, quando% CPU para um processo mostra 300%, isso significa que, durante esses 1,5 segundos desde a última impressão, as CPUs estavam executando tarefas / threads desse processo por um total de 4,5 segundos.

Para obter essas informações, obtenha a soma dos campos utime (14) e stime (15) de /proc/pid/stat (consulte man 5 proc para detalhes) no início e no final do período e obtenha a razão entre a diferença e a duração.

Por exemplo, com zsh :

zmodload zsh/zselect
period=100 # centi-seconds
((clk_tck = $(getconf CLK_TCK)))
for i (1 2) {
  read -rd '' stat < /proc/$pid/stat;
  t[i]=$((${(j:+:)${(s: :)stat##*\)}[12,13]}))
  ((i == 2)) || zselect -t $period
}
printf '%.4g%%\n' $(((t[2] - t[1]) * 100. * 100 / period / clk_tck))

Se por carga do processo , você quis dizer o número médio de threads desse processo na fila de execução (conforme a definição sugerida pelo @Patrick nos comentários), você poderia obter uma aproximação obtendo um algumas amostras como:

$ (repeat 100 grep -l ') [RD]' /proc/$pid/task/*/stat)|awk 'END{print NR/100}'
16.57

Com o tempo gasto para executar esses 100 comandos, 16,57 threads de $pid em média foram vistos na fila de execução.

    
por 16.11.2017 / 12:25
1

Para a média de carga do sistema (e algumas outras estatísticas), verifique proc/loadavg . Os três primeiros campos são a média de carga de 1, 5 e 15 minutos, que é o que a maioria dos monitores do sistema exibe. O quarto campo consiste em dois números separados por uma barra, o primeiro é o número de processos executáveis, o segundo é o número total de processos (incluindo encadeamentos). O quinto campo é o PID do processo mais recente no sistema.

Se você quer estatísticas mais detalhadas, você terá que falar com o kernel através de netlink (não particularmente fácil), ou varrer os diretórios numerados em /proc (não confiável por causa das corridas TOCTOU). O arquivo relevante para o que você deseja é provavelmente /proc/<PID>/stat , que contém a maioria das outras informações mostradas pela maioria dos gerenciadores de tarefas. A explicação exata é um pouco longa para postar aqui, mas ela é bem abordada na manpage do sistema de arquivos proc ( man proc em um terminal).

Vale a pena notar que a 'carga' não faz sentido no contexto de um processo. A média de carga é o número médio de processos que estão no estado executável durante um determinado período de tempo (o que é uma medida muito ruim do quão ocupado o sistema é, mas isso é outra história), então por definição um determinado processo não pode tem um valor 'load'. Os processos geram carga no sistema, mas eles não têm 'load'. O mais próximo disso é a quantidade de tempo de CPU que o processo usa, o que é bastante fácil de ser computado por pollinb no arquivo mencionado acima (A resposta de Stéphane Chazelas mostra como calcular isso muito bem, então não vou repetir aqui) .

    
por 15.11.2017 / 21:18