前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >怎么提高网络应用性能?让DPDK GRO和GSO来帮你!

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

作者头像
Linux阅码场
发布于 2020-07-22 03:49:57
发布于 2020-07-22 03:49:57
3.3K0
举报
文章被收录于专栏:LINUX阅码场LINUX阅码场

背景

目前,有大量的网络应用在处理数据包的时候只需要处理数据包头,而不会操作数据负载部分,例如防火墙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。

作者简介

胡嘉瑜,毕业于中国科学技术大学,现为英特尔软件工程师,主要从事DPDK中GRO、GSO和虚拟化方向的研发。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux阅码场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图解网络Offload
网络应用程序如果要发送很大的数据包,经过内核协议栈的时,大包会被分片成多个不超过MTU长度的包。这个分片比较费CPU资源。Offload技术可以把这些分片和合并的工作进行优化处理,也可以直接Offload到网卡上。
虚拟化云计算
2021/03/25
4K0
网卡卸载(Nic Offload)-硬件卸载-DPU-智能网卡
为了降低CPU利用率, 将更多的CPU释放给业务使用, 大多数现代操作系统都支持某种形式的网络卸载,其中一些网络处理发生在网卡 NIC 而不是 CPU 上, 它可以释放系统其余部分的资源, 这样操作系统就能处理更多连接, 提高整体性能.
晓兵
2024/01/28
1.3K0
网卡卸载(Nic Offload)-硬件卸载-DPU-智能网卡
【重识云原生】第四章云网络4.9.2节——传统网络卸载技术
        大部分服务器都需要配置多个网络适配器端口以满足网络连通性。现在有越来越多的卸载技术,帮助CPU分担网络管理工作。
江中散人_Jun
2022/07/12
2.1K0
【重识云原生】第四章云网络4.9.2节——传统网络卸载技术
自动驾驶网络优化
在自动驾驶中,需要大量的sensor信息上传到服务器进行训练。即使在车辆的行驶过程中也需要相关的sensor信息进行融合,感知。而sensor的信息可能来自不同的域,这样就需要高速稳定的网络来提供基础服务。对RX 和TX 提供了下面技术,
用户9732312
2022/05/13
1.1K0
自动驾驶网络优化
Mysql报文理解mtu拆包依据(tso/gro)
测试过程:client上发1000字节的SQL到server,client上发超过1500字节的SQL到server
mingjie
2022/05/12
8270
Mysql报文理解mtu拆包依据(tso/gro)
jvm可达性分析算法_对点网络
IP层叫分片,TCP/UDP层叫分段。网卡能做的事(TCP/UDP组包校验和分段,IP添加包头校验与分片)尽量往网卡做,网卡不能做的也尽量迟后分片(发送)或提前合并片(接收)来减少在网络栈中传输和处理的包数目,从而减少数据传输和上下文切换所需要的CPU计算时间。
全栈程序员站长
2022/11/15
1.9K0
jvm可达性分析算法_对点网络
Linux网络性能优化相关策略
1. rx-checksumming:校验接收报文的checksum。
glinuxer
2020/02/10
6.5K0
Linux网络性能优化相关策略
解决wireshark抓包校验和和分片显示异常
在使用wireshark抓取报文时,发现从10.81.2.92发过来的报文绝大部分标记为异常报文(开启IPv4和TCP checksum)
charlieroro
2020/03/24
2.4K0
解决wireshark抓包校验和和分片显示异常
【重识云原生】第四章云网络4.9.1节——网络卸载加速技术综述
网络offload主要是指将原本在内核网络协议栈中进行的IP分片、TCP分段、重组、checksum校验等操作,转移到网卡硬件中进行,CPU的发包路径更短,消耗更低,提高处理性能。
江中散人_Jun
2022/07/12
3.3K0
【重识云原生】第四章云网络4.9.1节——网络卸载加速技术综述
如何优化DPU上存储协议(NVMe Over TCP)卸载的性能?
NVMe-TCP 是一种基于 TCP 的高性能流水线存储协议,它抽象了对存储控制器的远程访问,为主机提供了本地存储的幻觉。在 NVMe-TCP 中,每个存储队列都映射到一个 TCP 套接字。读写 IO 操作都有一个唯一标识符,称为命令标识符 (CID),服务器可以无序处理 CID,以允许小 IO 绕过大 IO 并提高性能。此外,每个 PDU 都受发送方生成并在接收方验证的应用层 CRC 保护。
晓兵
2024/11/23
4350
如何优化DPU上存储协议(NVMe Over TCP)卸载的性能?
CVE-2017-1000112-UFO 学习总结
今天看到有人发了CVE-2017-1000112-UFO的分析,就把之前的学习报告整理一下,做个对比学习。 别人的分析报告: https://securingtomorrow.mcafee.com/mcafee-labs/linux-kernel-vulnerability-can-lead-to-privilege-escalation-analyzing-cve-2017-1000112/
De4dCr0w
2019/02/27
2.4K1
​DPDK 高效原因初探
Linux处理Packets主逻辑 系统接受数据包的过程 当网卡收到第一个包时候,通过DMA把这个包发送给接受队列(rx) 系统通过中断的方式通知新数据包的到来,同时也需要把数据包传递给内核的buffer(每个包一个buffer,sk_buff struct).一个数据包到来会触发多次的中断,内核处理完毕后,数据包再次传输到用户态空间 瓶颈分析 内核在处理很多包的时候,会消耗非常多的资源,同时也会触发很多次中断,这会严重影响系统处理数据包的性能 内核的sk_buff的设计是为了内核协议栈兼容多个协议。因此所
用户4700054
2022/08/17
1.7K0
​DPDK 高效原因初探
learning:vpp hash Infrastructure
现代物理网卡为了提高网络并行处理性能,使用Packet Flow Hash 用于不同的目的,比如RSS(Receive Side Scaling)、RPS(Receive Packet Steering)、RFS(Receive Flow Steering)、ARFS(Accelerated Receive Flow Steering)以及接口bonding等等。网卡也可以提供包流哈希值作为元数据,它可以被应用程序使用,而不需要重新计算包流哈希值。
dpdk-vpp源码解读
2023/09/05
4060
learning:vpp hash Infrastructure
DPDK 网卡收包流程
NIC 在接收到数据包之后,首先需要将数据同步到内核中,这中间的桥梁是 rx ring buffer。它是由 NIC 和驱动程序共享的一片区域,事实上,rx ring buffer 存储的并不是实际的 packet 数据,而是一个描述符,这个描述符指向了它真正的存储地址,具体流程如下:
dpdk-vpp源码解读
2023/03/07
3.7K0
DPDK 网卡收包流程
记一次线上DPDK-LVS的故障排查
http://doc.dpdk.org/guides/prog_guide/mbuf_lib.html
迅达集团
2019/03/08
1.8K0
支撑 100Gbit/s K8s 集群的未来网络数据平面
BIG TCP 并不是一个适应于大部分场景的通用方案,而是针对数据密集型应用的优化,在这些场景下能显著提升网络性能。
用户5166556
2023/03/18
8490
支撑 100Gbit/s K8s 集群的未来网络数据平面
Linux用户态协议栈与DPDK构建高性能应用
这里使用了已经搭建好的dpdk环境,dpdk的搭建过程网上有很多教程可以参考,后面有空再做一篇dpdk环境搭建文章吧! (1)检查网卡状态
Lion 莱恩呀
2024/09/15
4350
Linux用户态协议栈与DPDK构建高性能应用
K8s容器网络防火墙状态异常导致丢包排查记录
腾讯内部某业务在容器场景上遇到了一个比较诡异的网络问题,在容器内使用GIT,SVN工具从内部代码仓库拉取代码偶发性卡顿失败,而在容器所在的Node节点使用同样版本的GIT,SVN工具却没有问题。用诡异这个词,是因为这个问题的分析持续时间比较久,经历了多个同学之手,最后都没有揪出问题根源。有挑战的问题排查对于本人来说是相当有吸引力的,于是在手头没有比较紧急任务的情况下,便开始了有趣的debug。
CNCF
2020/07/09
2.6K0
K8s容器网络防火墙状态异常导致丢包排查记录
容器网络防火墙状态异常导致丢包排查记录
作者杨玉玺,2011年至今一直从事底层网络研发,目前就职腾讯云 TKE 团队,专注 K8s 底层网络。先后就职于阿里云、金山云从事 VPC 虚拟化网络研发,对高性能网络优化,复杂网络问题排查有非常丰富的经验。 导语 K8s容器网络涉及诸多内核子系统,IPVS,Iptable,3层路由,2层转发,TCP/IP协议栈,这些复杂的内核子系统在特定场景下可能会遇到设计者最初也想不到的问题。 本文分享了iptable防火墙状态异常导致丢包的排查记录,这个排查过程非常曲折,最后使用了在现在的作者看来非常落伍的工具:sy
腾讯云原生
2022/04/14
1.5K0
容器网络防火墙状态异常导致丢包排查记录
F-Stack常用配置参数介绍
目前F-Stack的配置文件中包含有以下8个部分,下面将分别进行简单的介绍: [dpdk]、[pcap]、[portN]、[vdevN]、[bondN]、[kni]、[freebsd.boot]、[freebsd.sysctl] [DPDK] 设置运行DPDK的相关参数,如果是DPDK也有的参数,则含义和使用方法同DPDK参数。 lcore_mask 16进制位掩码,用于设置进程运行在哪些CPU核心上。如fc表示使用CPU第2-7个核,不使用第0和1核。 建议优先使用物理核,数据尽量不要跨NUMA节点交互,
F-Stack
2022/04/11
5.1K2
相关推荐
图解网络Offload
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档