0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

减少包头处理开销最直接的方法:减少数据包数量

Linux阅码场 来源:Linuxer 2020-08-03 16:20 次阅读

背景

目前,有大量的网络应用在处理数据包的时候只需要处理数据包头,而不会操作数据负载部分,例如防火墙、TCP/IP协议栈和软件交换机。对这类网络应用而言, 包头处理产生的开销(称为“per-packet overhead”)占了整体开销的大部分。因此,如何减少包头处理开销是优化这类应用性能的关键。

减少包头处理开销最直接的方法:减少数据包数量

如何减少包数量?

增大Maximum Transmission Unit (MTU)。在数据量一定的情况下,使用大MTU的数据包可携带更多数据,从而减少了包的总量。但MTU值依赖于物理链路,我们无法保证数据包经过的所有链路均使用大MTU。

利用网卡特性:Large Receive Offload (LRO),UDP Fragmentation Offload (UFO)和TCP Segmentation Offload (TSO)。如图1所示,LRO将从物理链路收到的TCP包(如1500B)合并为长度更长的TCP包(如64KB);UFO和TSO将上层应用发送的长数据负载的UDP和TCP包(如64KB)拆分成长度更短的数据包(如1500B),以满足物理链路的MTU限制。通过在网卡上进行包合并和拆分,在不需要任何CPU开销的情况下,上层应用就可以处理数量大大减少的大包。然而,LRO、TSO和UFO通常只能处理TCP和UDP包,而且并非所有的网卡都支持这些特性。

软件包合并 (Generic Receive Offload,GRO)和包拆分 (Generic Segmentation Offload,GSO)。与前两种方法相比,GRO和GSO有两个优点:第一,不依赖于物理链路和网卡;第二,能够支持更多的协议类型,如VxLAN和GRE。

图1. LRO、UFO和TSO工作原理

为了帮助基于DPDK的应用程序(如Open vSwitch)减少包头处理开销,DPDK分别于17.08和17.11支持了GRO和GSO。如图2所示, GRO和GSO是DPDK中的两个用户库,应用程序直接调用它们进行包合并和分片。

图2. DPDK GRO和DPDK GSO

1

GRO库和GSO库结构

图3描绘了GRO库和GSO库的结构。根据数据包类型,GRO库定义了不同的GRO类型。每一种GRO类型负责合并一种类型的数据包,如TCP/IPv4 GRO处理TCP/IPv4数据包。同样的,GSO库也定义了不同的GSO类型。GRO库和GSO库分别根据MBUF的packet_type域和ol_flags域将输入的数据包交给对应的GRO和GSO类型处理。

图3. GRO库和GSO库的框架

2

如何使用GRO库和GSO库?

使用GRO和GSO库十分简单。如图4所示,只需要调用一个函数便可以对包进行合并和分片。

图4. 代码示例

为了支持不同的用户场景,GRO库提供了两组API:轻量模式API和重量模式API,如图5所示。轻量模式API应用于需要快速合并少量数据包的场景,而重量模式API则用于需要细粒度地控制合包并需要合并大量数据包的场景。

图5. 轻量模式API和重量模式API

3

DPDK GRO的合包算法

算法挑战

在高速的网络环境下,高开销的合包算法很可能会导致网卡丢包。

包乱序(“Packet Reordering”)增加了合包难度。例如Linux GRO无法合并乱序的数据包。

这就要求DPDK GRO的合包算法:

足够轻量以适应高速的网络环境

能够合并乱序包

基于Key的合包算法

为解决上述两点挑战,DPDK GRO采用基于Key的合包算法,其流程如图6所示。对新到的数据包,首先按照流(“flow”)对其进行分类,再在其所在的流中寻找相邻的数据包(“neighbor”)进行合并。若无法找到匹配的流,就插入一条新流并将数据包存储到新流中。若无法找到邻居,则将数据包存储到对应的流中。

基于Key的合包算法有两个特点。首先,通过流分类来加速数据包的合并是十分轻量的一种做法;其次,保存无法合并的数据包(如乱序包)使得之后对其进行合并成为可能,故减轻了包乱序对合包带来的影响。

图6. 基于Key的合包算法流程

例如,TCP/IPv4 GRO使用源和目的Ethernet地址、IP地址、TCP端口号以及TCP Acknowledge Number定义流,使用TCP Sequence Number和IP ID决定TCP/IPv4包是否为邻居。若两个TCP/IPv4的数据包能够合并,则它们必须属于同一个流,并且TCP序号和IP ID必须连续。

4

DPDK GSO的分片策略

分片流程

如图7所示,将一个数据包分片有3个步骤。首先,将包的数据负载分成许多长度更小的部分;其次,为每一个数据负载部分添加包头(新形成的数据包称为GSO Segment);最后,为每个GSO segment更新包头(如TCP Sequence Number)。

图7. GSO分片流程

GSO Segment的结构

生成一个GSO Segment的最简单方法就是拷贝包头和数据负载部分。但频繁的数据拷贝会降低GSO性能,因此,DPDK GSO采用了一种基于零拷贝的数据结构——Two-part MBUF——来组织GSO Segment。如图8所示,一个Two-part MBUF由一个Direct MBUF和多个Indirect MBUF组成。Direct MBUF用来存储包头,Indirect MBUF则类似于指针,指向数据负载部分。利用Two-part MBUF,生成一个GSO Segment仅需拷贝长度较短的包头,而不需要拷贝较长的数据负载部分。

图8. Two-part MBUF的结构

GRO库和GSO库的状态

目前,GRO库还处于一个初期阶段,仅对使用最广泛的TCP/IPv4数据包提供了合包支持。GSO库则支持更丰富的包类型,包括TCP/IPv4、VxLAN和GRE。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10417

    浏览量

    206476
  • 网卡
    +关注

    关注

    2

    文章

    284

    浏览量

    27083
  • 交换机
    +关注

    关注

    19

    文章

    2423

    浏览量

    95589

原文标题:怎么提高网络应用性能?让DPDK GRO和GSO来帮你!

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32H7接收数据包异常,一接收的数据出现两发送的内容怎么解决?

    节:be1c0101属于发送数据包1的; 剩余其他字节:属于发送数据包2的; 问题困扰很久了,请大家帮忙处理下,急急急!
    发表于 03-08 08:05

    DPDK在AI驱动的高效数据包处理应用

    传统的数据包处理方式是数据包先到内核最后再到用户层进行处理。这种方式会增加额外的延迟和CPU开销,严重影响
    的头像 发表于 02-25 11:28 396次阅读
    DPDK在AI驱动的高效<b class='flag-5'>数据包</b><b class='flag-5'>处理</b>应用

    减少串扰的方法有哪些

    一些方法尽量降低串扰的影响。那么减少串扰的方法有哪些呢? 检查靠近 I/O 网络的关键网络 检查与I/O线相关的关键网络的布线非常重要,因为这些线容易产生噪声,这些噪声可能会通过它们离开或进入电路板并与PCB连接,从而耦合到电路
    的头像 发表于 01-17 15:02 412次阅读
    <b class='flag-5'>减少</b>串扰的<b class='flag-5'>方法</b>有哪些

    减少静电产生和降低击穿风险的方法和材料

    减少静电产生和降低击穿风险的方法和材料 静电是一种普遍存在的现象,对人类和设备都可能产生一定程度的威胁。为了减少静电的产生,并降低由于静电引起的击穿风险,人们在不同领域积极进行研究和实践。本文将详细
    的头像 发表于 11-29 16:30 335次阅读

    为什么提高电路功率因素可以减少电损耗?

    随着科技的发展,电力供应和使用的效率越来越重要。提高电路功率因素是一种有效的方法,它可以减少电流损耗,提高能耗效率。那么,为什么提高电路功率因素对于减少电损耗有直接作用呢?
    的头像 发表于 09-04 16:26 1132次阅读

    接收CAN公共汽车上数据包的代码

    ”;“CANFD_CAN_Aut_Adjust”通过接收CAN公共汽车上的数据包,动态调整M253 CANFD的自动率,并采用协议错误探测和中断方法,直到正常收到CAN公共汽车上的数据并匹配CAN公共汽车的通信显示率。当
    发表于 08-29 06:24

    SPI协议优缺点 如何减少GPIO数量

    是使用SPI控制的开关。此方法的优点是可减少所需GPIO的数量,并且还能消除外加串行转并行转换器的开销。如图所示,不需要16个微控制器GPIO,只需要7个微控制器GPIO就可以向4个A
    的头像 发表于 07-21 10:17 615次阅读
    SPI协议优缺点 如何<b class='flag-5'>减少</b>GPIO<b class='flag-5'>数量</b>

    NUC505如果USB发送一个512Byte的数据包,发送不出去是为什么?

    ] = {0};其中的64应改为512,这是HOST向USB虚拟串口发送大与64字节数据包时发现的。 2. 如果USB发送一个512Byte 的数据包,是发送不出去的。 改正方法: 对于512Byte 的
    发表于 06-16 06:15

    P4080 udp数据包接收乱序是什么原因造成的?

    我们有一个基于 P4080DS 的定制板。我们已经使用 QorIQ Linux SDK 构建了镜像。在我们使用 iperf 测试以太网功能的过程中,我们观察到一些数据包被乱序接收。无序数据包数量随着带宽的增加而增加。
    发表于 06-06 08:31

    造成UDP数据包丢失的原因?

    芯片时遇到了使用 TCP 的延迟问题,所以我想“我将使用 UDP”。这个想法是我们在网络中,所以数据包丢失应该非常低,如果我在 X 时间内没有收到响应作为备份,我可以处理重新发送数据。 无论如何,我写了
    发表于 06-02 13:46

    如何“直接”从ESP8266发送和接收tcp/ip数据包“?

    /从我的 CPU 发送/接收 ascii。所以它基本上创建了 一个到 CPU 的远程终端接口。 相反,我需要的是让 CPU 能够直接指示 ESP8266 向 IP 地址发送数据包/从 IP 地址接收
    发表于 05-15 07:05

    请教一下用私有协议数据包进行OTA的具体的实现流程?

    YMODEM OTA和HTTP OTA我这里跑着都没有问题,升级数据接收和存储都是由组件自动实现的。我想问的是,如果是我的EC20接收的是加了私有协议的包头尾、并且是分包后的升级文件,数据处
    发表于 05-11 09:59

    UDP广播数据包并不总是发送的原因?怎么处理

    UDP 作为广播工作似乎是一个奇怪的问题: - 始终发送在特定 IP 上发送的 UDP 数据包。工作正常。 - 在广播 IP (xx.xx.xx.255) 上发送的相同 UDP 数据包是随机发送
    发表于 05-10 08:36

    如何在没有收到另一个udp数据包的情况下简单地发送一个udp数据包

    \",\'data\')它在n“接收”块 中完美运行,但我可以 找不到在没有收到另一个 udp 数据包的情况下简单地发送一个 udp 数据包方法,我知道我遗漏了一些东西,但我不知道是什么,有没有
    发表于 04-27 06:17