Como a "média de carga" é interpretada na saída "superior"? É o mesmo para todas as distribuições?

12

Gostaria de saber se a saída de um Linux baseado em Red-Hat pode ser interpretada de maneira diferente por um Linux baseado em Debian.

Para tornar a questão ainda mais específica, o que pretendo é entender como a "média de carga" da primeira linha do topcomando em um sistema Red-Hat é interpretada e como verificar isso pelo código oficial da documentação ro.

[Há muitas maneiras de abordar esse assunto, todas as quais são respostas aceitáveis ​​para a pergunta]

Uma abordagem potencial seria descobrir onde essas informações são oficialmente documentadas.
Outro seria encontrar a versão do código que topé criada na distribuição e versão específicas em que estou trabalhando.

A saída do comando que estou recebendo é:

    top - 13:08:34 up  1:19,  2 users,  load average: 0.02, 0.00, 0.00
    Tasks: 183 total,   1 running, 182 sleeping,   0 stopped,   0 zombie
    Cpu(s):  0.2%us,  0.2%sy,  0.0%ni, 96.8%id,  2.7%wa,  0.0%hi,  0.0%si,  0.0%st
    Mem:   3922520k total,   788956k used,  3133564k free,   120720k buffers
    Swap:  2097148k total,        0k used,  2097148k free,   344216k cached


Nesse caso, como posso interpretar o valor médio da carga ?
Eu consegui localizar que a carga média é de última hora, de uma fonte de documentação e que deve ser interpretada após ser multiplicada por 100, por outra fonte de documentação.
Então, a pergunta é:
é 0,02% ou 2% carregado?
Fontes e versões da documentação:

1) A primeira estrela com

    TOP(1)                        Linux User’s Manual                       TOP(1)

    NAME
           top - display Linux tasks

Fonte: man topna minha distribuição RedHat, o
Ubuntu também possui a versão com "tarefas" que não explica a média de carga em:
http://manpages.ubuntu.com/manpages/precise/man1/top.1.html

2) O segundo começa com

    TOP(1)                          User Commands                         TOP(1)

   NAME         top

   top - display Linux processes

Fonte:
http://man7.org/linux/man-pages/man1/top.1.htm

3) Este começa com:

   TOP(1)

   NAME

   top - display and update information about the top cpu processes

Fonte: http://www.unixtop.org/man.shtml

O primeiro , pode ser visto por man topin RHELou in online ubuntu documentatione não possui explicação para o formato de saída (nem sobre a média de carga em que estou interessado) .

O segundo , contém uma breve explicação, apontando que a média de carga tem a ver com o último 1 minuto, mas nada sobre a interpretação de seu valor!

Cito diretamente da segunda fonte:

2a Médias UPTIME e LOAD
Esta parte consiste em uma única linha que contém:
nome do programa ou da janela, dependendo do modo de exibição
hora atual e tempo desde a última inicialização,
número total de
cargas médias do sistema de usuários nos últimos 1, 5 e 15 minutos

Portanto, se essa explicação estiver realmente correta, basta entender que a média de carga é de aproximadamente 1 minuto.
Mas isso não explica o formato do número.

Na terceira explicação, diz o seguinte:

Ao especificar números para médias de carga, eles devem ser multiplicados por 100.

Esta explicação sugere que 0,02 significa 2% e não 0,02%. Mas isso está correto? Além disso, é correto para todas as distribuições de Linux e implementações potencialmente diferentes de top?
Para encontrar a resposta para essa pergunta, tentei pesquisar o código pesquisando on-line. Mas eu encontrei, pelo menos, duas versões diferentes do toprelacionado ao RHEL por aí! o builtin-top.ce o refatorado top.c. Ambos os direitos autorais da Red-Hat, como diz o aviso no início do código, parecem lógicos, pois o RHEL usa um deles.
http://lxr.free-electrons.com/source/tools/perf/builtin-top.c
http://lxr.free-electrons.com/source/tools/perf/util/top.c

Portanto, antes de me aprofundar em tanto código, eu queria uma opinião sobre onde focar para formar um entendimento preciso sobre como a carga da CPU é interpretada?

A partir das informações fornecidas nas respostas abaixo, além de algumas pesquisas pessoais, descobri que:

1 - O topque estou usando está contido no pacote procps-3.2.8. O que pode ser verificado usando top -v.
2 - Na versão procps-3.2.8que baixei do site oficial, parece que a ferramenta uptimeobtém suas informações diretamente do procfsarquivo /proc/loadavg(não utilizando a função linux getloadavg()).
3 - Agora, o topcomando também não utiliza a função getloadavg(). Eu consegui verificar se o topfaz realmente as mesmas coisas que ouptimeferramenta para mostrar as médias de carga. Na verdade, ele chama a uptimefunção da ferramenta, que obtém suas informações do procfsarquivo /proc/loadavg.

Então, tudo aponta para o /proc/loadavgarquivo! Assim, para formar um entendimento preciso do load averageproduzido por top, é preciso ler o código do kernel para ver como o arquivo loadavgé gravado.
Há também um excelente artigo apontado em uma das respostas que fornece aos leigos uma explicação dos três valores de loadavg.
Portanto, apesar de todas as respostas terem sido igualmente úteis e úteis, vou marcar a que apontou para o artigo http://www.linuxjournal.com//article/9001 como "a" resposta para minha pergunta. Obrigado a todos por sua contribuição!

Além da pergunta Noções básicas sobre média superior e de carga , eu encontrei um link para o código fonte do kernel que aponta para o local onde loadavgé calculado. Como parece que há um grande comentário explicando como funciona, também esta parte do código está presente C!
O link para o código é http://lxr.free-electrons.com/source/kernel/sched/loadavg.c
Novamente, não estou tentando me envolver em nenhuma forma de plágio, estou apenas adicionando isso para completar. Então, estou repetindo que o link para o código do kernel foi encontrado em uma das respostas em Entendendo a média superior e de carga ...

Angelos Asonitis
fonte
O que as versões lhe dizem? ( top -v)
Fiximan
top: procps versão 3.2.8
Angelos Asonitis

Respostas:

19

A carga da CPU é o comprimento da fila de execução, ou seja, o comprimento da fila de processos que aguardam execução.

O uptimecomando pode ser usado para ver a duração média da fila de execução no último minuto, nos últimos cinco minutos e nos últimos 15 minutos, exatamente como o que geralmente é exibido top.

Um valor alto de carga significa que a fila de execução é longa. Um valor baixo significa que é curto. Portanto, se a média de carga de um minuto for 0,05, significa que, em média, durante esse minuto, havia 0,05 processos aguardando para serem executados na fila de execução. Não é uma porcentagem. Isto é, AFAIK, o mesmo em todos os Unices (embora alguns Unices possam não contar processos aguardando E / S, o que eu acho que o Linux faz; o OpenBSD, por um tempo apenas, também contou os threads do kernel, de modo que a carga sempre foi 1 ou Mais).

O toputilitário Linux obtém os valores de carga do kernel, no qual os grava /proc/loadavg. Observando as fontes procps-3.2.8, vemos que:

  1. Para exibir as médias de carga, a sprint_uptime()função é chamada top.c.
  2. Esta função vive em proc/whattime.ce chamadas loadavg()em proc/sysinfo.c.
  3. Essa função simplesmente se abre LOADAVG_FILEpara ler as médias de carga.
  4. LOADAVG_FILEé definido anteriormente como "/proc/loadavg".
Kusalananda
fonte
Muito obrigado pela sua resposta, isso está oficialmente documentado em algum lugar?
Angelos Asonitis
1
@AgelosAssonitis Este artigo do LinuxJournal de 2006 pode ser interessante. Aponta para alguns arquivos de origem na árvore de origem do Kernel do Linux que você deseja consultar. Como eu não sou usuário de Linux, não sei se esses arquivos ainda estão lá na
versão
Artigo interessante mesmo! Estou apenas olhando o pacote procps para ver se, de fato, o comando top obtém seu valor do arquivo / proc / loadavg e se é o mesmo que o resultado da função getloadavg ().
Angelos Asonitis
@AgelosAssonitis O local definitivo para a documentação das médias de carga é a sua árvore de fontes do kernel. O POSIX não define qual é a carga da CPU e não menciona as palavras "carga média" em nenhum lugar. Os utilitários tope uptimenão são utilitários POSIX e a getloadavg()função de biblioteca também não está definida no POSIX (embora tenha uma linhagem BSD).
Kusalananda
Então, pelo que entendi, não há documentação oficial para entender a formação desses valores além da própria fonte do kernel, está correto? Antes de chegar lá, no entanto, ainda precisa amarrar o valor apresentado em topao loadavg arquivo procfs ...
Angelos Asonitis
7

A média de carga é normalmente calculada pelo kernel. Aplicativos como tope uptimepodem usar a getloadavg(3)chamada de biblioteca para acessá-la (ela deve ser portátil em diferentes versões do Unix). No Linux, isso normalmente resulta em uma leitura de /proc/loadavg. No FreeBSD é uma chamada do sistema.

Por exemplo:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main()
{
  double ld[3];

  int i=getloadavg(ld,3);
  printf("Load %.2f %.2f %.2f\n",ld[0],ld[1],ld[2]);
}

uptimee topambos fazem chamadas semelhantes para obter seus dados.

Agora, as médias de carga de 1/5/15 minutos são o número de processos na fila de execução. Diferentes sistemas operacionais podem calcular isso de diferentes maneiras; a maior diferença normalmente é se os processos que aguardam E / S (por exemplo, bloqueados no disco) contam como executáveis ​​ou não. No Linux eles são.

Portanto, uma média de carga de 3,4 significa que houve uma média de 3,4 processos na fila de execução na janela de amostra (1, 5, 15 minutos).

Uma alta média de carga não significa necessariamente um servidor sobrecarregado. Se você tiver 16 núcleos, sua média de carga poderá ser 16 sem estresse. Você também pode ter muitas fork()chamadas de aplicativos que podem resultar na criação / destruição de um grande número de processos, levando a uma alta média de carga, mas sem afetar o desempenho do servidor. Ele deve ser usado apenas como guia, juntamente com outras métricas, como% de CPU ocupada.

Stephen Harris
fonte
4

A média de carga não é algo específico de qualquer ferramenta ou distribuição específica; é uma medida fornecida pelo Kernel ou, mais precisamente, pelo planejador; portanto, é uma medida independente da distribuição. A medição é registrada dentro do sistema de arquivos proc/proc

Em sua interpretação, a métrica de carga média não é uma indicação de quanto a CPU está trabalhando, mas quanto trabalho precisa ser feito. Não acho que seja realmente necessário multiplicá-lo por nada, porque é uma medida direta do número de processos em um estado executável ou ininterrupto.

Tente verificar as duas páginas de manual a seguir: getloadavg(3)e uptimepara obter mais informações.

A métrica de carga média pode ser um conceito difícil de entender a princípio, acho que muitas pessoas acham que é uma indicação de quão difícil a CPU está trabalhando, mas não é realmente isso.

pmyjavec
fonte
1
Ok, mas estamos absolutamente certos de que a média de carga descrita na getloadavg()descrição da função é a mesma média de carga que o topcomando no rhel mostra? Estou perguntando isso porque realizei uma pesquisa de texto completo no conteúdo não tarroado do pacote procps-3.2.8 (que é indicado pelo comando top -v) e não há uma única menção à função getloadavg ()! Então, talvez top calcula a média de carga de uma maneira diferente ....
Angelos Asonitis