精华内容
下载资源
问答
  • dpdk原理
    2021-10-26 20:03:52

    1.简述

    数据平面开发套件(DPDK ,Data Plane Development Kit)是由6WIND,Intel等多家公司开发,主要基于Linux系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的工作效率。

    2.基于 OS 内核的数据传输有什么弊端?

    • 1、中断处理。当网络中大量数据包到来时,会产生频繁的硬件中断请求,这些硬件中断可以打断之前较低优先级的软中断或者系统调用的执行过程,如果这种打断频繁的话,将会产生较高的性能开销。
    • 2、内存拷贝。正常情况下,一个网络数据包从网卡到应用程序需要经过如下的过程:数据从网卡通过 DMA 等方式传到内核开辟的缓冲区,然后从内核空间拷贝到用户态空间,在 Linux 内核协议栈中,这个耗时操作甚至占到了数据包整个处理流程的 57.1%。
    • 3、上下文切换。频繁到达的硬件中断和软中断都可能随时抢占系统调用的运行,这会产生大量的上下文切换开销。另外,在基于多线程的服务器设计框架中,线程间的调度也会产生频繁的上下文切换开销,同样,锁竞争的耗能也是一个非常严重的问题。
    • 4、局部性失效。如今主流的处理器都是多个核心的,这意味着一个数据包的处理可能跨多个 CPU 核心,比如一个数据包可能中断在 cpu0,内核态处理在 cpu1,用户态处理在 cpu2,这样跨多个核心,容易造成 CPU 缓存失效,造成局部性失效。如果是 NUMA 架构,更会造成跨 NUMA 访问内存,性能受到很大影响。
    • 5、内存管理。传统服务器内存页为 4K,为了提高内存的访问速度,避免 cache miss,可以增加 cache 中映射表的条目,但这又会影响 CPU 的检索效率。

    综合以上问题,可以看出内核本身就是一个非常大的瓶颈所在。那很明显解决方案就是想办法绕过内核。

    3.解决方案探讨

    针对以上弊端,分别提出以下技术点进行探讨。

    • 1、控制层和数据层分离。将数据包处理、内存管理、处理器调度等任务转移到用户空间去完成,而内核仅仅负责部分控制指令的处理。这样就不存在上述所说的系统中断、上下文切换、系统调用、系统调度等等问题。
    • 2、使用多核编程技术代替多线程技术,并设置 CPU 的亲和性,将线程和 CPU 核进行一比一绑定,减少彼此之间调度切换。
    • 3、针对 NUMA 系统,尽量使 CPU 核使用所在 NUMA 节点的内存,避免跨内存访问。
    • 4、使用大页内存代替普通的内存,减少 cache-miss。
    • 5、采用无锁技术解决资源竞争问题。

    4.DPDK特点

    相对传统的基于内核的网络数据处理,dpdk 对从内核层到用户层的网络数据流程进行了重大突破,我们先看看传统的数据流程和 dpdk 中的网络流程有什么不同。传统 Linux 内核网络数据流程:

    硬件中断--->取包分发至内核线程--->软件中断--->内核线程在协议栈中处理包--->处理完通知用户层-->网络层--->逻辑层--->业务层
    

    dpdk 网络数据流程:

    硬件中断--->放弃中断流程---->用户层通过设备映射取包--->进入用户层协议栈--->逻辑层--->业务层
    

    4.1 UIO 技术

    dpdk 能够绕过内核协议栈,本质上是得益于 UIO 技术,通过 UIO 能够拦截中断,并重设中断回调行为,从而绕过内核协议栈后续的处理流程。UIO 设备的实现机制其实是对用户空间暴露文件接口,比如当注册一个 UIO 设备 uioX,就会出现文件 /dev/uioX,对该文件的读写就是对设备内存的读写。除此之外,对设备的控制还可以通过 /sys/class/uio 下的各个文件的读写来完成。
    在这里插入图片描述

    4.2 内存池技术

    dpdk 在用户空间实现了一套精巧的内存池技术,内核空间和用户空间的内存交互不进行拷贝,只做控制权转移。这样,当收发数据包时,就减少了内存拷贝的开销。

    4.3 大页内存管理

    dpdk 实现了一组大页内存分配、使用和释放的 API,上层应用可以很方便使用 API 申请使用大页内存,同时也兼容普通的内存申请。

    4.4 无锁环形队列

    dpdk 基于 Linux 内核的无锁环形缓冲 kfifo 实现了自己的一套无锁机制。支持单生产者入列/单消费者出列和多生产者入列/多消费者出列操作,在数据传输的时候,降低性能的同时还能保证数据的同步。

    4.5 poll-mode网卡驱动

    DPDK网卡驱动完全抛弃中断模式,基于轮询方式收包,避免了中断开销。

    4.6 NUMA

    dpdk 内存分配上通过 proc 提供的内存信息,使 CPU 核心尽量使用靠近其所在节点的内存,避免了跨 NUMA 节点远程访问内存的性能问题。

    4.7 CPU 亲和性

    dpdk 利用 CPU 的亲和性将一个线程或多个线程绑定到一个或多个 CPU 上,这样在线程执行过程中,就不会被随意调度,一方面减少了线程间的频繁切换带来的开销,另一方面避免了 CPU 缓存的局部失效性,增加了 CPU 缓存的命中率。

    4.8 多核调度框架

    dpdk 基于多核架构,一般会有主从核之分,主核负责完成各个模块的初始化,从核负责具体的业务处理。

    5.总结

    dpdk 绕过了 Linux 内核协议栈,加速数据的处理,用户可以在用户空间定制协议栈,满足自己的应用需求,目前出现了很多基于 dpdk 的高性能网络框架,OVS 和 VPP 是常用的数据面框架,mTCP 和 f-stack 是常用的用户态协议栈。很多大公司都在使用 dpdk 来优化网络性能。

    6.加入讨论

    在这里插入图片描述

    更多相关内容
  • DPDK原理概述

    万次阅读 多人点赞 2017-10-31 22:27:20
    1、DPDK特点 DPDK全称为Date planedevelopment kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点: 1) 轮询:在包处理时避免中断上下文切换的开销, 2) 用户态驱动:规避...

    1、DPDK特点

    DPDK全称为Date planedevelopment kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点:

    1)        轮询:在包处理时避免中断上下文切换的开销,

    2)        用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化

    3)        亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中

    4)        降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽

    5)        软件调优:cache行对齐,预取数据,多元数据批量操作

    2、DPDK框架

    图1 DPDK框图

    在上图中,核心库Core Libs提供系统抽象、大页内存、缓存池、定时器及无锁环等基础组件。

    PMD库,提供全用户态驱动,以便通过轮询和线程绑定得到极高网络吞吐,支持各种本地和虚拟网卡。

    Classify库,支持精确匹配,最长匹配和通配符匹配,提供常用包处理的查表操作。

    Qos库,提供网络服务质量相关组件,限速和调度。

    Mellanox DPDK中保留了Linux内核态驱动,框图如下:


    图2 MellanoxDPDK框图

    Mellanox DPDK在用户空间使用PMD驱动,与网卡之间有两条路径,控制路径使用user verbs,经过内核,用于对象的创建、初始化、修改、查询和释放。数据路径之间访问网卡,进行数据的收发。

    Mellanox DPDK与传统的Linux内核态驱动可以共存,当前未被DPDK使用的端口可以通过Linux网络协议栈进行报文收发。


    图3 MellanoxDPDK与传统内核态驱动

    3、Hugepage配置

    DPDK中,如果有多个核可能需要同时访问一个网卡,那DPDK中会为每个核准备一个单独的接收队列/发送队列,这样避免了竞争,也避免了cache一致性问题。

    一般的常规页大小为4K字节,使用大页时页大小设置为2M或1G字节。修改方式如下:

    Bashrc文件内添加:

    非NUMA系统

    Echo 1024> /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

    预留了1024个2M大页,即2GB内存。

     

    NUMA系统

    Echo 1024>/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

    Echo 1024>/sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages

    上述命令为每个节点各预留了1024个2M大页,即4GB内存。

    /etc/fstab内添加

    挂载2M大页:Nodev /mnt/huge hugetlbfs defaults 0 0

    挂载1G大页:Nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0

     

    4、多线程配置

    DPDK线程基于pthread接口创建,属于抢占式线程模型,受内核调度支配。通过在多核设备上创建多个线程,每个线程绑定到单独的核上,减少线程调度的开销,以提高性能。控制线程一般绑定到MASTER核上,接受用户配置,并传递配置参数给数据线程等;数据线程分布在不同核上处理数据包。

    DPDK中初始化及执行任务分发示例如下图所示:


    图4 lcore初始化及执行任务分发

    上图中一共使用了三个cpu核,master core负责进行任务初始化和分发,两个lcore执行任务。

    5、转发模型

    DPDK转发框架分为run tocompletion模型和pipeline模型,对比图如下:


    图5 DPDK转发模型对比

    DPDK run to completion模型中每个报文的生命周期只能在一个线程中出现,每个物理核都负责处理整个报文的生命周期从RX到TX。

    DPDK pipeline模型中不同的工作交给不同的模块,每一个模块只单独处理特定的事务,各模块之间有输入输出,通过这些输入输出连接起来,完成复杂的网络功能。

    6、内存管理

    DPDK将内存封装在Mbuf结构体内,Mbuf主要用来封装网络帧缓存,所有的应用使用Mbuf结构来传输网络帧。对网络帧封装和处理时,将网络帧元数据和帧本身存放在固定大小的同一段缓存中,网络帧元数据的一部分内容由DPDK的网卡驱动写入,结构如下图:


    图6 单帧Mbuf结构

    上图中,head room用来存储和系统中其他实体交互的信息,如控制信息、帧内容、事件等。Head room长度由RTE_PKTMBUF_HEADROOM定义,默认为128.

    Rte_mbuf结构对象存放在内存池中,内存池使用环形缓存区来保存空闲对象,逻辑结构如下图所示:


    图7 内存池双环形缓存区结构

    当一个网络帧被网卡接收时,DPDK网卡驱动将其存储在一个高效的环形缓冲区中,同时Mbuf的环形缓存区中创建了一个Mbuf对象。Mbuf对象被创建好后,网卡驱动根据分析出的帧信息将其初始化,并将其和实际帧对象逻辑相连,对网络帧的分析处理都集中在Mbuf,仅在必要的时候访问实际网络帧。

    7、性能优化

    1、收发包流程概述

    DPDK中普遍采用纯轮询模式进行数据包收发,所有的收发包有关的中断在物理端口初始化的时候都会关闭。物理端口上的每一个收包队列,都会有一个对应的由收包描述符组成的软件队列来进行硬件和软件的交互。

    DPDK驱动程序负责初始化好每一个收包描述符,其中包含把包缓冲内存块的物理地址填充到收包描述符对应的位置,并把对应的收包成功标志复位,通知网卡硬件把收到的包进行填充。网卡硬件将收到的包一一填充到对应的收包描述符表示的缓冲内存块中,将必要信息填充到收包描述符内,标记好收包成功标志。若一个缓冲区内存块大小不够存放一个完整数据包时,可能需要多个收包描述符来处理一个包。

    针对每一个收包队列,DPDK都会有一个对应的软件线程负责轮询其中的收包描述符收包成功的标志位。当发现一个收包描述符的收包成功标志被硬件置位了,意味着有包进入网卡并且已经存储到描述符对应的缓冲区内存块中。驱动程序将解析相应的收包描述符,填充对应缓冲内存块头部,将收包缓冲内存块存放到收包函数提供的数组中,同时分配好一个新的缓冲内存块给这个描述符,以便下一次收包。

    针对每一个发包队列,DPDK都有一个对应的软件线程负责设置需要发送出去的包,DPDK驱动程序负责提取发包缓冲内存块的有效信息,根据内存缓存块中包的内容来负责初始化好每一个发包描述符,驱动程序将每个包翻译为一个或者多个发包描述符内能够理解的内容,写入发包描述符。当驱动程序设置好相应的发包描述符,硬件就开始依据发包描述符内容来发包,驱动程序通过获取发包描述符内的RS发送状态位来决定发包是否结束以及对发包描述符和内存缓冲块进行回收。发包轮询就是轮询发包结束的硬件标志位,DPDK驱动程序会在发包线程内不断查询发包是否结束,网卡根据RS以写回方式通知发包结束。

    2、Burst收发包

    Burst为一次完成多个数据包的收发,通过把收发包复杂的处理过程进行分解,打散成不同的相对较小的处理阶段,把相邻数据访问、相似的数据运算集中处理,尽可能减少对内存或者低一级的处理器缓存的访问次数。网卡收发包描述符一般为16字节或32字节,处理器缓存基本单位为64字节,可以存放2个或4个描述符,处理器预期机制会每次存取相邻多个缓存,若一次处理4个缓存单元,则可以更新16个描述符,Burst就可以设置为16.目前常用的Burst为32.

    3、平台优化配置

    硬件:

    PCIe Gen3 x 8,x16.

    网卡多队列收发包,支持收包RSS时分发进多个队列。

    软件:

    关闭CPU以及设备的省电模式;

    让内存运行在所支持的最高频率上;

    内核初始化时设置好大页;

    增加内核启动参数,预先指定DPDK使用的逻辑核,不被操作系统调度;

    DPDK参数配置:

             收包队列长度,即每个收包队列分配的收包描述符个数,反映了在软件驱动程序读取所收到包之前最大的缓存包的能力。太长占用资源,太短容易丢包,默认长度为128.

             发包队列长度,即每个发包队列分配的发包描述符个数,默认长度为512.

             收包队列可释放描述符数量阈值,DPDK驱动程序并没有每次收包都更新收包队列尾部索引寄存器,而是在可释放的收包描述符数量达到一个阈值时更新,设置合理,可以减少没有必要的过多收包队列尾部索引寄存器的访问。默认值为32.

             发包队列可释放描述符数量阈值,通过将回写标记设置在一定间隔的发包描述符上,减少不必要的回写次数,改善性能,默认为32.

             发包描述符释放阈值,当用来重新配置的发包描述符数量少于阈值时,才会启动描述符和Mbuf释放动作,设置太大释放频繁,影响性能,设置太小可用描述符少,容易丢包,默认值为32.

    4、多队列配置

    DPDK中,通过将网卡的某个接收队列分配给某个核,从该队列中收到的所有报文都应当在该指定的核上处理结束,不同的核操作不同的队列。

    目前可以通过RSS(接收方扩展)把数据包分配到不同的队列中,该机制根据关键字通过哈希函数计算出哈希值,再有哈希值确定队列。不同的数据包类型具有不同的关键字,例如IPv4 UDP四元组(源IP地址、目的IP地址、源端口号、目的端口号)。

    另一种是Flow Director技术,根据包的字段精确匹配,查找Flow Director表项,将其分配到某个特定队列。

    DPDK中可以采用RSS来负载均衡,将报文发到多个核上,同时使用Flow Director将控制报文分配到指定的队列上,使用单独的核来处理,如下图所示;


    图8 DPDK中RSS和FDIR的应用

    5、硬件加速功能

    VLAN Tag的插入和剥离由网卡硬件完成。

    1)收包时VLAN tag过滤,网卡硬件端口设计了VLAN过滤表,无法在过滤表中匹配的VLAN包会被丢弃。

    2)收包时VLAN tag剥离,网卡硬件会在硬件描述符中设置两个域,将需要的信息通知驱动软件,包含此包是否曾被剥离了VLAN tag以及被剥离的tag。

    3)发包时VLAN tag插入,TPID值固定,可通过寄存器进行设置,TCL进行逐包设置。

    TCP分片功能由硬件提供,将现有较大的TCP分片拆分为较小的TCP分片,仅需要复制TCP的包头,更新头里面的长度相关信息,重新计算校验和。

    RSC组包功能针对TCP数据包,由硬件将拆分的TCP分片聚合成一个大的分片,从而减轻软件的处理。

    展开全文
  • DPDK 原理

    2022-08-09 15:29:06
    DPDK采用HugePage,在x86-64下支持2MB、1GB的页大小,几何级的降低了页表项的大小,从而减少TLB-Miss。根据我们的实践,在数据平面(Data Plane)频繁的内存分配释放,必须使用内存池,不能直接使用rte_malloc,...

    DPDK 入门

    DPDK旁路原理

    原来内核协议栈的方式数据是从 网卡-->驱动-->协议栈-->socket接口-->业务

    ​ 而DPDK的方式是基于UIO(Userspace I/O)旁路数据。数据从 网卡-->DPDK轮询模式-->DPDK基础库-->业务

    DPDK的基石UIO

    为了让驱动运行在用户态,linux提供UIO机制,使用UIO可以通过read感知中断,通过mmap实现核网卡的通讯

    UIO原理

     

    要开发用户态驱动有几个步骤:

    1. 开发运行在内核的UIO模块,因为硬中断只能在内核处理

    2. 通过/dev/uioX读取中断

    3. 通过mmap和外设共享内存

    DKDP核心优化

    DPDK的UIO驱动屏蔽了硬件发出的中断,然后在用户态采用主动轮训的方式,这种模式被称为PMD(Poll Mode Driver)

    UIO 旁路了内核,主动轮训去掉硬中断,DPDK从而可以在用户态做收发包处理。带来zero copy,无系统调用的好处,同步处理减少上下文切换带来的Cache MIss。

    运行在PMD的CORE会处于CPU100%的状态。

    网络空闲时CPU 长期空转,会带来能耗问题。所以,DPDK推出interrupt DPDK模式。

    interrupt DPDK:

    DPDK的高性能代码实现

    1. 采用HugePage减少TLB Miss

    默认下Linux采用4KB为一页,页越小内存越大,页表的开销越大,页表的内存占用也越大。CPU有(Translation Lookaside Buffer)成本高所以一般就只能存放几百到上千个页表项。如果进程要使用64G内存,则64G/4KB=16000000(一千六百万)页,每页在页表项中占用16000000 * 4B=62MB。如果用HugePage采用2MB作为一页,只需64G/2MB=2000,数量不在同个级别。

    而DPDK采用HugePage,在x86-64下支持2MB、1GB的页大小,几何级的降低了页表项的大小,从而减少TLB-Miss。并提供了内存池(Mempool)、MBuf、无锁环(Ring)、Bitmap等基础库。根据我们的实践,在数据平面(Data Plane)频繁的内存分配释放,必须使用内存池,不能直接使用rte_malloc,DPDK的内存分配实现非常简陋,不如ptmalloc。

    2. SNA(Shared-nothing Architecture)

    软件架构去中心化,尽量避免全局共享,带来全局竞争,失去横向扩展的能力。NUMA体系下不跨Node远程使用内存。

    3. SIMD(Single Instruction Multiple Data)

    从最早的mmx/sse到最新的avx2,SIMD的能力一直在增强。DPDK采用批量同时处理多个包,再用向量编程,一个周期内对所有包进行处理。比如,memcpy就使用SIMD来提高速度。

    SIMD在游戏后台比较常见,但是其他业务如果有类似批量处理的场景,要提高性能,也可看看能否满足。

    4. 不使用慢速API

    这里需要重新定义一下慢速API,比如说gettimeofday,虽然在64位下通过vDSO已经不需要陷入内核态,只是一个纯内存访问,每秒也能达到几千万的级别。但是,不要忘记了我们在10GE下,每秒的处理能力就要达到几千万。所以即使是gettimeofday也属于慢速API。DPDK提供Cycles接口,例如rte_get_tsc_cycles接口,基于HPET或TSC实现。

     

    展开全文
  • DPDK原理概述

    千次阅读 2021-07-17 20:29:27
    1、DPDK特点 DPDK全称为Date planedevelopment kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点: 1) 轮询:在包处理时避免中断上下文切换的开销, 2) 用户态驱动:规避...

    1、DPDK特点

    DPDK全称为Date planedevelopment kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点:

    1)        轮询:在包处理时避免中断上下文切换的开销,

    2)        用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化

    3)        亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中

    4)        降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽

    5)        软件调优:cache行对齐,预取数据,多元数据批量操作
     

    2、DPDK框架

                                                           最简单架构

    • PMD:Pool Mode Driver,轮询模式驱动,通过非中断,以及数据帧进出应用缓冲区内存的零拷贝机制,提高发送/接受数据帧的效率
    • 流分类:Flow Classification,为N元组匹配和LPM(最长前缀匹配)提供优化的查找算法
    • 环队列:Ring Queue,针对单个或多个数据包生产者、单个数据包消费者的出入队列提供无锁机制,有效减少系统开销
    • MBUF缓冲区管理:分配内存创建缓冲区,并通过建立MBUF对象,封装实际数据帧,供应用程序使用
    • EAL:Environment Abstract Layer,环境抽象(适配)层,PMD初始化、CPU内核和DPDK线程配置/绑定、设置HugePage大页内存等系统初始化
       

    在上图中,核心库Core Libs提供系统抽象、大页内存、缓存池、定时器及无锁环等基础组件。

    PMD库,提供全用户态驱动,以便通过轮询和线程绑定得到极高网络吞吐,支持各种本地和虚拟网卡。

    Classify库,支持精确匹配,最长匹配和通配符匹配,提供常用包处理的查表操作。

    Qos库,提供网络服务质量相关组件,限速和调度。

    Mellanox DPDK中保留了Linux内核态驱动,框图如下:

    Mellanox DPDK在用户空间使用PMD驱动,与网卡之间有两条路径,控制路径使用user verbs,经过内核,用于对象的创建、初始化、修改、查询和释放。数据路径之间访问网卡,进行数据的收发。

    Mellanox DPDK与传统的Linux内核态驱动可以共存,当前未被DPDK使用的端口可以通过Linux网络协议栈进行报文收发。

    3、Hugepage配置

    DPDK中,如果有多个核可能需要同时访问一个网卡,那DPDK中会为每个核准备一个单独的接收队列/发送队列,这样避免了竞争,也避免了cache一致性问题。

    一般的常规页大小为4K字节,使用大页时页大小设置为2M或1G字节。修改方式如下:

    Bashrc文件内添加:

    非NUMA系统

    Echo 1024> /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

    预留了1024个2M大页,即2GB内存。

    NUMA系统

    Echo 1024>/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

    Echo 1024>/sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages

    上述命令为每个节点各预留了1024个2M大页,即4GB内存。

    /etc/fstab内添加

    挂载2M大页:Nodev /mnt/huge hugetlbfs defaults 0 0

    挂载1G大页:Nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0
     

    4、多线程配置

    DPDK线程基于pthread接口创建,属于抢占式线程模型,受内核调度支配。通过在多核设备上创建多个线程,每个线程绑定到单独的核上,减少线程调度的开销,以提高性能。控制线程一般绑定到MASTER核上,接受用户配置,并传递配置参数给数据线程等;数据线程分布在不同核上处理数据包。

    DPDK中初始化及执行任务分发示例如下图所示:

                                                    图4 lcore初始化及执行任务分发

    上图中一共使用了三个cpu核,master core负责进行任务初始化和分发,两个lcore执行任务。

    5、转发模型

    DPDK转发框架分为run tocompletion模型和pipeline模型,对比图如下:

                                                    图5 DPDK转发模型对比

    DPDK run to completion模型中每个报文的生命周期只能在一个线程中出现,每个物理核都负责处理整个报文的生命周期从RX到TX。

    DPDK pipeline模型中不同的工作交给不同的模块,每一个模块只单独处理特定的事务,各模块之间有输入输出,通过这些输入输出连接起来,完成复杂的网络功能。
     

     6、内存管理

    DPDK将内存封装在Mbuf结构体内,Mbuf主要用来封装网络帧缓存,所有的应用使用Mbuf结构来传输网络帧。对网络帧封装和处理时,将网络帧元数据和帧本身存放在固定大小的同一段缓存中,网络帧元数据的一部分内容由DPDK的网卡驱动写入,结构如下图:

    上图中,head room用来存储和系统中其他实体交互的信息,如控制信息、帧内容、事件等。Head room长度由RTE_PKTMBUF_HEADROOM定义,默认为128.

    Rte_mbuf结构对象存放在内存池中,内存池使用环形缓存区来保存空闲对象,逻辑结构如下图所示:

    当一个网络帧被网卡接收时,DPDK网卡驱动将其存储在一个高效的环形缓冲区中,同时Mbuf的环形缓存区中创建了一个Mbuf对象。Mbuf对象被创建好后,网卡驱动根据分析出的帧信息将其初始化,并将其和实际帧对象逻辑相连,对网络帧的分析处理都集中在Mbuf,仅在必要的时候访问实际网络帧。

    7、性能优化

    1、收发包流程概述

    DPDK中普遍采用纯轮询模式进行数据包收发,所有的收发包有关的中断在物理端口初始化的时候都会关闭。物理端口上的每一个收包队列,都会有一个对应的由收包描述符组成的软件队列来进行硬件和软件的交互。

    DPDK驱动程序负责初始化好每一个收包描述符,其中包含把包缓冲内存块的物理地址填充到收包描述符对应的位置,并把对应的收包成功标志复位,通知网卡硬件把收到的包进行填充。网卡硬件将收到的包一一填充到对应的收包描述符表示的缓冲内存块中,将必要信息填充到收包描述符内,标记好收包成功标志。若一个缓冲区内存块大小不够存放一个完整数据包时,可能需要多个收包描述符来处理一个包。

    针对每一个收包队列,DPDK都会有一个对应的软件线程负责轮询其中的收包描述符收包成功的标志位。当发现一个收包描述符的收包成功标志被硬件置位了,意味着有包进入网卡并且已经存储到描述符对应的缓冲区内存块中。驱动程序将解析相应的收包描述符,填充对应缓冲内存块头部,将收包缓冲内存块存放到收包函数提供的数组中,同时分配好一个新的缓冲内存块给这个描述符,以便下一次收包。

    针对每一个发包队列,DPDK都有一个对应的软件线程负责设置需要发送出去的包,DPDK驱动程序负责提取发包缓冲内存块的有效信息,根据内存缓存块中包的内容来负责初始化好每一个发包描述符,驱动程序将每个包翻译为一个或者多个发包描述符内能够理解的内容,写入发包描述符。当驱动程序设置好相应的发包描述符,硬件就开始依据发包描述符内容来发包,驱动程序通过获取发包描述符内的RS发送状态位来决定发包是否结束以及对发包描述符和内存缓冲块进行回收。发包轮询就是轮询发包结束的硬件标志位,DPDK驱动程序会在发包线程内不断查询发包是否结束,网卡根据RS以写回方式通知发包结束。

    2、Burst收发包


    Burst为一次完成多个数据包的收发,通过把收发包复杂的处理过程进行分解,打散成不同的相对较小的处理阶段,把相邻数据访问、相似的数据运算集中处理,尽可能减少对内存或者低一级的处理器缓存的访问次数。网卡收发包描述符一般为16字节或32字节,处理器缓存基本单位为64字节,可以存放2个或4个描述符,处理器预期机制会每次存取相邻多个缓存,若一次处理4个缓存单元,则可以更新16个描述符,Burst就可以设置为16.目前常用的Burst为32.

    3、平台优化配置


    硬件:

    PCIe Gen3 x 8,x16.

    网卡多队列收发包,支持收包RSS时分发进多个队列。

    软件:

    关闭CPU以及设备的省电模式;

    让内存运行在所支持的最高频率上;

    内核初始化时设置好大页;

    增加内核启动参数,预先指定DPDK使用的逻辑核,不被操作系统调度;

    DPDK参数配置:

             收包队列长度,即每个收包队列分配的收包描述符个数,反映了在软件驱动程序读取所收到包之前最大的缓存包的能力。太长占用资源,太短容易丢包,默认长度为128.

             发包队列长度,即每个发包队列分配的发包描述符个数,默认长度为512.

             收包队列可释放描述符数量阈值,DPDK驱动程序并没有每次收包都更新收包队列尾部索引寄存器,而是在可释放的收包描述符数量达到一个阈值时更新,设置合理,可以减少没有必要的过多收包队列尾部索引寄存器的访问。默认值为32.

             发包队列可释放描述符数量阈值,通过将回写标记设置在一定间隔的发包描述符上,减少不必要的回写次数,改善性能,默认为32.

             发包描述符释放阈值,当用来重新配置的发包描述符数量少于阈值时,才会启动描述符和Mbuf释放动作,设置太大释放频繁,影响性能,设置太小可用描述符少,容易丢包,默认值为32.

    4、多队列配置


    DPDK中,通过将网卡的某个接收队列分配给某个核,从该队列中收到的所有报文都应当在该指定的核上处理结束,不同的核操作不同的队列。

    目前可以通过RSS(接收方扩展)把数据包分配到不同的队列中,该机制根据关键字通过哈希函数计算出哈希值,再有哈希值确定队列。不同的数据包类型具有不同的关键字,例如IPv4 UDP四元组(源IP地址、目的IP地址、源端口号、目的端口号)。

    另一种是Flow Director技术,根据包的字段精确匹配,查找Flow Director表项,将其分配到某个特定队列。

    DPDK中可以采用RSS来负载均衡,将报文发到多个核上,同时使用Flow Director将控制报文分配到指定的队列上,使用单独的核来处理,如下图所示;
     

     

    5、硬件加速功能


    VLAN Tag的插入和剥离由网卡硬件完成。

    1)收包时VLAN tag过滤,网卡硬件端口设计了VLAN过滤表,无法在过滤表中匹配的VLAN包会被丢弃。

    2)收包时VLAN tag剥离,网卡硬件会在硬件描述符中设置两个域,将需要的信息通知驱动软件,包含此包是否曾被剥离了VLAN tag以及被剥离的tag。

    3)发包时VLAN tag插入,TPID值固定,可通过寄存器进行设置,TCL进行逐包设置。

    TCP分片功能由硬件提供,将现有较大的TCP分片拆分为较小的TCP分片,仅需要复制TCP的包头,更新头里面的长度相关信息,重新计算校验和。

    RSC组包功能针对TCP数据包,由硬件将拆分的TCP分片聚合成一个大的分片,从而减轻软件的处理。
     

    展开全文
  • 相对传统的基于内核的网络数据处理,dpdk 对从内核层到用户层的网络数据流程进行了重大突破,DPDK拦截中断,不触发后续中断流程,并绕过协议栈,通过UIO技术将网卡收到的报文拷贝到应用层处理,报文不再经过内核协议...
  • DPDK原理学习

    2020-05-07 17:21:30
    DPDK特点 DPDK全称为Date planedevelopment kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点: 轮询: 在包处理时避免中断上下文切换的开销, 用户态驱动:规避不必要的...
  • 一、什么是DPDK  对于用户来说,它可能是一个性能出色的包数据处 理加速软件库;对于开发者来说,它可能是一个实践包处理新想法的创 新工场;对于性能调优者来说,它可能又是一个绝佳的成果分享平台。   DPDK用...
  • DPDK的基本原理

    千次阅读 2020-02-11 16:20:18
    三.DPDK原理解释 一.网络设备转发报文 网络设备(路由器、交换机、媒体网关、SBC、PS网关等)需要在瞬间进行大量的报文收发,因此在传统的网络设备上,往往能够看到专门的NP(Network Process)处理器,有的用FPGA...
  • 网卡从1G到100G的发展,CPU从单核到多核到多CPU的发展,服务器的单机能力通过横行扩展达到新的高点。但是软件开发却无法跟上节奏,单机处理能力没能和硬件门当户对,如何开发出与时并进高吞吐量的服务,单机百万千万...
  • DPDK如何编译 2.方法 ------------------------------------------------------------------------------ RTE_SDK exported as /home/totosun/Desktop/dpdk-19.08.2/dpdk-stable-19.08.2 ------------------------...
  • 利用DPDK来优化网络驱动,通过无锁硬件访问技术加速报文处理,例如Intel网卡的Flow Director技术将指定的TCP流导入到特定的硬件队列,针对每个Connection(连接)分配不同的TX/RX队列。 其次,在Socket协议层,我们...
  • DPDK 实现原理 ( UIO Framework ) Linux 协议栈的收发数据包方式,首先网卡通过中断方式通知内核协议栈对数据包进行处理,内核协议栈会对数据包进行合法性检查,然后判断数据包目标是否为本机的 Socket, 满足条件...
  • dpdk接收数据包原理分析

    万次阅读 2018-08-19 21:24:48
    dpdk接收数据包原理分析 摘要 本文对dpdk数据包捕获技术原理进行了分析,对其优缺点进行了介绍。 对使用基于EAL的应用程序进行了分析,作出了程序流程图。 引言 背景浅析 随着云计算产业的异军突起,网络...
  • dpdk 2.2.0版本的英文手册和dpdk架构图,以及dpdk原理图。资料只作为学习参考资料,工需要学习的人人使用
  • DPDK之一-原理与优势

    2022-04-23 20:50:03
    1 DPDK原理 1.1 传统网络数据原理 Linux网络协议栈在处理数据包时,需要经过两个步骤:首先将数据从物理网卡拷贝到内核协议栈;第二步从内核空间将数据拷贝到用户空间。网络数据包经过两次拷贝才到达用户空间,由于...
  • DPDK原理分析——Hash库(librte_hash)

    千次阅读 2018-08-03 16:30:11
    Hash表和算法是高性能流量处理中常用技术,在DPDK中也提供了相应的高性能实现用于支持流表、转发规则表...Hash算法原理——Cuckoo Hash DPDK中的Hash库采用的hash算法和数据结构基于CuckooHash(https://www.jiansh...
  • DPDK 分析,原理以及学习路线

    千次阅读 2020-11-03 17:57:46
    概述 随着互联网的高速发展,云产业的快速突起,基础架构网络... 提出DPDK开发套件如何突破操作系统限制 之后分析了dpdk的整体结构 最后对相关联的技术和场景做扩展. 背景分析 前10年中,网络程序性...
  • ovs-dpdkDPDK的Openvswitch
  • DPDK的基本原理、学习路线总结

    千次阅读 2021-01-28 15:40:17
    一、DPDK原理 网络设备(路由器、交换机、媒体网关、SBC、PS网关等)需要在瞬间进行大量的报文收发,因此在传统的网络设备上,往往能够看到专门的NP(Network Process)处理器,有的用FPGA,有的用ASIC。这些专用...
  • DPDK AF_XDP

    千次阅读 2021-05-26 19:13:40
    DPDK AF_XDP AF_XDP 是 kernel v4.18+ 新加入的一个协议族(如AF_INET), 主要使用 XDP 实现(下图是 XDP 的基本原理图). 核心原理是在 kernel NAPI poll 位置(网卡驱动内部实现, 为内核最早RX数据包位置)运行 BPF 程序...
  • 平均薪资30k的dpdk开发岗位,适合做c/c++想去大厂的你 ...2. dpdk实现原理 3. 如何入手dpdk,自己能写dpdk代码 4. dpdk的技术架构 5. dpdk开发生态 OvS,VPP,nff-go,f-stack 6. 优化本地存储io性能 spdk
  • DPDK-UIO 驱动认识

    千次阅读 2019-06-19 09:28:10
    dpdk的一些底层原理没做过多分析,今天主要学习用户态驱动程序的实现情况。 用户态驱动程序UIO UIO(Userspace I/O)是运行在用户空间的I/O技术。Linux系统中一般的驱动设备都是运行在内核空间,而在用户空间用...
  • 作者简介:Anatoly Burakov,英特尔软件工程师,目前在维护DPDK中的VFIO和内存子系统。 目录 引言 标准大页 将内存固定到NUMA节点 硬件、物理地址和直接内存存取(DMA) IOMMU和IOVA 内存分配和管理 内存池...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,302
精华内容 920
关键字:

dpdk原理