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?
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).
fuente
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.
fuente
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).
fuente