Núcleos de CPU virtualizados vs. hilos

8

Tenemos un sistema host KVM en Ubuntu 9.10 con una nueva CPU Xeon Quad-core con hyperthreading. Como se detalla en la página de productos de Intel , el procesador tiene 4 núcleos pero 8 hilos. / proc / cpuinfo y htop enumeran 8 procesadores, aunque cada uno establece 4 núcleos en cpuinfo. KVM / QEMU también informa 8 VCPU disponibles para asignar a los invitados.

Mi pregunta es cuando estoy asignando VCPU a invitados de VM, ¿debería asignar por núcleo o por subproceso? Dado que KVM / QEMU informa que el servidor tiene 8 VCPU para asignar, ¿debo seguir adelante y configurar un invitado para usar 4 CPU donde previamente lo habría configurado para usar 2 (suponiendo que 4 VCPU disponibles en total)? Me gustaría aprovechar al máximo el hardware del host sin una asignación excesiva.

Actualización: la respuesta de Chopper3 es, sin duda, el enfoque correcto. Sin embargo, todavía me encantaría saber de cualquier experto en hardware que pueda dilucidar los aspectos de rendimiento de los hilos frente a los núcleos ... ¿alguien?

nedm
fuente

Respuestas:

8

Establezca el número más bajo de vCPU que sus servidores necesitan para realizar su función, no los asigne en exceso o podría ralentizar fácilmente sus máquinas virtuales.

Chopper3
fuente
1
Esto parece un enfoque sabio. Aún así, tengo curiosidad por saber cómo la asignación de VCPU por subproceso en lugar de por núcleo afecta el rendimiento. Pero he visto algunas de las cosas muy malas que pueden suceder por la sobreasignación, y el uso de la misma cantidad de VCPU que en un host sin hipertensión parece manejar la carga de manera adecuada para los invitados, por lo que me iré bastante bien y planee experimentar en una caja que no sea de producción alguna vez.
nedm
1
+1, la respuesta también depende de su carga de trabajo. Para las máquinas virtuales que están fuertemente vinculadas a la CPU, cuéntelas como si tuvieran un núcleo completo; Pero en general, siempre asigne tan poco como pueda y evitará grandes dolores de cabeza.
Chris S
1
Si bien estoy de acuerdo con el enfoque minimalista, KVM no es VMWare en este sentido. Sin programación de pandillas significa que se pueden usar más vCPU por VM de forma inofensiva
dyasny
5

Por lo general, HT funciona bien en cargas de trabajo que son más pesadas en IO: la CPU puede programar más tareas de procesamiento desde la cola de la otra CPU virtual mientras la primera CPU virtual espera en la IO. Realmente, todos los subsistemas HT lo consiguen mediante el cambio de contexto acelerado por hardware, que es el patrón de carga de trabajo que también se usa al cambiar entre máquinas virtuales. Por lo tanto, HT (generalmente) reducirá un poco la desaceleración cuando tenga más máquinas virtuales que núcleos, siempre que cada máquina virtual obtenga un núcleo virtual.

Asignar múltiples vCPU a una VM puede mejorar el rendimiento si las aplicaciones en la VM están escritas para subprocesos, pero también dificulta la vida del hipervisor; tiene que asignar tiempo en 2 o 4 CPU a la vez, por lo que si tiene una CPU de cuatro núcleos y una VM de vCPU cuádruple, solo se puede programar una VM durante ese intervalo de tiempo (mientras que puede ejecutar 4 VM de vCPU individuales diferentes En seguida).

techieb0y
fuente
@Chris, @ techieb0y: Gracias, este es exactamente el tipo de información que estaba buscando.
nedm
Esto no es exactamente cierto. Cuando una máquina virtual con vCPU cuádruples necesita programar un solo v-core, esto es lo que se programa en el host, no en los 4 núcleos. Al menos este es el caso con KVM (sé que el enfoque de vmware es menos efectivo, ya que hacen la planificación de pandillas)
dyasny
5

Esto es bastante complicado. Dependiendo de las cargas, HT puede aumentar el rendimiento en ~ 30% o disminuirlo. Normalmente aconsejo no asignar más vCPU de las que tiene núcleos físicos a una sola VM, pero si la VM está bastante inactiva (y, por supuesto, esa VM no requerirá demasiadas CPU), puede entregarse como muchas vCPU como tienes subprocesos. Realmente no quieres darle a una sola VM más vCPU de las que tienes núcleos programables, es a lo que me refiero . Y en cualquier caso, el consejo de @ Chopper3 es correcto: no le dé a la VM más CPU v de las que absolutamente necesita.

Por lo tanto, dependiendo de cuán cargados y críticos sean sus máquinas virtuales, no se sobreasigna en absoluto, se adhiere al recuento de núcleos físicos o llega al recuento de subprocesos por máquina virtual.

Ahora, entrando en la cuestión de HT, generalmente es bueno tenerlo, especialmente cuando confirma más vCPU en sus máquinas virtuales de las que tiene núcleos físicos o incluso subprocesos, porque facilita que el planificador de Linux programe esas vCPU.

Una última cosa, con kvm, una vCPU asignada a una VM es solo un proceso en el host, programado por el planificador de Linux, por lo que todas las optimizaciones normales que puede hacer aquí se aplican fácilmente. Además, la configuración de núcleos / sockets es la forma en que este proceso se mostrará para el sistema operativo invitado de la VM, en el host todavía es solo un proceso, independientemente de cómo lo vea la VM.

dyasny
fuente
2

Pienso en explicar la respuesta de Chopper3: si los sistemas son en su mayoría inactivos a la CPU, no asigne un montón de vcpu, si son intensos en la CPU, tenga mucho cuidado de no sobreasignar. Debería poder asignar un total de 8 vCPU sin contención. Puede sobreasignar, pero si lo hace, asegúrese de que ningún invitado individual, especialmente un invitado con uso intensivo de CPU, tenga 8 vcpu, o tendrá contención. No sé si el mecanismo del planificador KVM sea más específico que eso.

Lo anterior se basa en la siguiente comprensión de vCPU versus CPU fijada, pero también en la suposición de que KVM permitirá que un solo invitado (o varios invitados) acapare toda la CPU real de los demás si le asigna (/ ellos) suficientes hilos. vCPU ~ subproceso de host, CPU de invitado CPU = núcleo de host, CPU de invitado (No he jugado con vCPU mixta y CPU fijada en el mismo invitado, porque no tengo Hyperthreading).

Nakarti
fuente
1
La vCPU fijada es solo un proceso de CPU virtual que se asigna para ejecutarse solo en un núcleo específico (o un subconjunto de núcleos). Si no está sobreasignando y quiere asegurarse de que las máquinas virtuales no compiten por el tiempo de CPU del mismo núcleo, puede anclarlas a diferentes núcleos. Esta también es una forma de hacer NUMA pinning, aunque puedes hacerlo directamente hoy en día
dyasny