medida de carga da CPU com hyperthreading no linux


12

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 topfunciona 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 topnã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?


1
Você entende que o sistema do operador não está ciente da diferença entre um núcleo virtual de hyperthreading e o núcleo físico, certo?
Ramhound

Parece que sim, mas não precisa? O mapeamento de núcleo real vs. virtual é um mapa simples de um a dois. O problema é como medir a carga em um núcleo virtual que realmente altera seu desempenho disponível, sendo agendado com outro no núcleo real. Mas todos os dados estão disponíveis, eu acho, a questão é exatamente onde estão as ferramentas que obtêm um resultado adequado delas?
Dronus

1
Eu só gostaria de ter uma medida de carga em que 100% significaria que todo ciclo de cada núcleo real é usado.
Dronus

1
Simplificando: como saber, em um determinado momento, se minha CPU seria capaz de realizar mais trabalhos, sem diminuir o trabalho atualmente em andamento?
Dronus

1
@ Ramhound, então se eu tiver um processador físico de 4 núcleos com 8 núcleos lógicos e minha média de carga for 4,00, estou com 100% de utilização ou 50%?
Buttle Butkus

Respostas:


5

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.



4

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 wsaída são load av. por 1/5/15 minutos.


0

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:

A idéia por trás do HT é permitir a execução de um encadeamento de aplicativo diferente quando o aplicativo atualmente em execução é interrompido; devido a erros de previsão de ramificação, bolhas no pipeline, etc. Para tornar isso possível, deve haver outra porta ou registro AS. Esse registro se torna visível para o sistema operacional quando o HT está ativado. No entanto, o sistema operacional (e todo o caminho da cadeia alimentar até as ferramentas perf que você estiver usando) agora pensa duas vezes que a capacidade do processador está disponível, ou seja, 100% da CPU em cada porta AS.

Mas, sob o capô, ainda há apenas uma unidade de execução: o núcleo único e físico com o qual você começou antes de o HT ser ativado. A diferença é que ele está sendo compartilhado de alguma forma entre as 2 portas AS. Como o núcleo único é alternado entre as duas portas é muito complicado, mas é mais facilmente compreendido em termos de filas pesquisadas. Entro nesse nível de detalhe nas minhas aulas do GCaP.

As melhores medições de teste que eu tenho indicam que cada porta HT não pode ficar mais de 75% ocupada, em média, ou 150% da capacidade total esperada de 200%, de acordo com o sistema operacional. A "falta" de 50% da capacidade, a que me referi anteriormente, é uma ilusão. A Intel afirmou que algo na faixa de 120% a 130% pode ser esperado para aplicativos gerais.

Na verdade, tenho certeza de que o sistema operacional pode atingir 100% em cada núcleo virtual, sem dúvida. Acabei de fazer um:

mvn clean install -DskipTests -T 5

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.