'htop' não mostra a% correta da CPU, mas 'top'

12

Durante a execução mencodercom threads = 4 (em uma CPU quad-core). Percebi que htopisso não mostra seu verdadeiro uso da CPU, mas topsim.

Parece que o htop está relatando apenas um núcleo . Isso é um bug / limitação do htop ? O que está acontecendo aqui?

Não há outras entradas para o mencoder exibidas em psou htopou top. Suponho que 100% significa que um núcleo está no máximo, mas até isso parece estranho para mim; e os outros núcleos?

Atualização: saída "Monitor do Sistema" adicionada

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder
Peter.O
fonte
Quais sinalizadores você está usando para o htop?
sep332
sep332 ... Acabei de executar "htop" ... então é um caso de quais são os padrões.
precisa saber é o seguinte
Bingo! sep332 .. faça uma resposta e marcarei como resolvida .. Você me fez ver meus padrões .... "H" é uma tecla de alternância para "Ocultar tópicos do usuário" ... Quando tudo mais falhar " Leia as informações da ajuda ", mas às vezes uma dica útil no diretório certo ajuda mais. Obrigado.
precisa saber é o seguinte
@ Peter.O: votou acidentalmente (touchpad do mouse!). Cancelarei se você editar sua postagem.
SabreWolfy

Respostas:

24

Como você mesmo disse, pode clicar Hpara mostrar os tópicos do usuário.

Apenas para referência futura (e por diversão), vamos calcular a utilização da CPU!

Um pouco de fundo:

Em um sistema operacional moderno, há um agendador. O objetivo é garantir que todos os processos e seus threads tenham uma boa parte do tempo de computação. Não vou agendar muito (é realmente complicado). Mas, no final, há algo chamado fila de execução . É aqui que todas as instruções de todos os processos se alinham para aguardar sua vez de serem executadas.

Qualquer processo coloca suas "tarefas" na fila de execução e, quando o processador está pronto, ele as abre e as executa. Quando um programa entra em suspensão, por exemplo, ele se remove da fila de execução e retorna ao "fim da linha" quando estiver pronto para executar novamente.

Classificando nessa fila tem a ver com os processos Prioridade (também chamado de 'bom valor' - ou seja, um processo é agradável sobre os recursos do sistema).

O comprimento da fila determina a carga do sistema. Uma carga de 2,5, por exemplo, significa que existem instruções de 2,5 para todas as instruções com as quais a CPU pode lidar em tempo real .

A propósito, no Linux, essa carga é calculada em intervalos de 10 ms (por padrão).

Agora, sobre os valores de porcentagem de utilização da CPU:

Imagine que você tem dois relógios, um é chamado te representa em tempo real . Mede um segundo por cada segundo. O outro relógio que chamamos c. Só é executado se houver processamento a ser feito. Isso significa que somente quando um processo calcula algo o relógio funciona. Isso também é chamado de tempo da CPU. Todo e qualquer processo no sistema 'tem' um desses.

A utilização do processador agora pode ser calculada para um único processo:

U = c / t = 0,5s / 1s = 0,5

ou para todos os processos:

texto alternativo

Em uma máquina com vários núcleos, isso pode resultar em um valor de 3,9, é claro, porque a CPU pode calcular quatro segundos de computação a cada segundo, se utilizada perfeitamente.

A Wikipedia fornece este exemplo:

Um aplicativo de software em execução na máquina UNIX de 6 CPUs cria três processos UNIX para atender aos requisitos do usuário. Cada um desses três processos cria dois encadeamentos. O trabalho do aplicativo de software é distribuído igualmente em 6 encadeamentos de execução independentes criados para o aplicativo. Se nenhuma espera por recursos estiver envolvida, o tempo total da CPU deverá ser seis vezes o tempo decorrido em tempo real.

Aqui está um pequeno trecho de python que faz isso

>>> import time
>>> t = time.time()
>>> c = time.clock()
>>> # the next line will take a while to compute
>>> tuple(tuple(i**0.2 for i in range(600)) for i in range(6000))
>>> print (time.clock() / (time.time() - t)) * 100, "%"
66.9384021612 %

Em um mundo perfeito, você pode inferir disso que a carga do sistema é 100 - 66,93 = 33,1%. (Mas, na realidade, isso seria errado devido a coisas complexas como espera de E / S, agendamento de ineficiências e assim por diante)

Ao contrário da carga , esses cálculos sempre resultam em um valor entre 0 e o número de processadores, ou seja, entre 0 e 1 ou 0 a 100%. Agora não há como diferenciar entre uma máquina que está executando três tarefas, utilizando 100% da CPU, e uma máquina executando um milhão de tarefas, realizando quase todo o trabalho em qualquer uma delas, também a 100%. Se você está, por exemplo, tentando equilibrar vários processos em muitos computadores, a utilização da CPU é quase inútil. Carga é o que você quer lá.

Agora, na realidade, há mais de um desses relógios de ponto de processamento. Há um para aguardar E / S, por exemplo. Portanto, você também pode calcular a utilização de recursos de E / S.

Isso pode não ter sido útil em relação à pergunta original, mas espero que seja interessante. :)

Stefano Palazzo
fonte
Eu realmente deveria ter incluído valores de incerteza, porque, usando esse método simples, o cálculo provavelmente será desligado em ± 1%, mas eu não queria aborrecer muito todo mundo .
Stefano Palazzo
Obrigado pela lição. Eu sabia a maioria disso, mas algumas coisas eram mais específicas do que aquilo que aprendi.
NightwishFan