这是网络性能问题。在我的板上有一个Gbit以太网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
答案 0 :(得分:0)
您所看到的(TX 1500和RX 65K)最可能是由于TCP LRO和LSO-大接收卸载和大发送卸载。此功能不是让OS分段或重组数据包,而是传递给NIC以减少CPU的负担并提高整体性能。
您可以使用ethtool来验证是否已设置,或启用/禁用卸载功能。
答案 1 :(得分:0)
通过使用ethtool -k eth0,发现tx-tcp-segmentation已关闭(固定)。 要启用它,需要在mac驱动程序中打开NETIF_F_TSO。 但不幸的是,启用此功能后,我的驱动程序崩溃了。这是另一个问题。 谢谢Jeff S