Estou usando o KVM / libvirt em um servidor Linux com CPU Core i7-2600, que tem a seguinte topologia de CPU (1 soquete, 4 núcleos, 8 segmentos):
Physical | Logical
---------+--------
Core 0 | 0, 4
Core 1 | 1, 5
Core 2 | 2, 6
Core 3 | 3, 7
Eu normalmente executo 3 máquinas virtuais neste host, cada uma com 2 CPUs virtuais. A fim de melhorar o desempenho, mantendo os caches quentes, gostaria de fixar o vCores das VMs para núcleos de host fixos.
A questão agora é o mapeamento de núcleos de VMs para hospedar núcleos, considerando o fato de que a CPU do host usa Hyperthreading:
Opção 1: uma VM por núcleo de host físico
VM1: logical cores 1, 5
VM2: logical cores 2, 6
VM3: logical cores 3, 7
Dessa forma, os dois núcleos virtuais de uma VM seriam mapeados para hyperthreads irmãos na CPU do host. O código do convidado lucraria com a localidade do cache, pois os dois núcleos do host compartilham alguns caches.
Mas, dado o fato de que dois hyperthreads também compartilham algumas unidades funcionais, eles se tornam mais lentos sob carga computacional.
Opção 2: núcleos de VMs distribuídos
VM1: logical cores 1, 2
VM2: logical cores 3, 5
VM3: logical cores 6, 7
Esse mapeamento tem a vantagem de que, se uma VM experimentar carga computacional em ambos os seus dois núcleos virtuais, essa carga será mapeada em dois núcleos físicos separados no host. Se nenhuma outra VM estiver sob carga naquele momento, a primeira poderá usar dois núcleos físicos, em vez de apenas um com a Opção 1.
Todas as VMs executam principalmente serviços web (Nginx, MySQL, PHP-FPM), então eu sei que a questão é de natureza bastante teórica - mas eu ainda gostaria de saber.