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

9

Durante a execução de mencoder com encadeamentos = 4 (em uma CPU quad-core). Percebi que htop não mostra seu uso da CPU true , mas top sim.

Parece que htop está apenas reportando em um core . Isso é um bug / limitação de htop ? O que está acontecendo aqui?

Não há outras entradas para mencoder aparecer em ps ou htop ou top . Eu suponho que 100% significa que 1 núcleo está maximizado, mas mesmo isso parece estranho para mim; e os outros núcleos?

Atualização: adicionada a saída "System Monitor"

                  PID   %CPU   COMMAND                    
           "top"  1869   220   mencoder                 
          "htop"  1869    95   mencoder -noodml /media/...  
"System Monitor"  1869   220   mencoder
    
por Peter.O 01.12.2010 / 04:02

1 resposta

22

Como você mesmo disse, você pode clicar em H para 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 Scheduler. O objetivo é garantir que todos os Processos e seus segmentos recebam uma parcela justa do tempo de computação. Eu não vou programar muito (é muito complicado). Mas no final há algo chamado fila de execução . É onde todas as instruções de todos os processos se alinham para aguardar a sua vez de serem executadas.

Qualquer processo coloca suas "tarefas" na fila de execução e, assim que o processador estiver pronto, elas são exibidas e executadas. 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 ser executado novamente.

A classificação nesta fila tem a ver com os processos ' Prioridade (também chamado de "valor agradável" - ou seja, um processo é legal sobre recursos do sistema).

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

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

Agora, nos valores percentuais de utilização da CPU:

Imagine que você tem dois clocks, um é chamado t e representa tempo real . Mede um segundo por segundo. O outro relógio que chamamos de c . Só é executado se houver processamento para fazer. Isso significa que, somente quando um processo calcula alguma coisa, o relógio é executado. Isso também é chamado de tempo de CPU. Todo e qualquer processo no sistema 'tem' um desses.

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

ou para todos os processos:

Em uma máquina multi-core, isso pode resultar em um valor de 3.9, claro, porque a CPU pode calcular o valor de computação de quatro segundos a cada segundo, se utilizado perfeitamente.

A Wikipedia fornece este exemplo:

  

Um aplicativo de software em execução   Máquina UNIX de 6 CPUs cria três UNIX   processos para atender o usuário   requerimento. Cada um destes três   processos criam dois segmentos. Trabalho de   aplicação de software é uniformemente   distribuído em 6 threads independentes   de execução criada para o   aplicação. Se não houver espera por recursos   está envolvido, o tempo total de CPU é   esperado para ser seis vezes Real decorrido   tempo.

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ê poderia inferir a partir disso que a carga do sistema é de 100 - 66,93 = 33,1%. (Mas, na realidade, isso estaria errado por causa de coisas complexas como espera de E / S, agendamento de ineficiências e assim por diante)

Em contraste com load , esses cálculos sempre resultarão 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 executa três tarefas, utilizando 100% de CPU, e uma máquina executando um milhão de tarefas, mal conseguindo qualquer trabalho feito em uma única delas, também em 100%. Se você está, por exemplo, tentando equilibrar um monte de processos em muitos computadores, a utilização da CPU é quase inútil. Carregar é o que você quer lá.

Agora, na realidade, há mais de um desses relógios de tempo de processamento. Há um para esperar em I / O por exemplo. Então, 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. :)

    
por Stefano Palazzo 01.12.2010 / 10:28