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

use*_*238 16 nic linux-networking

我对特定的答案感兴趣:

  1. 具有 GRO 的 NIC 是否编辑/创建 TCP ACK 或任何其他数据包(或者此功能对接收器/发送器 TCP 堆栈透明)?
  2. 当 NIC 应该将“粘合段”传递给 TCP 堆栈时,应该有超时/事件吗?这些是什么?
  3. 在数据包转发设置中 - GRO 功能是否也尝试读取接收器 ACK(请参阅下文,为什么我会问这个)?
  4. 任何能比维基百科和 linux 手册页更好地解释 GRO 和其他 NIC 卸载功能(TSO、LSO ...)的来源都将不胜感激。

更多细节:

我正在对一个 IPSec 实现的性能问题进行故障排除。问题是可用带宽并没有在所有 4 个 VPN 隧道中均匀分布(大约分布为 200MBps/200MBps/1MBps/1MBps;每个 VPN 隧道封装单个 TCP 连接)。在 PCAP 中,我偶尔会看到网络服务器空闲大约 2 秒(等待 ACK)。当网络服务器重新传输未确认的段时,下载恢复。

我对 PCAP 的看法是 NIC GRO 功能将数据包粘合在一起,但有时不会将它们及时传递到 TCP 堆栈,这导致了问题。

由于此 VPN 服务器没有终止 TCP 连接而仅转发数据包的接口。然后我尝试禁用 GRO,之后我观察到流量在所有隧道中均匀分布。此外,当在 Web 服务器上禁用 TCP 窗口缩放时,即使启用了 GRO,带宽也会被分配(这就是我遇到问题 #3 的原因)。

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

sys*_*138 18

我发现这篇文章非常有用:JLS2009:通用接收卸载。它很好地概述了 GRO 的工作原理。

  1. 一些适配器可能会这样做,但相关的驱动程序也必须意识到这一点。此外,驱动程序本身可以在软件中执行此操作。由于这发生在进入内核 TCP/IP 堆栈之前,当内核空间 TCP/IP 堆栈完全进入时,数据包已重新排序。
  2. GRO 规范将超时定义为一个 TCP/IP 'tick'(时间戳字段的增量),这是一个非常小的数字,但在快速网络上仍可能收到多个数据包。
  3. GRO 将在转发器的接收端发挥作用,实际上 GRO 的创建是为了让更贪婪的 LRO 方法不会在转发器上搞砸数据包。
  4. 我上面链接的那篇文章真的很有帮助。

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