A parte superior diz que 100% da CPU foi usada, mas 50% dos núcleos estão inativos?

6
top - 08:43:16 up 96 days, 22:16,  1 user,  load average: 4.03, 3.92, 3.98
Tasks: 199 total,   1 running, 198 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.0%us,  0.5%sy, 50.0%ni, 49.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  3.9%sy, 46.8%ni, 49.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  3.0%sy, 47.5%ni, 49.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  5.0%sy, 45.5%ni, 49.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 3593 foldinga  39  19  276m  80m 2972 S  402  1.0  12:55.42 FahCore_a3.exe

Agora, como é que o top diz que está a utilizar 100% da CPU (400% / 4 núcleos), enquanto exactamente metade dos processadores estão inactivos?

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 6
model           : 30
model name      : Intel(R) Xeon(R) CPU           X3440  @ 2.53GHz
stepping        : 5
cpu MHz         : 2526.932
cache size      : 8192 KB
physical id     : 0
siblings        : 4
core id         : 3
cpu cores       : 4
apicid          : 6
initial apicid  : 6
fpu             : yes
fpu_exception   : yes
cpuid level     : 11
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm ida dts tpr_shadow vnmi flexpriority ept vpid
bogomips        : 5054.02
clflush size    : 64
cache_alignment : 64
address sizes   : 36 bits physical, 48 bits virtual
power management:

EDIT: Em resposta ao i_grok e Max Alginin, verifiquei se o Hyperthreading estava ativado no servidor. Uma vez que eu liguei, aqui estão os resultados de cima agora. Observe que os mesmos sintomas são evidentes.

top - 10:17:01 up 47 days, 10:28,  3 users,  load average: 7.93, 7.96, 8.02
Tasks: 150 total,   1 running, 149 sleeping,   0 stopped,   0 zombie
Cpu0  :  0.0%us,  2.8%sy, 42.0%ni, 55.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  2.2%sy, 42.5%ni, 55.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  1.2%us,  3.7%sy, 95.1%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  1.7%sy, 43.1%ni, 55.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  0.0%us,  1.1%sy, 43.6%ni, 55.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  0.0%us,  0.0%sy, 44.8%ni, 55.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  :  0.0%us,  2.2%sy, 42.5%ni, 55.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  :  0.0%us,  1.7%sy, 43.1%ni, 55.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8177700k total,  6258704k used,  1918996k free,    29248k buffers
Swap:        0k total,        0k used,        0k free,  5203172k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 8132 foldinga  39  19  557m  99m 3060 S  796  1.2   1510:53 FahCore_a3.exe
    
por Theodore R. Smith 19.02.2012 / 16:38

5 respostas

3

Já faz mais de quatro anos e, para ser sincero, esqueci completamente essa pergunta e só voltei porque vi que recebera um crachá Pergunta Notável .

O problema estava tangencialmente relacionado ao hyperthreading, mas como eu sempre indiquei aos respondentes, isso não era a causa dos 50% de inatividade.

A causa tem a ver com uma configuração de ticks dinâmicos do kernel configurada de forma inadequada. Eu estava executando o Gentoo e usando um kernel customizado. Depois que atualizei o kernel, em meados de 2012, o problema se resolveu.

    
por 27.03.2016 / 16:44
5

Para expandir a resposta de Max: Os processadores com hyperthreading relatam dois núcleos ao sistema operacional quando realmente existe um único núcleo físico. O Linux vê 4 núcleos, mas seu processador tem 2 núcleos físicos.

O núcleo físico tem recursos avançados de agendamento e alguns transistores extras para lidar com o segundo thread, mas para muitos aplicativos com uso intensivo de processador, o hyperthreading não fornece um benefício real.

No meu campo, fazemos benchmark dos aplicativos que serão executados em um sistema e desabilitamos o hyperthreading no BIOS, se isso prejudicar o desempenho.

EDITAR:

Se eu carregar metade dos núcleos usando cat /dev/urandom > /dev/null , aqui é o que eu recebo em um Xeon moderno rodando o CentOS 6:

top - 19:32:38 up 1 day,  8:17,  3 users,  load average: 12.13, 8.73, 4.07
Tasks: 694 total,  13 running, 681 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us, 50.4%sy,  0.0%ni, 49.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  49552656k total,  2693452k used, 46859204k free,   186448k buffers
Swap: 15999992k total,        0k used, 15999992k free,   469560k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                           
21193 root      20   0 98.5m  560  452 R 100.0  0.0   6:23.31 cat                                                                                               
21194 root      20   0 98.5m  560  452 R 100.0  0.0   6:22.76 cat                                                                                               
21195 root      20   0 98.5m  560  452 R 100.0  0.0   6:22.38 cat                                                                                               
21201 root      20   0 98.5m  560  452 R 100.0  0.0   6:21.98 cat                                                                                               
21202 root      20   0 98.5m  560  452 R 100.0  0.0   6:21.62 cat                                                                                               
21203 root      20   0 98.5m  560  452 R 100.0  0.0   6:21.36 cat                                                                                               
21206 root      20   0 98.5m  560  452 R 100.0  0.0   6:20.43 cat                                                                                               
21187 root      20   0 98.5m  560  452 R 99.6  0.0   6:24.45 cat                                                                                                
21204 root      20   0 98.5m  560  452 R 99.6  0.0   6:21.03 cat                                                                                                
21205 root      20   0 98.5m  560  452 R 99.6  0.0   6:20.73 cat                                                                                                
21213 root      20   0 98.5m  560  452 R 99.6  0.0   6:20.09 cat                                                                                                
21214 root      20   0 98.5m  560  452 R 99.6  0.0   6:19.70 cat
    
por 20.02.2012 / 16:18
1

Eu não acho que o Hyperthreading é o problema aqui. Se você olhar para uma dessas linhas:

Cpu0  :  0.0%us,  0.5%sy, 50.0%ni, 49.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

O problema não é que metade dos seus núcleos estejam ociosos, é que cada núcleo está ocioso em 50% do tempo! Contradizendo isso, porém, é a linha:

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
3593 foldinga  39  19  276m  80m 2972 S  402  1.0  12:55.42 FahCore_a3.exe

O que diz que o foldingathome maximizou todos os quatro núcleos. Isso é estranho, e me faz suspeitar que você descobriu um bug no relatório do kernel sobre as estatísticas da CPU. Aqui estão algumas coisas para tentar:

  • Execute o foldingathome sem renegá-lo.
  • Execute um programa diferente que afunilará todos os núcleos e verá quais números você recebe.

Além disso, o foldingathome é usado apenas com a CPU para computação ou é também uma GPU no mix?

    
por 22.02.2012 / 02:25
1

Eu suspeito que o resumo principal e a linha do processo estejam na média em diferentes períodos de tempo.

A linha de processo está dizendo 'logo em seguida' por algum valor de n o processo está consumindo 100% de um núcleo lógico, e o resumo está dizendo que durante um longo período ele está consumindo 50%, quando corre, mas apenas metade do tempo.

Eu já vi isso quando saí do topo no modo batch, particularmente se for dado apenas um ciclo. Se estiver em loop no bash, por exemplo, a linha de processo pode dizer 100% em várias encarnações, mas o resumo é bem menor que 1 / n vezes 100% (para n núcleos lógicos).

Verifique o tempo de CPU consumido ao longo do tempo - ele mostra que a linha de processo ou o resumo está correto?

Como você está no topo?

    
por 18.03.2013 / 20:13
0

Eu testei o cenário do i_groks no Centos 6 em um processador AMD quad core (8 núcleos "aparentes" por processador, já que a AMD tem um equivalente HT) e executando 22 processos como este

cat /dev/urandom > /dev/null

observamos que o uso total da CPU está saturado em torno de 95%. Eu verifiquei novamente no topo e o uso total foi consistente.

Processos adicionais não aumentarão o uso total, provavelmente devido à contenção.

Olhando para o nível central: os 16 núcleos "aparentes" (cada núcleo físico tem 2 desvios) são mostrados como sendo executados em quase 100%.

Então, não consigo reproduzir a situação / problema inicialmente relatado.

    
por 26.01.2014 / 18:09

Tags