我有两个基于 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 表,但在解决多宿主问题后,我们又回到了网桥。