ブリッジインターフェース間のパケット損失が時々発生する

ブリッジインターフェース間のパケット損失が時々発生する

libvirt と KVM に基づく 2 つの仮想化サーバーがあります。特定の仮想マシンでパッケージが失われることがあります。仮想化ホストを再起動するとこの問題は解決しますが、しばらくは役立ちます。

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 インターフェイス、またはタップ インターフェイスで 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 のログでは、この動作の理由は見つかりませんでした。パケット損失の原因を突き止める方法がわかりません。一時的な VM フリーズのように見えます。

環境:

  • 仮想化ホストおよび 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
  • 仮想インストール 2.2.1

VM は 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"

このようなパケット損失は他の VM でも発生することがありますが、最も頻繁に発生するのはこの VM です。VM を再起動しても効果はなく、仮想化ホストを再起動するしかありません。

失われたパケットがどうなるかをトレース/ダンプしたり、少なくとも何らかの方法で確認したりする方法はありますか?

答え1

私の場合、それは KVM のブリッジの EVPN/VXLAN ファブリックと FDB テーブルにおけるマルチホーミングの問題でした。何が起こったか: VM は ARP 要求またはその他のブロードキャスト/マルチキャスト トラフィックを送信しました。このようなフレームは にヒットしますbridge -> bond -> one of the physical interfaces -> ip fabricスプリットホライズン/指定フォワーダーその後、EVPN/VXLAN ファブリックで正しく動作せず、そのフレームは KVM サーバーの別の物理インターフェイスを経由して同じボンドに戻り、その後ブリッジに戻るため、ボンド インターフェイスに対する FDB テーブル内の VM の MAC アドレスに対するインターフェイスの比率が変更されます。回避策として、FDB テーブルを除外する macvtap に切り替えましたが、マルチホーミングの問題を解決した後、ブリッジに戻りました。

ここに画像の説明を入力してください

関連情報