¿Por qué mi computadora de núcleo desnudo de 16x 2.93GHz funciona peor que un VPS con 4x 2.5GHz?

34

Escribí una pieza de software multiproceso que realiza muchas simulaciones al día. Esta es una tarea muy intensiva de CPU, y he estado ejecutando este programa en servicios en la nube, generalmente en configuraciones como 1 GB por núcleo.

Estoy ejecutando CentOS 6.7, y /proc/cpuinfome da que mis cuatro núcleos VPS son 2.5GHz.

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:

Con un aumento de los tipos de cambio, mi VPS comenzó a ser más costoso, y he llegado a un "gran acuerdo" en los servidores de metal desnudo usados.

Compré cuatro HP DL580 G5 , con cuatro Intel Xeon X7350 cada uno. Básicamente, cada máquina tiene 16x núcleos de 2.93GHz y 16GB, para mantener cosas como mi nube 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:

Esencialmente, parecía mucho, ya que podía dejar de usar VPS para realizar estos trabajos por lotes. Ahora son las cosas raras ...

  1. En los VPS, he estado ejecutando 1.25 hilos por núcleo, tal como lo he estado haciendo en el metal desnudo. (El hilo adicional de 0.25 es para compensar el tiempo de inactividad causado por el uso de la red).
  2. En mi VPS, usando un total de 44x núcleos de 2.5GHz, obtengo casi 900 simulaciones por minuto.
  3. En mi DL580, usando un total de 64x 2.93GHz núcleos, solo obtengo 300 simulaciones por minuto.

Entiendo que el DL580 tiene un procesador más antiguo. Pero si estoy ejecutando un subproceso por núcleo y el servidor bare metal tiene un núcleo más rápido, ¿por qué funciona peor que mi VPS?

No tengo ningún cambio de memoria en ninguno de los servidores.

TOP dice que mis procesadores funcionan al 100%. Tengo una carga promedio de 18 (5 en VPS).

¿Va a ser así o me estoy perdiendo algo?

Ejecutar lscpu me da 1.6GHz en mi servidor de metal desnudo. Esto se vio en el /proc/cpuinfotambién.

¿Es correcta esta información o está vinculada a una administración de energía incorrecta?

[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
fuente
32
Porque los procesadores de ocho años hacen mucho menos por ciclo de reloj que los procesadores actuales.
Michael Hampton
3
Querrás restablecer la configuración de tu BIOS a la predeterminada. Estos servidores también parecen tener una configuración no óptima. Vea mi edición a continuación.
ewwhite
Debe intentar ejecutar solo 1 hilo por núcleo. Si el núcleo es lento, una carga alta puede significar que la CPU está pasando mucho tiempo cambiando de tarea y se está haciendo menos.
Nemo
Puede buscar "puntos de referencia de CPU" en Internet para encontrar comparaciones de rendimiento. Mi recurso favorito es CPUBenchmark.net .
66
Eche un vistazo a la diferencia de tamaño de caché también. Los errores de caché pueden ser terribles.
Acelerado

Respuestas:

44

Los avances del procesador, la velocidad del reloj y los cálculos de IPC pueden hacer que sea casi imposible intentar comparar razonablemente las CPU de una década con las modernas. No solo van a variar las instrucciones por ciclo, sino que los procesadores más nuevos tienen conjuntos de instrucciones dedicados a cálculos complejos (Intel ha agregado AES-NI como ejemplo), la velocidad del reloj ya no es un comparador razonable, debido a estos factores (mencioné multi-core vs hyperthreading ...). Con suficiente tiempo y paciencia, sin duda podría descubrir cuántos procesos más antiguos equivalen a 1 proceso más nuevo, pero los cálculos terminarán diciendo que es más barato y más rápido comprar una nueva CPU.

Jim B
fuente
2
Hay un montón de sitios web que ya hacen esto, comparando los puntos de referencia de CPU de cada procesador.
Michael Hampton
44
No es exacto, pero aquí está el punto de referencia Passmark para Intel Xeon E5-2680 @ 2.70GHz vs Intel Xeon X7350 @ 2.93GHz
chue x
El problema con un punto de referencia es que, por su propia naturaleza, no está optimizado para ese procesador en particular. No está mal para una estimación aproximada, pero tendría que volver a escribir y volver a compilar con el mejor conjunto de instrucciones para cada uno. muy pocas herramientas se escriben con otra cosa que no sea "¿cuántas veces se puede 'x' se calcula.
Jim B
1
@JimB, sí, pero la simulación de OP también podría no estar optimizada para una CPU en particular. (si es así, lo perdí, lo siento)
David Balažic
1
Probablemente no, en cuyo caso la simulación es de facto el punto de referencia a menos que el programa se vuelva a compilar. Un punto de referencia de un tercero sería menos preciso.
Jim B
32

No quiero sonar terrible enfatizando algo que debería ser obvio aquí, pero está comparando un procesador de servidor de gama alta de 2014 con un procesador de servidor de gama alta de 2007 .

No creo que esto requiera mucha más explicación.

Hay una razón por la cual un HP ProLiant DL580 G5 está disponible tan barato hoy . Eran grandes, lentos y carecen de muchas características que son deseables en servidores más modernos. Vendí mi último en 2009 . Fue una mala compra, y sería mejor que recibiera una CPU de las familias de CPU Nehalem o Westmere, si se ve obligado a comprar equipos usados.

Además, los servidores que compró son muy ineficientes en términos de consumo de energía, por lo que su funcionamiento será costoso.


Parece que sus servidores físicos están funcionando en un modo de ahorro de energía que redujo la velocidad del reloj de su CPU. Deberá ingresar al BIOS (presione F9 en el arranque) y restablecer el servidor a los valores predeterminados de fábrica (¿ quién sabe qué más se modificó de manera predeterminada? )

ingrese la descripción de la imagen aquí

ewwhite
fuente
77
@GlaucoCattaliniLins No.
ewwhite
1
¿Podrías dar más detalles sobre eso? Tengo problemas para digerirlo. Tengo la opción de cambiar por otros modelos, por lo que quiero hacerlo bien si se trata de eso. - Al principio pensé que podría ser el tamaño de caché del E5 (30 MB), pero luego sería compartido entre otros VPS.
Glauco Cattalini Lins
11
@GlaucoCattaliniLins El X7350 se basa en la microarquitectura Core 2. De hecho, es comparable a un Core 2 Quad (¿Cuánto tiempo ha pasado desde la última vez que escuchó sobre eso?). Es tan antiguo que no admite las instrucciones SSE4 +, AVX (2), FMA o AES, por lo que si sus simulaciones son numéricas, recibirán una penalización> 2x allí mismo, y la velocidad de cifrado AES sufre aún más. Por último, Intel ha lanzado 6 mejoras de microarquitectura desde Core 2, y con cada una aumenta la capacidad de la CPU para ejecutar más instrucciones en paralelo o fuera de orden, el ancho de banda de la memoria.
Iwillnotexist Idonotexist
10
@GlaucoCattaliniLins Por el contrario, su servidor VPS admite FMA, por lo que es al menos tan nuevo como la microarquitectura Haswell. La instrucción FMA le permite a uno hacer una multiplicación y adición dos en uno, y todo en Haswell (los decodificadores de instrucciones, el búfer de reordenamiento, los predictores de ramificación, el ancho de banda de memoria, las ALU) se ha ajustado para que los FMA de vector dual puedan mantenerse alimentados . Haswell puede sostener, en un solo ciclo de reloj: 1) Dos operaciones de vector de 8 elementos de la forma float d = a + b*c, 2) Dos cargas de 32 bytes (the ay b) y 3) un almacén de 32 bytes (the d). Está increíblemente bien ajustado.
Iwillnotexist Idonotexist
2
@IwillnotexistIdonotexist: es casi seguro que no compiló para cada máquina por separado -march=native, por lo que supongo que su código solo usa SSE2 en cualquiera de los sistemas. Supongo que el ancho de banda de la memoria es probablemente un cuello de botella, especialmente. si su núcleo no tiene soporte NUMA, o los patrones de asignación de su sim no son compatibles con NUMA. ¿Esto es qué, quad socket quad core, con controladores de memoria de doble canal en cada socket?
Peter Cordes