Tenho dois servidores de virtualização baseados em libvirt e KVM. E às vezes vejo pacotes se perderem em uma máquina virtual específica. Depois de reiniciar o host de virtualização esse problema é resolvido, mas ajuda por um tempo.
Fiz filtros no iptraph-ng e vejo que os pacotes são perdidos entre interfaces de ponte.
Você pode vê-lo aqui::
Fri Mar 3 00:21:43 2023; ICMP; ens3f0; 84 bytes; from 10.10.10.68 to 10.10.11.23; echo req
Fri Mar 3 00:21:43 2023; ICMP; bond1; 84 bytes; from 10.10.10.68 to 10.10.11.23; echo req
Fri Mar 3 00:21:43 2023; ICMP; bond1.121; 84 bytes; from 10.10.10.68 to 10.10.11.23; echo req
Fri Mar 3 00:21:43 2023; ICMP; ens3f0; 84 bytes; from 10.10.10.68 to 10.10.11.23; echo req
Fri Mar 3 00:21:43 2023; ICMP; bond1; 84 bytes; from 10.10.10.68 to 10.10.11.23; echo req
Fri Mar 3 00:21:43 2023; ICMP; bond1.121; 84 bytes; from 10.10.10.68 to 10.10.11.23; echo req
Quando não há perda de pacotes:
Fri Mar 3 00:21:43 2023; ICMP; ens3f0; 84 bytes; from 10.10.10.68 to 10.10.11.23; echo req
Fri Mar 3 00:21:43 2023; ICMP; bond1; 84 bytes; from 10.10.10.68 to 10.10.11.23; echo req
Fri Mar 3 00:21:43 2023; ICMP; bond1.121; 84 bytes; from 10.10.10.68 to 10.10.11.23; echo req
Fri Mar 3 00:21:43 2023; ICMP; vnet18; 84 bytes; from 10.10.10.68 to 10.10.11.23; echo req
Fri Mar 3 00:21:43 2023; ICMP; vnet18; 84 bytes; from 10.10.11.23 to 10.10.10.68; echo rply
Fri Mar 3 00:21:43 2023; ICMP; bond1.121; 84 bytes; from 10.10.11.23 to 10.10.10.68; echo rply
Fri Mar 3 00:21:43 2023; ICMP; bond1; 84 bytes; from 10.10.11.23 to 10.10.10.68; echo rply
Fri Mar 3 00:21:43 2023; ICMP; ens3f0; 84 bytes; from 10.10.11.23 to 10.10.10.68; echo rply
Configurações da interface virtual:
virsh dumpxml vm-rep |xmllint -xpath ///interface -
<interface type="bridge">
<mac address="52:54:00:2b:35:b4"/>
<source bridge="br121"/>
<target dev="vnet18"/>
<model type="virtio"/>
<alias name="net0"/>
<address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/>
</interface>
Quando os pacotes são perdidos, não vejo nenhum erro RX/TX ou quedas na interface bridge, bonded vlan interface ou tap interface (ifconfig br121 and etc.)
. Não vejo nenhum aumento nos contadores com virsh domifstat vm-rep vnet18
. Mudei do linuxbridge para o openvSwitch, mas isso não ajudou, e se eu executar ovs-ofctl dump-ports ovsbr121
, não vejo nenhum erro ou queda. Habilitei o nível de depuração no openvSwitch e também não vejo nenhum erro ou queda nas interfaces da ponte.
Esta máquina virtual é um repositório no nginx e possui um dispositivo de bloco rbd no Serh e nenhuma carga de memória/processador/dispositivo de bloco. O host de virtualização também não está carregado, top
não vejo valores altos wa, hi, si, st
ou no valor médio de carga. Ocioso é quase sempre 96. Existem apenas 17 máquinas virtuais no host.
Nos logs dos hosts de virtualização e da VM, não vi motivo para esse comportamento. Não entendo como posso descobrir a causa da perda de pacotes. Parece um congelamento de VM de curto prazo.
Ambiente:
- Rocky Linux 8.5 em host de virtualização e VM.
- libvirtd (libvirt) 6.0.0
- Emulador QEMU versão 4.2.0 (qemu-kvm-4.2.0-60.module+el8.5.0+772+743bb337.2)
- núcleo 4.18.0-348.23.1.el8_5.x86_64
- virt-install 2.2.1
A VM foi criada com virt-install:
virt-install \
--machine q35 \
--name vm-rep \
--memory=16384 \
--vcpus=8 \
--os-variant rocky8.5 \
--disk size=20,bus=virtio \
--network bridge=br121,model=virtio \
--graphics=vnc \
--boot hd,cdrom \
--noautoconsole \
--autostart \
--channel unix,mode=bind,path=/var/lib/libvirt/qemu/vm-rep.agent,target_type=virtio,name=org.qemu.guest_agent.0 \
--location /var/lib/libvirt/isos/Rocky-8.5-x86_64-minimal.iso \
--initrd-inject=ks.cfg \
--extra-args "inst.ks=file:/ks.cfg console=ttyS0,115200n8"
Às vezes, essas perdas de pacotes ocorrem para outras VMs, mas esta é mais frequente. Reiniciar a VM não ajuda, apenas reinicializar o host de virtualização.
Existe alguma maneira de rastrear/despejar ou pelo menos ver de alguma forma o que acontece com os pacotes perdidos?
Responder1
No meu caso, foi um problema de multihoming na estrutura EVPN/VXLAN e na tabela FDB na ponte do KVM. O que aconteceu: as VMs enviaram solicitações arp ou outro tráfego de transmissão/multicast. Tal quadro atingiria o bridge -> bond -> one of the physical interfaces -> ip fabric
.Split Horizon/Remetente Designadofuncionaria incorretamente na malha EVPN/VXLAN, e esse quadro voltaria em outra interface física do servidor KVM para o mesmo vínculo e depois para a ponte, alterando assim a proporção da interface para o endereço MAC da VM em a tabela FDB para a interface de ligação. Como solução alternativa, mudamos para macvtap, que exclui a tabela FDB, mas depois de resolver o problema de multihoming, voltamos para bridges.