У меня есть два сервера виртуализации на основе 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>
Когда пакеты теряются, я не вижу никаких ошибок RX/TX или сбрасываний на интерфейсе моста, связанном интерфейсе vlan или интерфейсе tap (ifconfig br121 and etc.)
. Я не вижу никакого увеличения счетчиков с virsh domifstat vm-rep vnet18
. Я переключился с linuxbridge на openvSwitch, но это не помогло, и если я запускаю ovs-ofctl dump-ports ovsbr121
, я не вижу никаких ошибок или сбрасываний. Я включил уровень отладки в openvSwitch и также не вижу никаких ошибок или сбрасываний на интерфейсах моста.
Эта виртуальная машина является репозиторием на nginx и имеет блочное устройство rbd на Serh и никакой нагрузки на память/процессор/блочное устройство. Хост виртуализации также не загружен, в top
я не вижу высоких значений в wa, hi, si, st
или в значении средней нагрузки. Idle почти всегда 96. На хосте всего 17 виртуальных машин.
В логах хостов виртуализации и ВМ я не увидел причин такого поведения. Я не понимаю, как можно выяснить причину потери пакетов. Похоже на кратковременное зависание ВМ.
Среда:
- 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
В моем случае это была проблема с multihoming в фабрике EVPN/VXLAN и таблицей FDB в мосте на KVM. Что произошло: виртуальные машины отправляли запросы arp или другой широковещательный/многоадресный трафик. Такой кадр попадал в bridge -> bond -> one of the physical interfaces -> ip fabric
.Разделенный горизонт/назначенный экспедитортогда неправильно работало бы в фабрике EVPN/VXLAN, и этот кадр возвращался бы на другой физический интерфейс сервера KVM к той же связи, а затем к мосту, тем самым изменяя соотношение интерфейса к mac-адресу виртуальной машины в таблице FDB к интерфейсу связи. В качестве обходного пути мы перешли на macvtap, который исключает таблицу FDB, но после решения проблемы с множественной адресацией мы вернулись к мостам.