我有兩台基於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
負載平均值中的高值。 Idle幾乎總是96。
在虛擬化主機和虛擬機器的日誌中,我沒有看到這種行為的原因。我不明白如何找出丟包的原因。看起來像是短期虛擬機器凍結。
環境:
- 虛擬化主機和虛擬機器上的 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
- 虛擬安裝 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
就我而言,這是 KVM 橋接器中 EVPN/VXLAN 結構和 FDB 表中的多宿主問題。發生了什麼:虛擬機器發送了 arp 請求或其他廣播/多播流量。這樣的框架會擊中bridge -> bond -> one of the physical interfaces -> ip fabric
。水平分割/指定貨代然後,該訊框將在EVPN/VXLAN 結構中錯誤地工作,並且該訊框將在KVM 伺服器的另一個實體介面上返回到同一綁定,然後返回網橋,從而更改該介面與虛擬機器MAC 位址的比率FDB表到bond介面。作為解決方法,我們切換到 macvtap,它排除了 FDB 表,但在解決多宿主問題後,我們又回到了橋接器。