Generic Receive Offload(GRO)是Linux中的一种软件技术,用于聚合属于同一流的多个传入数据包。链接的文章声称CPU利用率降低了,因为单个聚合数据包不是单独遍历网络堆栈,而是遍历网络堆栈。
但是,如果看一下GRO的源代码,这本身就像一个网络堆栈。例如,传入的TCP / IPv4数据包需要通过:
每个函数执行解封装并查看相应的帧/网络/传输头,正如预期的那样#"常规"网络堆栈。
假设机器没有执行防火墙/ NAT或其他明显昂贵的每包处理,那么#"常规"网络堆栈," GRO网络堆栈"可以加速吗?
答案 0 :(得分:6)
简答:GRO在接收流程中很早就完成了,所以它基本上减少了操作次数〜(GRO会话大小/ MTU)。
更多详情: 最常见的GRO函数是napi_gro_receive()。几乎所有的网络驱动程序都使用了93次(在内核4.14中)。通过在NAPI级别使用GRO,驱动程序很快就会在接收完成处理程序中对大型SKB进行聚合。这意味着接收堆栈中的所有下一个函数处理的次数要少得多。
这是Mellanox ConnectX-4Lx网卡的RX流程的一个很好的直观表示(对不起,这是我有权访问的):
如您所见,GRO聚合位于调用堆栈的最底部。您还可以看到之后完成了多少工作。想象一下,如果每个功能在单个MTU上运行,您将获得多少开销。
希望这会有所帮助。