桥接接口之间偶尔出现数据包丢失

桥接接口之间偶尔出现数据包丢失

我有两个基于 libvirt 和 KVM 的虚拟化服务器。有时我发现某个虚拟机上的软件包丢失了。重新启动虚拟化主机后,这个问题就解决了,但只能维持一段时间。

我已经在 iptraph-ng 中制作了过滤器,并且发现桥接接口之间丢失了数据包。

你可以在这里看到它::

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

无丢包时:

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

虚拟接口的设置:

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>

当数据包丢失时,我没有在桥接接口、绑定的 VLAN 接口或 Tap 接口上看到任何 RX/TX 错误或丢包(ifconfig br121 and etc.)。我没有看到计数器有任何增加virsh domifstat vm-rep vnet18。我从 linuxbridge 切换到 openvSwitch,但这没有帮助,如果我运行ovs-ofctl dump-ports ovsbr121,我看不到任何错误或丢包。我在 openvSwitch 中启用了调试级别,我也没有在桥接接口中看到任何错误或丢包。

此虚拟机是 nginx 上的存储库,在 Serh 上有一个块设备 rbd,没有内存/处理器/块设备负载。虚拟化主机也没有负载,在中或 中top我没有看到wa, hi, si, st负载平均值的高值。空闲几乎总是 96。主机上只有 17 个虚拟机。

在虚拟化主机和虚拟机的日志中,我没有看到这种行为的原因。我不明白如何找出数据包丢失的原因。这看起来像是短期虚拟机冻结。

环境:

  • 虚拟化主机和 VM 上的 Rocky Linux 8.5。
  • libvirtd(libvirt)6.0.0
  • QEMU 模拟器版本 4.2.0(qemu-kvm-4.2.0-60.module+el8.5.0+772+743bb337.2)
  • 内核 4.18.0-348.23.1.el8_5.x86_64
  • virt-install 2.2.1

该虚拟机是使用 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"

有时其他虚拟机也会发生此类数据包丢失,但这个虚拟机最常发生这种情况。重新启动虚拟机没有帮助,只能重新启动虚拟化主机。

有什么方法可以追踪/转储或者至少以某种方式查看丢失的数据包发生了什么?

答案1

就我而言,这是 EVPN/VXLAN 结构和 KVM 桥接器中的 FDB 表中的多宿主问题。发生了什么:虚拟机发送了 arp 请求或其他广播/多播流量。这样的帧将命中bridge -> bond -> one of the physical interfaces -> ip fabric水平分割/指定转发器然后会在 EVPN/VXLAN 结构中错误地工作,并且该帧会通过 KVM 服务器的另一个物理接口返回到相同的绑定,然后返回到网桥,从而将接口与 FDB 表中 VM 的 mac 地址的比率更改为绑定接口。作为一种解决方法,我们切换到 macvtap,它排除了 FDB 表,但在解决多宿主问题后,我们又回到了网桥。

在此处输入图片描述

相关内容