Virtualización: ¿fijación de vCPU con CPU host Hyperthreading?

Virtualización: ¿fijación de vCPU con CPU host Hyperthreading?

Estoy usando KVM/libvirt en un servidor Linux con CPU Core i7-2600, que tiene la siguiente topología de CPU (1 zócalo, 4 núcleos, 8 subprocesos):

Physical | Logical
---------+--------
Core 0   | 0, 4
Core 1   | 1, 5
Core 2   | 2, 6
Core 3   | 3, 7

Normalmente ejecuto 3 máquinas virtuales en este host, cada una con 2 CPU virtuales. Para mejorar el rendimiento manteniendo los cachés activos, me gustaría fijar los núcleos virtuales de las máquinas virtuales a núcleos de host fijos.

La pregunta ahora es el mapeo de los núcleos de VM a los núcleos del host, considerando el hecho de que la CPU del host usa Hyperthreading:

Opción 1: una máquina virtual por núcleo de host físico

VM1: logical cores 1, 5
VM2: logical cores 2, 6
VM3: logical cores 3, 7

De esta manera, los dos núcleos virtuales de una VM se asignarían a hiperprocesos hermanos en la CPU del host. El código invitado se beneficiaría de la localidad del caché, ya que los dos núcleos del host comparten algunos cachés.

Pero dado que dos hiperprocesos también comparten algunas unidades funcionales, se ralentizarían entre sí bajo carga computacional.

Opción 2: núcleos de VM distribuidos

VM1: logical cores 1, 2
VM2: logical cores 3, 5
VM3: logical cores 6, 7

Este mapeo tiene la ventaja de que, si una VM experimenta una carga computacional en sus dos núcleos virtuales, esta carga se mapea en dos núcleos físicos separados en el host. Si no hay otra VM bajo carga en ese momento, la primera podría usar dos núcleos físicos, en lugar de solo uno con la Opción 1.

Todas las máquinas virtuales ejecutan principalmente servicios web (Nginx, MySQL, PHP-FPM), por lo que sé que la pregunta es de naturaleza bastante teórica, pero aún así me gustaría saberla.

Respuesta1

Quizás estés pensando demasiado en esto.

La asignación manual de núcleos aquí podría resultar en un menor rendimiento. En el mundo de VMware, no hacemos esto a menos que existan requisitos muy específicos, pero para la carga de trabajo y las aplicaciones que describió, no es necesario. Deje que KVM programe las cosas y listo. En caso de duda, consiga más núcleos y enchufes. Pero la CPU no será el factor limitante en una implementación tan pequeña.

Respuesta2

La opción 1 no debería ralentizarse en la mayoría de los casos, pero el sistema operativo y los programas podrían funcionar con sus cargas de trabajo. Podría acumularse. Creo que la opción 2 es mejor si a tu vecino no le importa la ~pequeña~ desaceleración.

información relacionada