Como posso obter o uso real de uma CPU habilitada para hyperthreading multicore?
Por exemplo, vamos considerar uma CPU de 2 núcleos, expressando 4 núcleos virtuais.
Uma única carga de trabalho encadeada agora apareceria com 100% top
, pois um núcleo dos núcleos virtuais é completamente usado. A CPU e top
funciona como esperado, como se houvesse 4 núcleos reais.
No entanto, com dois threads, as coisas ficam estranhas: se tudo funcionar bem, elas serão balanceadas para os dois núcleos reais; portanto, temos 200% de uso: duas vezes 100% e dois núcleos virtuais inativos e estão usando toda a energia da CPU disponível . Parece-me bem.
No entanto, se os dois threads fossem executados em um único núcleo real, eles apareceriam usando duas vezes 100%, o que faz 200% de uso do núcleo virtual. Mas, no lado real, esse seria um núcleo que compartilha sua energia nos dois threads, que estão usando apenas metade da energia total da CPU.
Portanto, os números de uso mostrados por top
não podem ser usados para medir a carga de trabalho total da CPU.
Também me pergunto como o hyperthreading equilibra dois virtuais em um núcleo real. Se dois encadeamentos executam uma quantidade diferente de ciclos, os núcleos virtuais se 'adaptam' para que ambos mostrem uma carga de 100%, mesmo que a carga real seja diferente?
fonte
Respostas:
Martin Tegtmeier, da Oracle, escreveu um post interessante sobre o ano passado: https://blogs.oracle.com/solaris/cpu-utilization-of-multi-threaded-architectures-explained-v2
A resposta curta; O Hyperthreading realmente atrapalha a capacidade da parte superior de relatar porcentagens gerais de utilização da CPU / ociosidade da CPU.
Na pior das hipóteses, uma CPU de 2 núcleos e 4 núcleos virtuais executando 2 threads a 100% de utilização por núcleo, poderia quase saturar a CPU. (Dependendo do uso da porta de execução; somente os segmentos que usam recursos de computação totalmente diferentes na CPU ainda podem ser executados sem afetar o desempenho no segmento atual.) No entanto, o topo ainda reportará 50% de ociosidade nesse caso.
fonte
A utilização do núcleo é muito diferente da carga no sistema. A utilização do núcleo mostra apenas o quanto o núcleo está calculando algo ou aguardando instruções. Pode ser 100%, o que corresponde a um determinado momento em que a CPU está calculando alguma coisa.
Mas a carga é uma coisa diferente, a carga geralmente é medida para determinar se algum processo precisa esperar por algum recurso ou não. Se os processos não estiverem esperando por nenhum recurso, você verá um sistema de alto desempenho. Mas às vezes você verá sistemas lentos, mas baixa utilização da CPU. Isso geralmente significa que alguns processos estão aguardando um recurso e não liberando a CPU. Para esse tipo de cenário, você não verá alta utilização da CPU, mas o sistema pode estar acima da capacidade.
Em um sistema Linux, a média de carga é um valor calculado para medir o desempenho geral de um sistema. O valor da média de carga deve ser comparado aos recursos de computação paralela, núcleos específicos. Portanto, se um sistema com 4 núcleos físicos tiver uma média de carga de 4 ou mais, podemos dizer com segurança que alguns processos aguardarão um recurso.
Não é importante se a utilização da CPU for 100 ou 10%. A média de carga pode chegar a 200 ou 300; nesses casos, o sistema dificilmente responde.
Em uma condição operacional normal, a média de carga do servidor não deve exceder o número de núcleos por longa duração. Picos curtos não são importantes na minha opinião. 3 números que você verá em uma
w
saída são load av. por 1/5/15 minutos.fonte
Na minha opinião, nenhuma das respostas acima é satisfatória.
Acho que o artigo que estou me referindo no seguinte link é direcionado para responder a essa pergunta: http://perfdynamics.blogspot.ch/2014/01/monitoring-cpu-utilization-under-hyper.html
CITAR:
Na verdade, tenho certeza de que o sistema operacional pode atingir 100% em cada núcleo virtual, sem dúvida. Acabei de fazer um:
E posso garantir meus 8 núcleos virtuais e 4 núcleos físicos, todos com 100% de utilização da CPU. E eu definitivamente não tenho 8 núcleos na minha máquina.
Para encurtar a história, você pode assumir o seguinte se a carga total da CPU for superior a 100%, no máximo, e provavelmente com muita precisão, usando exatamente 100% do núcleo físico. Que menas, se você tiver o CORE 1 físico dividido em CPU 1 e CPU do sistema operacional. E na CPU 1 você tem um uso total de 50% e na CPU 2 você tem um uso total de 50%, provavelmente na vida real. colocando uma pressão de um uso total de 100% nessa CPU. Você atingiu o limite máximo.
Mas é claro que o sistema operacional em suas ferramentas de monitoramento de sistema não tem idéia de que está vendendo uma ilusão para você. Do ponto de vista do sistema operacional e de como ele gerencia os recursos, ele acredita que o alcance desses dois núcleos virtuais ainda está 50% ocioso; portanto, se houver mais tarefas a serem executadas, ele tentará distribuí-los uniformemente pelos dois núcleos. . Portanto, quando você excede 100% da utilização da CPU, durante um período de uso da CPU, sempre há trabalho em fila para executar naquele período de tempo que nunca teve uma alteração para obter um tempo na CPU. Eventualmente, ele será obtido, mas sempre haverá alguns threads que na verdade nem estão em execução, mesmo que estejam programados para serem executados.
obrigado
fonte