Por que o meu computador com núcleos bare-metal de 16x 2,93 GHz apresenta desempenho inferior a um VPS com núcleos de 4x 2,5 GHz?

34

Escrevi um software multiencadeado que faz várias simulações por dia. Essa é uma tarefa que consome muita CPU e eu tenho executado este programa em serviços em nuvem, geralmente em configurações como 1 GB por núcleo.

Estou executando o CentOS 6.7 e /proc/cpuinfome dá que meus quatro núcleos VPS são de 2,5 GHz.

processor       : 3
vendor_id       : GenuineIntel
cpu family      : 6
model           : 63
model name      : Intel(R) Xeon(R) CPU E5-2680 v3 @ 2.50GHz
stepping        : 2
microcode       : 1
cpu MHz         : 2499.992
cache size      : 30720 KB
physical id     : 3
siblings        : 1
core id         : 0
cpu cores       : 1
apicid          : 3
initial apicid  : 3
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good unfair_spinlock pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm arat xsaveopt fsgsbase bmi1 avx2 smep bmi2 erms invpcid
bogomips        : 4999.98
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

Com o aumento das taxas de câmbio, meu VPS começou a ficar mais caro, e eu cheguei a "bastante" em servidores bare metal usados.

Comprei quatro HP DL580 G5 , com quatro Intel Xeon X7350s cada. Basicamente, cada máquina possui núcleos de 16x 2,93GHz e 16GB, para manter coisas como minha nuvem VPS .

processor       : 15
vendor_id       : GenuineIntel
cpu family      : 6
model           : 15
model name      : Intel(R) Xeon(R) CPU           X7350 @ 2.93GHz
stepping        : 11
microcode       : 187
cpu MHz         : 1600.002
cache size      : 4096 KB
physical id     : 6
siblings        : 4
core id         : 3
cpu cores       : 4
apicid          : 27
initial apicid  : 27
fpu             : yes
fpu_exception   : yes
cpuid level     : 10
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall lm constant_tsc arch_perfmon pebs bts rep_good aperfmperf pni dtes64 monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr pdcm dca lahf_lm dts tpr_shadow vnmi flexpriority
bogomips        : 5866.96
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management:

Basicamente, parecia bastante, pois eu poderia parar de usar os VPS para executar esses trabalhos em lote. Agora são as coisas estranhas ...

  1. Nos VPS, eu tenho rodado 1,25 thread por núcleo, assim como tenho feito no bare metal. (O segmento extra de 0,25 serve para compensar o tempo ocioso causado pelo uso da rede.)
  2. No meu VPS, usando no total 44x 2,5 GHz núcleos, recebo quase 900 simulações por minuto.
  3. No meu DL580, usando um total de núcleos de 64x 2,93GHz, estou recebendo apenas 300 simulações por minuto.

Entendo que o DL580 tem um processador mais antigo. Mas se eu estiver executando um thread por núcleo e o servidor bare metal tiver um núcleo mais rápido, por que ele está com desempenho inferior ao meu VPS?

Não tenho troca de memória acontecendo em nenhum dos servidores.

TOP diz que meus processadores estão rodando a 100%. Recebo uma carga média de 18 (5 em VPS).

Será assim ou estou perdendo alguma coisa?

A execução do lscpu me dá 1,6 GHz no meu servidor bare metal. Isso foi visto /proc/cpuinfotambém.

Essas informações estão corretas ou estão vinculadas a algum gerenciamento de energia incorreto?

[BARE METAL] $ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                16
On-line CPU(s) list:   0-15
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             4
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 15
Stepping:              11
**CPU MHz:               1600.002**
BogoMIPS:              5984.30
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              4096K
NUMA node0 CPU(s):     0-15


[VPS] $ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    1
Socket(s):             4
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 63
Stepping:              2
**CPU MHz:               2499.992**
BogoMIPS:              4999.98
Hypervisor vendor:     KVM
Virtualization type:   full
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              30720K
NUMA node0 CPU(s):     0-3
Glauco Cattalini Lins
fonte
32
Porque os processadores de oito anos fazem muito menos por ciclo de clock do que os atuais.
Michael Hampton
3
Você deseja redefinir as configurações do BIOS para o padrão. Esses servidores parecem ter uma configuração não ideal também. Veja minha edição abaixo.
ewwhite
Você deve tentar executar apenas 1 thread por núcleo. Se o núcleo for lento, uma carga alta pode significar que a CPU está gastando muito tempo alternando tarefas e está fazendo menos.
Nemo
Você pode pesquisar na Internet "benchmarks de CPU" para encontrar comparações de desempenho. Meu recurso favorito é o CPUBenchmark.net .
6
Veja também a diferença de tamanho do cache. Erros de cache podem ser terríveis.
acelent

Respostas:

44

Os avanços do processador, a velocidade do relógio e os cálculos do IPC podem tornar quase impossível tentar comparar razoavelmente as CPUs antigas com as modernas. Não apenas as instruções por ciclo variam, mas os processadores mais novos possuem conjuntos de instruções dedicados a cálculos complexos (a Intel adicionou o AES-NI como exemplo); a velocidade do clock não é mais um comparador razoável, devido a esses fatores (mencionei multi-core vs hyperthreading ...). Com tempo e paciência suficientes, você certamente pode descobrir quantos processos mais antigos equivalem a 1 processo mais novo, mas os cálculos acabarão dizendo que é mais barato e mais rápido comprar uma nova CPU.

Jim B
fonte
2
Existem muitos sites por aí que já fazem isso, comparando os benchmarks de CPU de cada processador.
Michael Hampton
4
Não é exato, mas aqui está o benchmark do Passmark para Intel Xeon E5-2680 a 2.70GHz vs Intel Xeon X7350 a 2.93GHz
chue x
O problema com uma referência é que, por sua própria natureza, não é otimizado para esse processador em particular. Não é ruim para uma estimativa aproximada, mas você teria que reescrever e recompilar com o melhor conjunto de instruções para cada um. muito poucas ferramentas são escritos com algo diferente de "quantas vezes pode 'x' ser calculado.
Jim B
11
@ JimB, sim, mas a simulação dos OPs também pode não ser otimizada para uma CPU específica. (se for, eu perdi, sorry)
David Balažic
11
Provavelmente não, nesse caso a simulação é de fato a referência, a menos que o programa seja recompilado. Um benchmark de terceiros seria menos preciso.
Jim B
32

Não quero parecer terrível enfatizando algo que deve ser óbvio aqui, mas você está comparando um processador de servidor high-end de 2014 com um processador de servidor high-end de 2007 .

Não acho que isso exija muito mais explicação.

Há uma razão pela qual um HP ProLiant DL580 G5 está disponível tão barato hoje . Eles eram grandes, lentos e carecem de muitos recursos desejáveis ​​em servidores mais modernos. Eu vendi meu último em 2009 . Foi uma compra ruim e você seria melhor atendido com uma CPU das famílias de CPU Nehalem ou Westmere, se for obrigado a comprar equipamentos usados.

Além disso, os servidores que você adquiriu são muito ineficientes em termos de consumo de energia e, portanto, serão onerosos.


Parece que seus servidores físicos estão sendo executados em um modo de economia de energia que reduziu a velocidade do relógio da CPU. Você quer entrar no BIOS (pressione F9 na inicialização) e redefinir o servidor para os padrões de fábrica ( quem sabe o que mais foi modificado por padrão? )

insira a descrição da imagem aqui

ewwhite
fonte
7
@GlaucoCattalini #
ewwhite
11
Você poderia elaborar sobre isso? Estou tendo problemas para digeri-lo. Eu tenho a opção de mudar para outros modelos, então eu quero acertar se se trata disso. - No começo, pensei que poderia ser o tamanho do cache do E5 (30MB), mas depois seria compartilhado entre outros VPS.
Glauco Cattalini fecha 28/11
11
@GlaucoCattaliniLins O X7350 é baseado na microarquitetura Core 2. Na verdade, é comparável a um Core 2 Quad (quanto tempo se passou desde a última vez que você ouviu isso?). É tão antigo que não suporta instruções SSE4 +, AVX (2), FMA ou AES; portanto, se suas simulações são numéricas, elas recebem uma penalidade> 2x mais ali, e a velocidade de criptografia AES sofre ainda mais. Por fim, a Intel lançou 6 melhorias microarquiteturais desde o Core 2 e, com cada uma delas, aumenta a capacidade da CPU de executar mais instruções em paralelo ou fora de ordem, a largura de banda da memória.
Iwillnotexist Idonotexist
10
@GlaucoCattaliniLins Por outro lado, o servidor VPS suporta FMA, portanto é pelo menos tão novo quanto a microarquitetura Haswell. A instrução FMA permite fazer uma multiplicação e adição dois em um, e tudo em Haswell (os decodificadores de instruções, buffer de reordenamento, preditores de ramificação, largura de banda da memória, ALUs) foi ajustado para que os FMAs de vetor duplo possam ser mantidos alimentados . Haswell pode, assim, manter, num único ciclo de relógio: 1) Duas operações 8 de elementos do vetor do formulário float d = a + b*c, 2) Duas cargas de 32 bytes (a ae b) e 3) um armazenamento de 32-byte de (a d). É incrivelmente bem ajustado.
Iwillnotexist Idonotexist
2
@IwillnotexistIdonotexist: ele quase certamente não compilou para cada máquina separadamente -march=native, então eu acho que o código dele está usando apenas SSE2 em qualquer sistema. Eu acho que a largura de banda da memória é provavelmente um gargalo, esp. se o kernel dele não tem suporte ao NUMA ou os padrões de alocação do sim não são compatíveis com o NUMA. É isso que, quad socket quad core, com controladores de memória de canal duplo em cada soquete?
Peter Cordes