为什么GRO更有效率?

use*_*136 3 networking offloading linux-kernel

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

但是,如果您查看GRO的源代码,那感觉就像是一个网络堆栈。例如,传入的TCP / IPv4数据包需要经过:

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

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

Tgi*_*gul 6

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

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

这是Mellanox ConnectX-4Lx NIC的RX流的直观展示(很抱歉,这是我可以访问的): 在此处输入图片说明

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

希望这可以帮助。