web-dev-qa-db-ja.com

KVMゲストとホストの間のジャンボフレーム?

KVMゲストとホストシステムの間のストレージ通信に9000バイトのMTUを実装しようとしています。ホストにはブリッジ(br1)9000バイトの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

ゲストには、このブリッジに接続されたインターフェースがあり、9000バイトの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

ホストからゲストにpingできます。

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

しかし、pingパケットのサイズを1490バイトを超えて増やすと、接続できなくなります。

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

パケットトレースは、これらのパケットがゲストに到達しないことを示しています。私が読んだすべては、Linuxブリッジインターフェイスとvirtioネットワークの両方がすべてジャンボフレームをサポートしていることを示していますが、これは確かにMTUの問題のように見えます。

私は本当に明らかなものを見逃していますか?

更新

ゲストインターフェースのホスト側を表示します。

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
11
larsks

これはMTUの問題でしたが、コンポーネントデバイスのMTU設定とは何の関係もないことがわかりました。元の質問で示したように、ホストブリッジ、ホストチューニングインターフェース、ゲストインターフェースはすべて同じMTU設定(9000バイト)でした。

実際の問題は、libvirt/kvm構成の問題でした。デフォルトでは、libvirtはnotvirtioデバイスを使用します。 RealTek RTL-8139 NICになる明示的な構成がない場合。この仮想NICは、ジャンボフレームをサポートしていません。

virtioデバイスを使用するには、明示的なモデルを指定する必要があります。 virt-installを使用する場合:

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

または事後、ドメインXMLの適切な<model>要素に<interface>タグを追加します。

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

この変更により、すべてが意図したとおりに機能します。

7
larsks

より大きなMTUが機能するためには、ゲスト、tapdev、およびブリッジが接続されている物理NICを含むスタック全体がより高いMTUである必要があります(途中に結合とVLANがある場合-それらも)

0
dyasny