Reduzindo a perda de desempenho da VM
4. Use o comando virsh edit para editar a configuração XML da VM que você deseja otimizar, neste exemplo super-VM:
# virsh edit super-vm
5. Ajuste a configuração XML da VM da seguinte maneira:
a. Configure a VM para usar 8 vCPUs estáticas. Use o elemento <vcpu/> para fazer isso. b. Fixe cada uma das roscas da vCPU nas roscas correspondentes da CPU hospedeira que ela
espelha na topologia. Para fazer isso, use os elementos <vcpupin/> na seção <cputune>. Observe que, como mostrado pelo utilitário virsh capabilities acima, os fios da CPU do host não são ordenados seqüencialmente em seus respectivos núcleos. Além disso, as roscas vCPU devem ser fixadas ao conjunto mais alto disponível de núcleos hospedeiros no mesmo nó NUMA. Para uma ilustração da tabela, veja a seção Additional Resources abaixo. A configuração XML para as etapas a. e b. pode parecer semelhante a:
<cputune>
<vcpupin vcpu='0' cpuset='1'/>
c. Configure o VM para usar 1 página gigantesca GiB:
d. Configurar os nós NUMA da VM para usar a memória dos nós NUMA correspondentes no host. Para fazer isso, use os elementos <memnode/> na seção <numatune/>:
e. Certifique-se de que o modo CPU esteja configurado para host-passthrough, e que a CPU utilize o cache no modo passthrough:
6. A configuração XML resultante da VM deve incluir uma seção similar à seguinte: <vcpupin vcpu='1' cpuset='4'/>
<vcpupin vcpu='2' cpuset='2'/>
<vcpupin vcpu='3' cpuset='5'/>
<vcpupin vcpu='4' cpuset='7'/>
<vcpupin vcpu='5' cpuset='10'/>
<vcpupin vcpu='6' cpuset='8'/>
<vcpupin vcpu='7' cpuset='11'/>
<emulatorpin cpuset='6,9'/> </cputune>
<memoryBacking>
<hugepages>
<page size='1' unit='GiB'/>
</hugepages> </memoryBacking> <numatune>
<memory mode="preferred" nodeset="1"/>
<memnode cellid="0" mode="strict" nodeset="0"/>
<memnode cellid="1" mode="strict" nodeset="1"/> </numatune>
<cpu mode="host-passthrough">
<topology sockets="2" cores="2" threads="2"/>
<cache mode="passthrough"/>
[...]
<memoryBacking>
<hugepages>
<page size='1' unit='GiB'/>
</hugepages>
</memoryBacking>
<vcpu placement='static'>8</vcpu>
<cputune>
<vcpupin vcpu='0' cpuset='1'/>
<vcpupin vcpu='1' cpuset='4'/>
<vcpupin vcpu='2' cpuset='2'/>
<vcpupin vcpu='3' cpuset='5'/>
<vcpupin vcpu='4' cpuset='7'/>
<vcpupin vcpu='5' cpuset='10'/>
<vcpupin vcpu='6' cpuset='8'/>
<vcpupin vcpu='7' cpuset='11'/>
<emulatorpin cpuset='6,9'/>
7. Optional: Teste o desempenho da VM usando as ferramentas e utilitários aplicáveis para avaliar o impacto da otimização da VM.
Recursos adicionais
As tabelas a seguir ilustram as conexões entre as vCPUs e as CPUs anfitriãs às quais elas devem ser fixadas:
Tabela 11.1. Topologia do hospedeiro
CPU threads 0 3 1 4 2 5 6 9 7 10 8 11 Cores 0 1 2 3 4 5 Sockets 0 1 NUMA nodes 0 1 Tabela 11.2. Topologia VM vCPU threads 0 1 2 3 4 5 6 7 Cores 0 1 2 3 Sockets 0 1 NUMA nodes 0 1 <numatune>
<memory mode="preferred" nodeset="1"/>
<memnode cellid="0" mode="strict" nodeset="0"/>
<memnode cellid="1" mode="strict" nodeset="1"/>
</numatune>
<cpu mode="host-passthrough">
<topology sockets="2" cores="2" threads="2"/>
<cache mode="passthrough"/>
<numa>
<cell id="0" cpus="0-3" memory="2" unit="GiB">
<distances>
<sibling id="0" value="10"/>
<sibling id="1" value="21"/>
</distances>
</cell>
<cell id="1" cpus="4-7" memory="2" unit="GiB">
<distances>
<sibling id="0" value="21"/>
<sibling id="1" value="10"/>
</distances>
</cell>
</numa>
</cpu> </domain>
Tabela 11.3. Topologia combinada de host e VM vCPU threads 0 1 2 3 4 5 6 7 Host CPU threads 0 3 1 4 2 5 6 9 7 10 8 11 Cores 0 1 2 3 4 5 Sockets 0 1 NUMA nodes 0 1
Neste cenário, existem 2 nós NUMA e 8 vCPUs. Portanto, 4 fios de vCPU devem ser fixados a cada nó.
Além disso, a Red Hat recomenda deixar pelo menos uma única linha de CPU disponível em cada nó para as operações do sistema hospedeiro.
Como neste exemplo, cada nó NUMA abriga 3 núcleos, cada um com 2 fios de CPU hospedeira, o conjunto para o nó 0 se traduz como segue:
11.5.5. Desativação da fusão do kernel na mesma página
Embora a fusão da mesma página do kernel (KSM) melhore a densidade da memória, ela aumenta a utilização da CPU e pode afetar adversamente o desempenho geral, dependendo da carga de trabalho. Nestes casos, você pode melhorar o desempenho da máquina virtual (VM) desativando o KSM.
Dependendo de suas necessidades, você pode tanto desativar o KSM para uma única sessão ou persistentemente.
Procedimento
Para desativar o KSM para uma única sessão, use o utilitário systemctl para parar ksm e ksmtuned serviços.
# systemctl stop ksm # systemctl stop ksmtuned
Para desativar o KSM persistentemente, use o utilitário systemctl para desativar ksm e ksmtuned serviços.
# systemctl disable ksm
Removed /etc/systemd/system/multi-user.target.wants/ksm.service. # systemctl disable ksmtuned
Removed /etc/systemd/system/multi-user.target.wants/ksmtuned.service.
<vcpupin vcpu='0' cpuset='1'/> <vcpupin vcpu='1' cpuset='4'/> <vcpupin vcpu='2' cpuset='2'/> <vcpupin vcpu='3' cpuset='5'/>
NOTA
As páginas de memória compartilhadas entre os VMs antes de desativar o KSM
continuarão a ser compartilhadas. Para parar de compartilhar, exclua todas as páginas de PageKSM no sistema usando o seguinte comando:
# echo 2 > /sys/kernel/mm/ksm/run
Depois de páginas anônimas substituírem as páginas do KSM, o serviço do kernel khugepaged reconstruirá hugepages transparentes na memória física da VM.
11.6. OTIMIZANDO O DESEMPENHO DA REDE DE MÁQUINAS VIRTUAIS
Devido à natureza virtual da placa de interface de rede (NIC) de uma VM, a VM perde uma parte de sua largura de banda de rede alocada ao host, o que pode reduzir a eficiência geral da carga de trabalho da VM. As seguintes dicas podem minimizar o impacto negativo da virtualização no rendimento virtual da placa de interface de rede (vNIC).Procedimento
Use qualquer um dos métodos a seguir e observe se tem um efeito benéfico no desempenho de sua rede VM:
Habilitar o módulo vhost_net
No host, certifique-se de que o recurso do kernel vhost_net esteja habilitado: # lsmod | grep vhost
vhost_net 32768 1
vhost 53248 1 vhost_net tap 24576 1 vhost_net tun 57344 6 vhost_net
Se a saída deste comando estiver em branco, ative o módulo do kernel vhost_net: # modprobe vhost_net
Criar uma rede virtio-multi-frequência
Para configurar o recurso multi-queue virtio-net para uma VM, use o comando virsh edit para editar para a configuração XML da VM. No XML, adicione o seguinte na seção <devices>, e substitua N pelo número de vCPUs na VM, até 16:
<interface type='network'> <source network='default'/> <model type='virtio'/>
<driver name='vhost' queues='N'/> </interface>
Se o VM estiver funcionando, reinicie-o para que as mudanças entrem em vigor. Pacotes de rede em lotes
Nas configurações Linux VM com um longo caminho de transmissão, a dosagem de pacotes antes de submetê-los ao kernel pode melhorar a utilização do cache. Para configurar o agrupamento de
pacotes, use o seguinte comando no host, e substitua tap0 pelo nome da interface de rede que as VMs usam:
# ethtool -C tap0 rx-frames 128 SR-IOV
Se seu NIC hospedeiro suporta SR-IOV, use a designação do dispositivo SR-IOV para seus vNICs. Para mais informações, consulte Gerenciando os dispositivos SR-IOV.
Recursos adicionais
Para informações adicionais sobre tipos de conexão de rede virtual e dicas de uso, consulte
Entendendo a rede virtual.
11.7. FERRAMENTAS DE MONITORAMENTO DE DESEMPENHO DE
MÁQUINAS VIRTUAIS
Para identificar o que consome mais recursos de VM e qual aspecto do desempenho da VM necessita de otimização, podem ser utilizadas ferramentas de diagnóstico de desempenho, tanto gerais quanto específicas de VM.