GRO(通用接收卸载)如何在更高级的NIC上工作?

我对特定的答案感兴趣:

  1. 具有GRO的NIC是否编辑/创buildTCP ACK或任何其他数据包(或者此function对接收器/发送器TCP堆栈是否透明)?
  2. 网卡应该将“粘贴段”传递给TCP堆栈时应该有一个超时/事件? 他们是什么?
  3. 在数据包转发设置中,GROfunction是否也尝试读取接收器的ACK(请参阅下面为什么我问这个问题)?
  4. 任何解释GRO和其他网卡卸载function(TSO,LSO …)的源码都会比维基百科和Linux手册页更好。

更多细节:

我正在解决一个IPSec实现的性能问题。 问题是可用带宽不是均匀分布在所有4个VPN隧道(大约分布为200MBps / 200MBps / 1MBps / 1MBps;每个VPN隧道封装单个TCP连接)。 在PCAP偶尔我看到,Web服务器闲置了约2秒(等待ACK)。 当Web服务器重新传送未确认的段时,将继续下载。

我从PCAP内部感觉到,NIC GROfunction将数据包粘合在一起,但有时并不及时将它们传递给TCP堆栈,导致问题。

由于此VPN服务器没有终止TCP连接的接口,而只是转发数据包。 然后我试图禁用GRO,之后我发现stream量均匀分布在所有的隧道中。 另外,当在Web服务器上禁用TCP窗口缩放时,即使启用GRO,带宽也是均匀分布的(这就是为什么我有问题#3)。

我在Ubuntu 10.04服务器上使用2.6.32-27 linux(64位)。 网卡是Intel 82571EB。 所有的接口(HTTP客户端,VPN客户端,VPN服务器,Web服务器)都通过1Gbit以太网电缆直接连接在一起。

我发现这篇文章非常有用: JLS2009:通用接收卸载 。 它给出了GRO如何工作的一个很好的概述。

  1. 一些适配器可能会这样做,但相关的驱动程序也必须注意它。 而且,驱动程序本身也可以通过软件来完成。 在进入内核TCP / IP堆栈之前,当内核空间TCP / IP堆栈完全进入时,数据包被重新sorting。
  2. 超时由GRO规范定义为一个TCP / IP“时间戳”(时间戳字段的增量),这是一个非常小的数字,但是在快速networking上仍然可以接收多个数据包。
  3. GRO将在货运公司的接收方发挥作用,事实上,GRO就是这样创build的,所以更加贪婪的LRO方法将停止在货运代理上封装数据包。
  4. 我链接到上面的文章确实有帮助。

Ethtool 可以在特定的接口上启用/禁用GRO。 取决于版本。