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 に切り替えましたが、マルチホーミングの問題を解決した後、ブリッジに戻りました。