8

通用接收卸载(GRO) 是 Linux 中的一种软件技术,用于聚合属于同一流的多个传入数据包。链接的文章声称 CPU 利用率降低了,因为不是每个数据包单独遍历网络堆栈,而是单个聚合数据包遍历网络堆栈。

然而,如果你看一下 GRO 的源代码,感觉它本身就像一个网络堆栈。例如,传入的 TCP/IPv4 数据包需要经过:

每个函数执行解封装并查看相应的帧/网络/传输标头,正如“常规”网络堆栈所期望的那样。

假设机器不执行防火墙/NAT 或其他明显昂贵的每个数据包处理,那么“常规”网络堆栈中的“GRO 网络堆栈”可以加速的速度如此之慢?

4

1 回答 1

15

简短回答:GRO 在接收流程中很早就完成了,因此它基本上将操作数量减少了 ~(GRO 会话大小/MTU)。

更多细节:最常见的 GRO 函数是napi_gro_receive()。几乎所有网络驱动程序都使用了 93 次(在内核 4.14 中)。通过在 NAPI 级别使用 GRO,驱动程序很早就在接收完成处理程序处对大型 SKB 进行聚合。这意味着接收堆栈中的所有下一个函数执行的处理要少得多。

这是 Mellanox ConnectX-4Lx NIC 的 RX 流的一个很好的可视化表示(抱歉,这是我可以访问的): 在此处输入图像描述

如您所见,GRO 聚合位于调用堆栈的最底部。您还可以查看之后完成了多少工作。想象一下,如果这些功能中的每一个都在单个 MTU 上运行,您将拥有多少开销。

希望这可以帮助。

于 2017-11-21T21:39:29.140 回答