代码之家  ›  专栏  ›  技术社区  ›  user1202136

为什么GRO更高效?

  •  9
  • user1202136  · 技术社区  · 7 年前

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

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

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

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

    1 回复  |  直到 7 年前
        1
  •  16
  •   Tgilgul    7 年前

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

    更多细节 : 最常见的GRO函数是 napi_gro_receive()

    这是Mellanox ConnectX-4Lx NIC接收流的一个很好的视觉表示(抱歉,这是我可以访问的): enter image description here

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

    希望这有帮助。

    推荐文章