cpu load measure com hyperthreading no linux

10

Como posso obter o verdadeiro uso 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 seria exibida como 100% em top , já que um núcleo dos núcleos virtuais é completamente usado. A CPU e top funcionam como esperado, como se houvesse 4 núcleos reais.

No entanto, com dois segmentos, as coisas ficam difíceis: se tudo funcionar bem, eles são balanceados para os dois núcleos reais, então temos 200% de uso: duas vezes 100% e dois núcleos virtuais ociosos e estamos usando todos os potência de CPU disponível. Parece ok para mim.

No entanto, se os dois segmentos forem executados em um único núcleo real, eles aparecerão usando duas vezes 100%, o que gera 200% de uso do núcleo virtual. Mas no lado real, isso seria um núcleo compartilhando seu poder sobre os dois segmentos, 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.

Eu também me pergunto como o hyperthreading equilibra dois virtuais em um núcleo real. Se dois threads tomam uma quantidade diferente de ciclos, os núcleos virtuais 'se adaptam' para que ambos mostrem uma carga de 100% mesmo se a carga real diferir?

    
por dronus 28.06.2013 / 10:52

3 respostas

3

A utilização do núcleo é muito diferente da carga no sistema. A utilização do núcleo está apenas mostrando o quanto o núcleo está calculando algo ou aguardando instruções. Pode ser 100% que correspons a qualquer momento que o cpu é calculado em algum momento.
Mas a carga é uma coisa diferente, a carga é geralmente medida para determinar se algum processo tem que esperar por qualquer recurso ou não. Se os processos não aguardarem algum recurso, você verá um sistema muito eficiente. 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 o cpu. Nesse tipo de cenário, você não verá alta utilização da CPU, mas o sistema pode estar bem acima de sua capacidade. Em um sistema Linux, o valor médio da 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, sendo os núcleos específicos. Portanto, se um sistema com 4 núcleos físicos tiver uma carga de 4 ou mais, podemos dizer com segurança que alguns processos aguardarão por um recurso. Não é importante se o utilitário cpu for 100 ou 10 por cento. A média de carga pode chegar a 200 ou 300, neste caso, o sistema será pouco responsivo. Em uma condição operacional normal, a média de carga do servidor não deve exceder o número de núcleos para longa duração. Picos curtos não são importantes na minha opinião. 3 números que você verá em uma saída w é carga av. por 1/3/15 minutos.

    
por 21.02.2016 / 04:28
3

Martin Tegtmeier, da Oracle, escreveu um post interessante sobre este ano: link

A resposta curta; O Hyperthreading realmente mexe com a capacidade do top de relatar as porcentagens gerais de cpu-utilization / cpu-idle.

No pior dos casos, uma CPU de 2 núcleos de 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 encadeamentos que usam recursos de computação totalmente diferentes na CPU ainda podem ser executados sem afetar o desempenho no encadeamento atual.) No entanto, o top ainda relatará 50% inativo neste caso.

    
por 01.04.2016 / 14:20
0

Na minha opinião, nenhuma das respostas acima é satisfatória.

Acho que o artigo a que me refiro no link a seguir é bem direcionado para responder a essa pergunta: link

CITAÇÕES:

The idea behind HT is to allow a different application thread to run when the currently running app stalls; due to branch misprediction, bubbles in the pipeline, etc. To make that possible, there has to be another port or AS register. That register becomes visible to the OS when HT is enabled. However, the OS (and all the way up the food chain to whatever perf tools you are using) now thinks twice the processor capacity is available, i.e., 100% CPU at each AS port.

But under the hood, there is still only one execution unit: the single, physical, core you started with before HT was enabled. The difference is that it is being shared in some way between the 2 AS ports. How the single core gets switched between the two ports is very complicated but is most easily understood in terms of polled queues. I go into that level of detail in my GCaP classes.

The best-case test measurements I have, indicate that each HT port cannot become more than 75% busy, on average, or 150% of the total expected 200% capacity according to the OS. The "missing" 50% capacity, that I referred to earlier, is an illusion. Intel has claimed that something in the range of 120% to 130% can be expected for general applications.

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

mvn clean install -DskipTests -T 5

E posso assegurar-lhe que meus 8 núcleos virtuais e 4 núcleos físicos foram todos para 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 ultrapassar 100% no máximo, e muito provavelmente com exatidão, usando exatamente 100% do núcleo físico. Isto é, se você tiver o CORE 1 físico dividido em CPU 1 e CPU 2 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 você está colocando uma pressão de um uso total de 100% nessa CPU. Você está no limite.

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. A partir da perspectiva do sistema operacional e como ele gerencia os recursos, ele apenas acreditará que cada um desses dois núcleos virtuais ainda está 50% inativo, portanto, se houver mais tarefas a serem executadas, ele tentará distribuí-las uniformemente nesses dois núcleos. . Portanto, quando você ultrapassa 100% de utilização da CPU, durante um período de uso da CPU, há sempre um trabalho enfileirado para executar nesse período de tempo que nunca teve uma alteração para obter um tempo de trabalho na CPU. Eventualmente, ele irá obtê-lo, mas sempre há alguns encadeamentos que na verdade nem estão sendo executados, mesmo que estejam programados para serem executados.

Obrigado

    
por 05.05.2018 / 12:09