【问题标题】:The QEMU-KVM guest OS does not respect MTU settingQEMU-KVM 客户操作系统不遵守 MTU 设置
【发布时间】:2016-02-05 09:38:49
【问题描述】:

我在 Ubuntu 主机上运行了 3 个 QEMU-KVM 虚拟机。每个虚拟机都有一个 virt-io 网卡,并通过主机操作系统中的 br0 网桥连接。每个 NIC 的 MTU 配置为 1500。该平台运行基于消息队列的应用程序:一台 VM 作为生产者,一台 VM 作为消息队列服务器,最后一个 VM 作为消费者。

我的问题是:当客户虚拟机变得忙碌时,消息队列服务器虚拟机可能会偶尔发送大小为 2k、4k 或 5k 的数据包。它超过了网卡的 MTU 值,1500!!!据我所知,Linux IP 堆栈应该在发送之前切割小于 MTU 大小的 IP 帧。为什么这个虚拟机在忙时会发送大数据包?

平台架构如下:

[w2: celery caller (message queue producer) ] 
     | (messages in TCP)
     V
[w3: rabbitmq server] 
     | (messages in TCP)
     V
[w4: celeryd (message queue consumer)]

下面是 w3 的屏幕截图,MTU 为 1500,发送大小 > 2000 的数据包

下面是 w4 的屏幕截图,MTU 为 1500,接收大小 > 2000 的数据包

【问题讨论】:

    标签: networking kernel virtualization kvm


    【解决方案1】:

    谢谢大家,我现在找到答案了。

    guest OS 中的 virtio-NIC 支持 TCP 分段卸载 (TSO),默认情况下已启用。 网卡的TSO特性是TCP层不做帧分段,分段是 通过网卡驱动或硬件离线执行。 TSO 用于在发送大数据包时提高性能并卸载 TCP 发送程序的工作, NIC 驱动程序将在此模式下接收大数据包并将其分割成较小的有效负载、IP 标头和 TCP 标头。这种卸载处理的好处是驱动程序可以很好地使用硬件或重用标头 skb 分割期间的缓冲区。

    下面是支持TSO功能的驱动代码,

    Atheros NIC driver source

    在其发送函数中,它调用 atl1c_tso_csum() 检查发送缓冲区的标志和 SKB_GSO_TCPV4。 如果缓冲区包含 SKB_GSO_TCPV4 标志,则对其进行分段,添加 ip 标头并添加 tcp 标头。

    但是,virtio NIC 支持 TSO 功能,因为 virtio NIC 数据包正在发送到主机操作系统。它的驱动程序的 tx 功能只是发送出去 整包,实现更高的网络带宽。

    注意:在guest VM中关闭TSO标志后,tcpdump上看不到大数据包。这是命令:

    $ethtool -k eth0
    Offload parameters for eth0:
    rx-checksumming: on
    tx-checksumming: on
    scatter-gather: on
    tcp-segmentation-offload: off
    udp-fragmentation-offload: on
    generic-segmentation-offload: on
    generic-receive-offload: on
    large-receive-offload: off
    rx-vlan-offload: off
    tx-vlan-offload: off
    ntuple-filters: off
    receive-hashing: off
    $ethtool -K eth0 tso off
    $
    

    参考 2: https://blogs.gnome.org/markmc/category/virtio/

    【讨论】:

    猜你喜欢
    • 2020-06-26
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2019-12-15
    相关资源
    最近更新 更多