橋接接口間偶爾丟包

橋接接口間偶爾丟包

我有兩台基於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 表,但在解決多宿主問題後,我們又回到了橋接器。

在此輸入影像描述

相關內容