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

    文章

    11216

    浏览量

    222912
  • 网卡
    +关注

    关注

    4

    文章

    334

    浏览量

    28714
  • 交换机
    +关注

    关注

    23

    文章

    2868

    浏览量

    103913

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    内存与数据处理优化艺术

    事务数量,更好地利用CPU缓存。测试表明,在处理大量数据(如20MB)时,这种优化可能带来数倍的性能提升。
    发表于 11-14 07:46

    SNN加速器内部神经元数据连接方式

    神经元之间的信息传递。 在脉冲神经网络中,每个神经元都有其自身的地址,用于在AER协议中进行通信。如图,时间从右往左依次增加,当某一个神经元产生一个脉冲时,这个脉冲信息将会被编码成AER脉冲数据包,一般
    发表于 10-24 07:34

    串口DMA接收数据包丢失怎么解决?

    RTT串口DMA接收数据,超过缓冲区后为什么会吞掉一个数据包呢,不能每次处理完后清除缓冲区数据吗,感觉接收的数据是累计的,累计满之后会重新覆
    发表于 09-29 07:50

    有哪些具体的方法可以减少电能质量监测装置的数据偏差?

    )针对性施策。具体方法如下: 一、优化硬件选型与设计,从源头降低固有偏差 硬件是数据测量的基础,其性能直接决定偏差上限,需重点关注以下几点: 高精度核心元器件选型 传感器:选用宽频带、低非线性的电压 / 电流传感器(如霍尔传感器
    的头像 发表于 08-21 09:33 477次阅读
    有哪些具体的<b class='flag-5'>方法</b>可以<b class='flag-5'>减少</b>电能质量监测装置的<b class='flag-5'>数据</b>偏差?

    请问DCTCP与DCUDP 的登录数据包和心跳数据包与服务器端是如何交互的?

    DCTCP与DCUDP 的登录数据包和心跳数据包与服务器端是如何交互的?
    发表于 08-06 06:29

    RDMA简介7之可靠传输

    可靠传输技术旨在通过多种方法确保数据包在传输过程中不会丢失或损坏,同时保证数据包按发送顺序到达接收端,其要求在链路发生丢或网络发生拥塞等情况下能够完全保证
    发表于 06-13 10:01

    蓝牙数据通道空口数据包

    channel packet的一种。在不引起上下文歧义的时候,我们把他们统一称作“数据包”。 ​ 编辑 LL Control PDU是在Link layer层直接进行交互的,也就是说他们不会
    发表于 06-03 10:51

    FX3 GPIF CyU3PGpifWriteDataWords的传输时间延迟的原因?

    之间存在明显的延迟(7~9us)。 我有几个问题: 1.如何才能减少数据包之间的时间? 我希望它们能够持续下去。 2.CyU3PGpifWriteDataWords 是否仅适用于寄存器使用? 有没有我
    发表于 05-15 06:18

    如何减少步进电机的发热?

    步进电机的发热问题是一个需要关注的重要方面,发热不仅影响电机的效率,还可能对电机的寿命和性能产生负面影响。为了减少步进电机的发热,可以从以下几个方面着手。 1. 选择合适的电机: ● 在选型时,尽量
    的头像 发表于 05-11 17:51 745次阅读

    如何减少电磁干扰对智能电位采集仪的影响

    减少外界电磁干扰对智能电位采集仪的影响,可从屏蔽技术、滤波措施、接地处理等方面着手,具体方法如下: 屏蔽技术 使用屏蔽线:连接智能电位采集仪与参比电极、被测量物体的导线应选用屏蔽线。屏蔽线的外层金属
    的头像 发表于 05-10 11:31 431次阅读
    如何<b class='flag-5'>减少</b>电磁干扰对智能电位采集仪的影响

    为UART、MCXA142实现ISP通信的主机端,发送Ping数据包并收到预期的响应,发送和接收数据包的典型顺序是什么?

    我想为 UART、MCXA142 实现 ISP 通信的主机端。我发送 Ping 数据包并收到预期的响应。发送和接收数据包的典型顺序是什么? 此刻,我的照片是这样的: 1. 发送 Ping 2. 接收 Ping 响应 3. 在成帧
    发表于 04-03 08:05

    I2C总线数据包结构详解

    。以下是I2C总线数据包结构的详解: 一、I2C总线数据包的基本组成 I2C总线上的数据传输以数据包为单位进行,每个数据包包含起始信号、设备
    的头像 发表于 01-17 15:46 1387次阅读

    使用tlk2711发现每次接受的数据包头对,但内容错误,为什么?

    我在使用tlk2711的时候。发现每次接受的数据包头对,但内容错误,后来发现PCB板上芯片底部中心的焊盘是悬空的,没有接地,请问这会影响工作吗?
    发表于 01-10 07:43

    CAN通信节点多时,如何减少寄生电容和保障节点数量

    导读在汽车电子与工业控制等领域,CAN通信至关重要。本文围绕CAN通信,阐述节点增多时如何减少寄生电容的策略,同时从发送、接收节点等方面,讲解保障节点数量及通信可靠性的方法。如何减少
    的头像 发表于 01-03 11:41 3529次阅读
    CAN通信节点多时,如何<b class='flag-5'>减少</b>寄生电容和保障节点<b class='flag-5'>数量</b>?

    mtu配置步骤详解 mtu与数据包丢失的关系

    最大的、无需拆即可通过的数据包长度。这个长度加上数据包头(通常为28字节)即为MTU值。 访问设备配置
    的头像 发表于 12-16 14:33 3749次阅读