Duże ramki między gościem KVM a gospodarzem?

11

Próbuję wdrożyć 9000 bajtów MTU do komunikacji w pamięci między gośćmi KVM a systemem hosta. Host ma mostek ( br1) z 9000 bajtową jednostką MTU:

host# ip link show br1
8: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP 
    link/ether fe:54:00:50:f3:55 brd ff:ff:ff:ff:ff:ff
    inet 172.16.64.1/24 brd 172.16.64.255 scope global br1
    inet6 fe80::21b:21ff:fe0e:ee39/64 scope link 
       valid_lft forever preferred_lft forever

Goście mają interfejs podłączony do tego mostu, który ma również 9000 bajtów MTU:

guest# ip addr show eth2
4: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:50:f3:55 brd ff:ff:ff:ff:ff:ff
    inet 172.16.64.10/24 brd 172.16.64.255 scope global eth2
    inet6 fe80::5054:ff:fe50:f355/64 scope link 
       valid_lft forever preferred_lft forever

Mogę pingować z hosta do gościa:

host# ping -c4 172.16.64.10
PING 172.16.64.10 (172.16.64.10) 56(84) bytes of data.
64 bytes from 172.16.64.10: icmp_seq=1 ttl=64 time=1.15 ms
64 bytes from 172.16.64.10: icmp_seq=2 ttl=64 time=0.558 ms
64 bytes from 172.16.64.10: icmp_seq=3 ttl=64 time=0.566 ms
64 bytes from 172.16.64.10: icmp_seq=4 ttl=64 time=0.631 ms

--- 172.16.64.10 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3000ms
rtt min/avg/max/mdev = 0.558/0.727/1.153/0.247 ms

Ale jeśli zwiększę rozmiar pakietu ping powyżej 1490 bajtów, nie będę już mieć łączności:

host# ping -c4 -s 1491 172.16.64.10
PING 172.16.64.10 (172.16.64.10) 1491(1519) bytes of data.

--- 172.16.64.10 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3000ms

Śledzenie pakietów pokazuje, że pakiety te nigdy nie docierają do gościa. Wszystko, co przeczytałem, wskazuje, że zarówno interfejs mostu linuksowego, jak i virtiodyski sieciowe obsługują duże ramki, ale dla mnie wygląda to na problem MTU.

Czy brakuje mi czegoś naprawdę oczywistego?

Aktualizacja

Wyświetlanie strony hosta interfejsu gościa:

host# brctl show
bridge name bridge id       STP enabled interfaces
br1     8000.fe540050f355   no      vnet2

host# ip addr show vnet2
11: vnet2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast master br1 state UNKNOWN qlen 500
    link/ether fe:54:00:50:f3:55 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::fc54:ff:fe50:f355/64 scope link 
       valid_lft forever preferred_lft forever
Larsks
źródło
Jaka jest MTU w interfejsie tun dla VM na hoście?
mgorven
To także 9000 bajtów; Zaktualizowałem pytanie o dane wyjściowe brctli ip addr showdla tego interfejsu.
larsks
Dokładnie jaki jest system hosta?
Michael Hampton,
Arch Linux, z Linux 3.6.10 (x86_64), qemu-kvm 1.2.0, libvirt 1.0.1.
larsks

Odpowiedzi:

7

Chociaż był to problem MTU, okazuje się, że nie miał on nic wspólnego z ustawieniami MTU na żadnym z urządzeń składowych. Jak pokazałem w pierwotnym pytaniu, mostek hosta, interfejs hosta tun i interfejs gościa miały te same ustawienia MTU (9000 bajtów).

Rzeczywistym problemem był problem z konfiguracją libvirt / kvm. Domyślnie libvirt nie używa virtiourządzeń. W przypadku braku wyraźnej konfiguracji otrzymujesz kartę sieciową RealTek RTL-8139. Ta wirtualna karta sieciowa nie obsługuje dużych ramek .

Aby korzystać z virtiourządzeń, musisz określić jawny model. Podczas używania virt-install:

virt-install ... -w bridge=br1,model=virtio

Lub po fakcie poprzez dodanie <model>znacznika do odpowiedniego <interface>elementu w domenie XML:

<interface type="bridge">
  <model type="virtio"/>
  <source bridge="br1"/>
  <target dev="vnet2"/>
</interface>

Po wprowadzeniu tej zmiany wszystko działa zgodnie z przeznaczeniem.

Larsks
źródło
0

aby większa MTU działała, cały stos musi mieć wyższą MTU, która obejmuje gości, tapdevów i fizyczne karty sieciowe, do których most jest podłączony (jeśli po drodze masz obligacje i vlany - one też)

dyasny
źródło
Czy wiesz, czy konkretne przykłady, takie jak GigaEthernet i nie tylko, gdzie byłby to wynik automatycznych negocjacji? Ten post może być duplikatem: google.com/…
ArrowInTree,
nie, należy to zrobić ręcznie, cały stos ustawiony na najwyższą MTU dowolnego komponentu
dyasny 26.12.12
Tak, zdaję sobie z tego sprawę; jest to dobrze udokumentowane w każdym miejscu. Jak widać z pytania, goście, tapdevs i most mają wyższe MTU. Czy widzisz coś źle skonfigurowanego w podanych przeze mnie przykładach?
larsks
aby użyć niestandardowych ustawień MTU, wszystko musi być zgodne z domyślną MTU. Od góry do dołu powinna być gościnna karta sieciowa, kran, mostek, eth (+ vlan + obligacja) pod mostem i oczywiście port przełącznika. Testowałem to zaledwie kilka minut temu i działa idealnie na RHEL z kvm
dyasny
Racja i myślę, że wyraźnie pokazałem w pytaniu wartość wszystkich części stosu. Czy widzisz jakieś brakujące informacje lub coś, co nie zostało poprawnie skonfigurowane?
larsks