Virtualização: fixação de vCPU com CPU Host Hyperthreading?

Virtualização: fixação de vCPU com CPU Host Hyperthreading?

Estou usando KVM/libvirt em um servidor Linux com CPU Core i7-2600, que possui a seguinte topologia de CPU (1 soquete, 4 núcleos, 8 threads):

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

Normalmente executo 3 máquinas virtuais neste host, cada uma com 2 CPUs virtuais. Para melhorar o desempenho mantendo os caches quentes, gostaria de fixar os vCores das VMs em núcleos de host fixos.

A questão agora é o mapeamento dos núcleos da VM para os núcleos do host, 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 convidado lucraria com a localidade do cache, já que os dois núcleos do host compartilham alguns caches.

Mas dado o fato de que dois hyperthreads também compartilham algumas unidades funcionais, eles desacelerariam um ao outro sob carga computacional.

Opção 2: núcleos de VM 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 sofrer 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 da web (Nginx, MySQL, PHP-FPM), então sei que a questão é de natureza bastante teórica - mas ainda assim gostaria de saber.

Responder1

Você pode estar pensando demais nisso.

A atribuição manual de núcleos aqui pode resultar em desempenho inferior. No mundo VMware, não fazemos isso a menos que haja requisitos muito específicos, mas para a carga de trabalho e os aplicativos que você descreveu, não é necessário. Deixe o KVM agendar as coisas e pronto. Em caso de dúvida, obtenha mais núcleos e soquetes. Mas a CPU não será o fator limitante em uma implantação tão pequena.

Responder2

A opção 1 não deve ficar lenta na maioria dos casos, mas o sistema operacional e os programas podem ficar satisfeitos com suas cargas de trabalho. Pode ficar empilhado. Acho que a opção 2 é melhor se o seu vizinho não se importar com a ~pequena~ desaceleração.

informação relacionada