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
    +关注

    关注

    69

    文章

    11516

    浏览量

    229565
  • 网卡
    +关注

    关注

    4

    文章

    359

    浏览量

    29768
  • 交换机
    +关注

    关注

    23

    文章

    3010

    浏览量

    106332

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    虹科干货| 3分钟搞懂!工业以太网多节点通信,如何减少报文开销

    “在多节点、短周期的工业通信中,每台设备实际要传的过程数据可能只有几个字节,而每个以太网帧还带着帧头、校验和帧间隔等固定开销。设备越多、周期越短,若仍为每台设备单独发一个帧,大量带宽就会被重复的协议
    的头像 发表于 08-05 17:23 637次阅读
    虹科干货| 3分钟搞懂!工业以太网多节点通信,如何<b class='flag-5'>减少</b>报文<b class='flag-5'>开销</b>?

    RDMA设计65:如何根据吞吐量性能权衡设计?

    吞吐量是评估零散数据传输性能的核心指标,吞吐量越高,表明系统面临大量零散传输请求时拥有更强的数据传输能力和更高的
    发表于 05-12 10:36

    RDMA设计64:数据吞吐量性能测试分析

    数据传输能力和更高的速率。由于数据吞吐量受队列数量及队列深度影响较小,故这里使用单队列对不同长度的数据包 进行数据吞吐量测试。在进行
    发表于 05-09 07:54

    MIMXRT1189奇数长度UDP数据包的最后一个字节出现问题,为什么?如何解决?

    我遇到了一个问题,即奇数长度 UDP 数据包的最后一个字节无法通过线路正确发送。最后一个字节似乎是未初始化或过时的数据。如果我将 UDP 数据包填充到偶数长度(2 字节绑定),则数据
    发表于 04-17 07:47

    华秋PCB新增「少数处理方式」设置选项说明

    告别繁琐沟通!华秋PCB「少数处理方式」功能上线,坏板补料由您“掌”控。在日常的PCB生产中,即使工艺再精湛,极少数量的不良品也在所难免。在过去,生产过程中若出现少数坏板,我们的流程是
    的头像 发表于 04-08 11:20 413次阅读
    华秋PCB新增「<b class='flag-5'>少数</b><b class='flag-5'>处理</b>方式」设置选项说明

    RDMA设计56:如何设计基于RDMA的应用程序

    工作流程图 在接收到 FPGA 数据包后,应用程序进行数据包类型判断,针对 SEND 数据包和 WRITE 数据包将分别进入对应的处理流程。
    发表于 04-05 09:54

    减少变频器谐波对其它设备影响的方法

    变频器作为现代工业中广泛应用的电力电子设备,其产生的谐波问题已成为影响电能质量和设备安全运行的重要挑战。谐波会导致电网电压畸变、设备过热、继电保护误动作等一系列问题,如何有效抑制变频器谐波对其它设备的影响,是工业领域亟待解决的技术难题。以下将阐述减少变频器谐波干扰的实用方法
    的头像 发表于 03-12 16:56 816次阅读

    U-Boot 引导加载程序中 TFTP 超时的奇怪解决方法

    服务器以降低数据包的发送速度。(这让事情变得更糟) (2) 接下来,我们减少了服务器中的 TFTP 超时持续时间。(不行) (3) 但是当我们发送每个 TFTP 数据包两次时,问题就会神秘消失! (4
    发表于 02-24 07:01

    技术资讯 I 容性耦合噪声抑制方法如何减少串扰

    。常用的容性耦合噪声抑制方法是采用屏蔽装置,例如法拉第笼,可有效减少耦合干扰。#电路中的模拟信号有时与数字信号会发生混合。多数情况下,这种混合源于噪声耦合——无论是
    的头像 发表于 01-23 20:07 564次阅读
    技术资讯 I 容性耦合噪声抑制<b class='flag-5'>方法</b>如何<b class='flag-5'>减少</b>串扰

    CW32R030可以兼容BLE及XN297L数据包,请问这个XN297L数据包是什么?

    CW32R030可以兼容BLE及XN297L数据包,请问这个XN297L数据包是什么?
    发表于 01-20 06:37

    bk3633 usb 设备如何读取主机向端点0 发送数据包

    bk3633 usb 设备如何读取主机向端点0 发送数据包
    发表于 12-30 13:03

    如何设置横河示波器减少“误触发”的发生?

    深圳市科瑞杰科技有限公司-可以通过一系列的设置去避免或者减少示波器“误触发”的发生,开启触发源模拟滤波、提高实时采样率、设置更精确的触发条件、利用运算通道、使用高配机型DLM3000或DLM5000,可以有效减少误触发和抖动的发生。
    的头像 发表于 12-23 20:30 575次阅读
    如何设置横河示波器<b class='flag-5'>减少</b>“误触发”的发生?

    内存与数据处理优化艺术

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

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

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

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

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