【问题标题】:How to let kernel send out a ethernet frame large than 1514?如何让内核发出大于 1514 的以太网帧?
【发布时间】:2018-10-29 16:39:22
【问题描述】:

这是一个网络性能问题。在我的板上有一个千兆以太网 phy,当我使用 iperf 测试网络带宽时,Tx 速度比 Rx 速度差得多。对比Wireshark抓包后发现,板子总是发出1514字节的以太网帧,而接收更大的以太网帧,最大可达64k。

这就是 Tx 性能比 Rx 性能差的原因。 iperf 每次发送 128k 的数据,在内核中它总是将其分段为 1514 字节并发送到网络驱动程序。

我在发送数据时跟踪了sku-len,记录如下。我猜内核中有一些功能可以发送大型以太网帧,但它是什么?

我尝试通过ifconfig eth0 mtu 8000命令将mtu更改为8000,但没有任何改善。

[  128.449334] TCP: Gang tcp_sendmsg 1176 msg->msg_iter.count=31216,size_goal=65160,copy=11640,max=65160
[  128.449377] TCP: Gang tcp_transmit_skb skb->len=46336
[  128.449406] Gang ip_output skb-len=46388
[  128.449416] Gang ip_finish_output2 skb->len=46388
[  128.449422] Gang sch_direct_xmit skb->len=46402
[  128.449499] Gang dev_hard_start_xmit skb->len=1514
[  128.449503] Gang dwmac_xmit skb->len=1514
[  128.449522] Gang dev_hard_start_xmit skb->len=1514  <>
[  128.449528] Gang dwmac_xmit skb->len=1514

【问题讨论】:

    标签: linux-kernel


    【解决方案1】:

    您所看到的(TX 1500 和 RX 65K)很可能是由于 TCP LRO 和 LSO - 大接收卸载和大发送卸载。该功能无需操作系统分段或重新组装数据包,而是传递给 NIC 以减少 CPU 的负载并提高整体性能。

    您可以使用 ethtool 来验证是否已设置,或者启用/禁用卸载功能。

    【讨论】:

      【解决方案2】:

      通过使用 ethtool -k eth0,发现 tx-tcp-segmentation 已关闭(已修复)。 要启用它,需要在 mac 驱动程序中打开 NETIF_F_TSO。 但不幸的是,我的驱动程序在启用此功能后崩溃。这是另一个问题。 谢谢杰夫S

      【讨论】:

        猜你喜欢
        • 2013-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 2014-07-27
        • 2010-12-24
        相关资源
        最近更新 更多