精华内容
下载资源
问答
  • dpdk技术
    2021-02-16 16:37:21

    https://blog.csdn.net/armlinuxww/category_8708852.html

    更多相关内容
  • 中国电信DPDK技术白皮书.pdf,中国电信DPDK技术白皮书.pdf,中国电信DPDK技术白皮书.pdf,中国电信DPDK技术白皮书.pdf
  • DPDK全称为Date planedevelopment kit,是一个用来进行包数据处理加速的软件库。与传统的数据包处理相比,DPDK具有以下特点: 1) 轮询:在包处理时避免中断上下文切换的开销, 2) 用户态驱动:规避不必要的内存...
  • DPDK技术峰会PPT讲稿 DPDK开发者大会讲稿 文档讨论了腾讯的开源协议栈F-Stack,设计原则、架构、主要组件、性能及其在腾讯公司内的发展历史,F-Stack, a Full User Space Network Service on DPDK – Haigong Wang @...
  • DPDK技术峰会,PPT讲稿分享 ,Accelerate VM I/O via SPDK and Crypto for Generic vHost – Changpeng Liu, Xin Zeng @ Intel 该文档讨论了利用DPDK常规vHost user库去创建存储(vHost-SCSI)和crypto(vhost-...
  • DPDK技术峰会PPT讲稿 DPDK开发者大会 PDF讲稿 A Better Virtio towards NFV Cloud – Cunming Liang, Xiao Wang @ Intel 文档讨论了vHost数据平台加速技术,为网络功能云化作铺垫,包括接纳DPDK和QEMU社区的roadma
  • 中国电信DPDK技术白皮书V1.2,本白皮书主要集中分析基于DPDK的单节点物理主机与虚拟机环境的I/O性能优化方法,以及相关性能指标与测试方法。
  • ETSI NFV技术通过运行在通用x86架构硬件上的虚拟化网络功能,为电信运营商和互联网服务商提供了一种灵活的业务部署手段和高效的组网方案,可以支持固移网络和IDC中NAT、DPI、EPC、FW等各类业务功能的广域灵活部署与...
  • 针对当前互联网海量流量的网络形式,实现VoIP流量高效识别的目的,本文采用基于DPDK技术的VOIP流量识别方法,将受限于网卡和带宽的传统服务器离散式框架整合至一个扩展性更高且更简单的单个网络流量识别框构。...
  • DPDK技术峰会PPT讲稿 DPDK开发者大会讲稿 DPDK in Container: Status Quo and Future Directions – Jianfeng Tan @ Intel,文档讨论了DPDK如何加速容器网络,数据平台和控制平台的相关问题、进展和计划等。
  • 本文来自于京东商城基础平台部,本文主要介绍了京东商城设计和实践的一套高可靠,高性能的负载均衡器,我们命名为SKYLB。随着京东业务的高速增长,作为应用入口的负载均衡,大流量大并发带来的挑战越来越严峻。...
  • DPDK技术白皮书

    2018-03-30 10:24:38
    中国电信DPDK 技术白皮书,中国电信DPDK 技术白皮书。
  • DPDK技术介绍(一)

    万次阅读 多人点赞 2020-04-17 21:03:31
    DPDK是INTEL公司开发的一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案,主要技术有用户态、轮询取代中断、零拷贝、网卡RSS、访存DirectIO等。 1、UIO(Linux...

    DPDK是INTEL公司开发的一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案,主要技术有用户态、轮询取代中断、零拷贝、网卡RSS、访存DirectIO等。

    一、主要特点

    1、UIO(Linux Userspace I/O)

    提供应用空间下驱动程序的支持,也就是说网卡驱动是运行在用户空间的,减下了报文在用户空间和应用空间的多次拷贝。如图:DPDK绕过了Linux内核的网络驱动模块,直接从网络硬件到达用户空间,不需要进行频繁的内存拷贝和系统调用。根据官方给出的数据,DPDK裸包反弹每个包需要80个时钟周期,而传统Linux内核协议栈每包需要2k~4k个时钟周期。DPDK能显著提升虚拟化网络设备的数据采集效率。
    在这里插入图片描述
    下图为UIO技术的工作原理图
    在这里插入图片描述
    UIO技术将设备驱动分为用户空间驱动和内核空间驱动两部分,内核空间驱动主要负责设备资源分配、UIO设备注册以及小部分中断响应函数,驱动的大部分工作在用户空间的驱动程序下完成。通过UIO框架提供的API接口将UIO的驱动注册到内核,注册完成后将生成存有设备物理地址等信息的map文件,用户态进程访问该文件将设备对应的内存空间地址映射到用户空间,即可直接操作设备的内存空间,UIO技术使得应用程序可以通过用户空间驱动直接操作设备的内存空间,避免了数据在内核缓冲区和应用程序缓冲区的多次拷贝,提供数据处理效率。

    简单地说,DPDK使高速数据包网络应用程序的开发变得更快,这意味着它允许构建能够更快地处理数据包的应用程序,这多亏了内核的绕过。实际上,它使用了快速路径,而不是正常的网络层路径和上下文切换路径。包被直接传递到用户空间(作为原始包)。如下图为linux内核包处理和dpdk包处理的区别。

    linux内核处理包:
    在这里插入图片描述
    dpdk处理包:
    在这里插入图片描述
    下图为slow路径和fast路径比较:
    在这里插入图片描述

    2、用户空间轮询模式(PMD)

    传统中断模式: 传统Linux系统中,当网络设备检测到数据帧过来的时候,会使用DMA(直接内存访问)将帧发送到预先分配好的内核缓冲区里面,然后更新相应的接收描述符环,之后产生中断通知有数据帧过来。Linux系统会进行相应的响应,然后更新相应的描述符环,再将接收到的数据帧交给内核中的网络堆栈进行处理,网络堆栈处理完之后会将相应的数据拷贝到相应的套接字,从而数据就被复制到了用户空间,应用程序就可以使用这些数据了,数据帧的接收过程如图:
    在这里插入图片描述
    在发送的时候,一旦用户程序处理完了数据,会通过一个系统调用将数据写入到套接字,将数据从用户空间拷贝到内核空间的缓冲区,交由网络堆栈进行处理,网络堆栈根据需要对数据进行封装并调用网卡设备的驱动程序,网卡设备驱动程序会更新传输描述符环,然后向网卡设备告知有数据帧需要传输。网卡设备会将数据帧从内核中的缓冲区拷贝到自己的缓冲区中并发送到网络链路上,传送到链路上之后,网卡设备会通过一个中断告知成功发送,然后内核会释放相应的缓冲区。数据的发送如图:
    在这里插入图片描述
    由于linux系统是通过中断的方式告知CPU有数据包过来的,当网络的流量越来越大,linux系统会浪费越来越多的时间去处理中断,当流量速率达到10G的时候,linux系统可能会被中断淹没,浪费很多CPU资源。

    DPDK用户空间的轮询模式驱动:用户空间驱动使得应用程序不需要经过linux内核就可以访问网络设备卡。网卡设备可以通过DMA方式将数据包传输到事先分配好的缓冲区,这个缓冲区位于用户空间,应用程序通过不断轮询的方式可以读取数据包并在原地址上直接处理,不需要中断,而且也省去了内核到应用层的数据包拷贝过程。

    因此相对于linux系统传统中断方式,Intel DPDK避免了中断处理、上下文切换、系统调用、数据复制带来的性能上的消耗,大大提升了数据包的处理性能。同时由于Intel DPDK在用户空间就可以开发驱动,与传统的在内核中开发驱动相比,安全系数大大降低。因为内核层权限比较高,操作相对比较危险,可能因为小的代码bug就会导致系统崩溃,需要仔细的开发和广泛的测试。而在应用层则相反,比较安全,且在应用层调试代码要方便的多。

    3、大页内存

    Linux操作系统通过查找TLB来实现快速的虚拟地址到物理地址的转化。由于TLB是一块高速缓冲cache,容量比较小,容易发生没有命中。当没有命中的时候,会触发一个中断,然后会访问内存来刷新页表,这样会造成比较大的时延,降低性能。Linux操作系统的页大小只有4K,所以当应用程序占用的内存比较大的时候,会需要较多的页表,开销比较大,而且容易造成未命中。相比于linux系统的4KB页,Intel DPDK缓冲区管理库提供了Hugepage大页内存,大小有2MB和1GB页面两种,可以得到明显性能的提升,因为采用大页内存的话,可以需要更少的页,从而需要更少的TLB,这样就减少了虚拟页地址到物理页地址的转换时间。‘

    DPDK中的内存管理如图,最下面是连续的物理内存,这些物理内存是由2MB的大页组成,连续的物理内存上面是内存段,内存段之上则是内存区,我们分配的基本单元对象是在内存区中分配的,内存区包含了ring队列,内存池、LPM路由表还有其他一些高性能的关键结构。

    在这里插入图片描述

    4、CPU亲和性

    CPU的亲和性(CPU affinity),它是多核CPU发展的结果。随着核心的数量越来越多,为了提高程序工作的效率必须使用多线程。但是随着CPU的核心的数目的增长,Linux的核心间的调度和共享内存争用会严重影响性能。利用Intel DPDK的CPU affinity可以将各个线程绑定到不同的cpu,可以省去来回反复调度带来的性能上的消耗。

    在一个多核处理器的机器上,每个CPU核心本身都存在自己的缓存,缓冲区里存放着线程使用的信息。如果线程没有绑定CPU核,那么线程可能被Linux系统调度到其他的CPU上,这样的话,CPU的cache命中率就降低了。利用CPU的affinity技术,一旦线程绑定到某个CPU后,线程就会一直在指定的CPU上运行,操作系统不会将其调度到其他的CPU上,节省了调度的性能消耗,从而提升了程序执行的效率。

    多核轮询模式:多核轮询模式有两种,分别是IO独占式和流水线式。IO独占式是指每个核独立完成数据包的接收、处理和发送过程,核之间相互独立,其优点是其中一个核出现问题时不影响其他核的数据收发。流水线式则采用多核合作的方式处理数据包,数据包的接收、处理和发送由不同的核完成。流水线式适合面向流的数据处理,其优点是可对数据包按照接收的顺序有序进行处理,缺点是当某个环境(例如接收)所涉及的核出现阻塞,则会造成收发中断。

    IO独占式多核轮询模式中每个网卡只分配给一个逻辑核进行处理。每个逻辑核给所接管的网卡分别分配一个发送队列和一个接收队列,并且独立完成数据包的接收、处理和发送的过程,核与核之间相互独立。系统数据包的处理由多个逻辑核同时进行,每个网卡的收发包队列只能由一个逻辑核提供。当数据包进入网卡的硬件缓存区,用户空间提供的网卡驱动通过轮询得知网卡收到数据包,从硬件缓冲区中取出数据包,并将数据包存入逻辑核提供的收包队列中,逻辑核取出收包队列中的数据包进行处理,处理完毕后将数据包存入逻辑核提供的发包队列,然后由网卡驱动取出发往网卡,最终发送到网络中。

    IO独占式多核轮询模式架构图:
    在这里插入图片描述

    5、内存池和无锁环形缓存管理

    此外Intel DPDK将库和API优化成了无锁,比如无锁队列,可以防止多线程程序发生死锁。然后对缓冲区等数据结构进行了cache对齐。如果没有cache对齐,则可能在内存访问的时候多读写一次内存和cache。

    内存池缓存区的申请和释放采用的是生产者-消费者模式无锁缓存队列进行管理,避免队列中锁的开销,在缓存区的使用过程中提高了缓冲区申请释放的效率。

    无锁环形队列生产过程:
    在这里插入图片描述
    无锁环形队列消费过程:
    在这里插入图片描述

    如图所示,生产者往队列里存放内容的方向和消费者从队列里取内容的方向一致,均以顺时针方向进行。当缓存区向内存池申请内存块,或者应用程序进行内存块的释放时,缓存区的无锁环形队列的生产者指针顺时针移动,往队列中存入内存块地址信息,进行缓存队列的生产过程。当应用程序需要向缓冲区申请内存块使用时,缓冲区的无锁环形队列的消费者指针以顺时针的方向取出队列的内存块地址,分配给应用程序使用,该过程为缓存队列的消费过程。

    生产n个对象过程:首先生产者头指针往顺时针方向移n个位置获得新的头指针,然后从生产者尾指针指的区域开始逐个存入n个对象,最后生产者尾指针顺时针移动n个位置获得新的生产者尾指针

    消费n个对象过程:首先消费者头指针顺时针移动n个位置获得新的消费者头指针,然后从消费者尾指针处开始逐个读取n个对象,最后消费者尾指针顺时针移动n个位置获得新的消费者尾指针。

    6、网络存储优化

    在这里插入图片描述

    二、架构与核心组件

    1、 DPDK总体架构

    在这里插入图片描述

    2、核心组件

    DPDK主要有六个核心组件

    1、 环境抽象层(EAL):为DPDK其他组件和应用程序提供一个屏蔽具体平台特性的统一接口,环境抽象层提供的功能主要有:DPDK加载和启动;支持多核和多线程执行类型;CPU核亲和性处理;原子操作和锁操作接口;时钟参考;PCI总线访问接口;跟踪和调试接口;CPU特性采集接口;中断和告警接口等。

    2、 堆内存管理组件(Malloc lib):堆内存管理组件为应用程序提供从大页内存分配对内存的接口。当需要分配大量内存小块时,使用这些接口可以减少TLB缺页。

    3、 环缓冲区管理组件(Ring lib):环缓冲区管理组件为应用程序和其他组件提供一个无锁的多生产者多消费者FIFO队列API:Ring。Ring是借鉴了Linux内核kfifo无锁队列,可以无锁出入对,支持多消费/生产者同时出入队。

    4、 内存池管理组件(Mem pool lib):为应用程序和其他组件提供分配内存池的接口,内存池是一个由固定大小的多个内存块组成的内存容器,可用于存储相同对象实体,如报文缓存块等。内存池由内存池的名称来唯一标识,它由一个环缓冲区和一组核本地缓存队列组成,每个核从自己的缓存队列分配内存块,当本地缓存队列减少到一定程度时,从内存缓冲区中申请内存块来补充本地队列。

    5、 网络报文缓存块管理组件(Mbuf lib):提供应用程序创建和释放用于存储报文信息的缓存块的接口,这些MBUF存储在内存池中。提供两种类型的MBUF,一种用于存储一般信息,一种用于存储报文信息。

    6、 定时器组件(Timer lib):提供一些异步周期执行的接口(也可以只执行一次),可以指定某个函数在规定的时间异步的执行,就像LIBC中的timer定时器,但是这里的定时器需要应用程序在主循环中周期调用rte_timer_manage来使定时器得到执行。定时器组件的时间参考来自EAL层提供的时间接口。

    除了以上六个核心组件外,DPDK还提供以下功能:

    1) 以太网轮询模式驱动(PMD)架构:把以太网驱动从内核移到应用层,采用同步轮询机制而不是内核态的异步中断机制来提高报文的接收和发送效率。

    2)报文转发算法支持:Hash 库和LPM库为报文转发算法提供支持。

    3) 网络协议定义和相关宏定义:基于FreeBSD IP协议栈的相关定义如:TCP、UDP、SCTP等协议头定义。

    4)报文QOS调度库:支持随机早检测、流量整形、严格优先级和加权随机循环优先级调度等相关QOS 功能。

    5)内核网络接口库(KNI):提供一种DPDK应用程序与内核协议栈的通信的方法、类似普通Linux的TUN/TAP接口,但比TUN/TAP接口效率高。每个物理网口可以虚拟出多个KNI接口。

    在这里插入图片描述

    3、KNI组件

    KNI是DPDK平台提供的用于将数据重入内核协议栈的一个组件,其目的是充分运用传统内核协议栈已实现的较稳定的协议处理功能。DPDK平台对数据包的处理绕过了内核协议栈,直接交给用户空间处理,而用户空间没有完善的协议处理栈,如果让开发人员在用户空间实现完整独立的协议栈,开发工作是非常复杂的,因此DPDK平台提供了KNI组件,开发人员可以在用户空间实现一些特殊的协议处理功能,再通过KNI重入内核协议栈功能将普通常见的协议交由传统内核协议栈处理。KNI通信机制如下:
    在这里插入图片描述
    KNI组件通过创建KNI虚拟接口设备,将数据包经过虚拟接口实现用户空间和内核协议栈间的通信。当网卡接收到数据包时,应用程序通过用户空间驱动将数据包获取到用户空间,KNI组件将需要数据包发送至KNI虚拟接口,由KNI虚拟接口交给内核协议栈处理,处理后若有响应报文,则再交给KNI虚拟接口返回给应用程序。其中发送数据包至内核协议栈以及接收内核协议栈回复的数据包,是由两个不同的逻辑核分别进行处理,不阻塞应用程序让内核协议栈发送数据包或从内核协议栈接收数据包的过程。

    KNI接口实际上是一个虚拟出来的设备,该虚拟设备定义了四个队列,分别是接收队列(rx_q)、发送队列(tx_q)、已分配内存块队列(alloc_q)、待释放内存块队列(free_q)。接收队列用于存放用户空间程序发往KNI虚拟设备的报文,发送队列用于存放内核协议栈要往KNI虚拟设备的报文。已分配内存块队列存放已向内存中申请的内存块,供内核协议栈发送报文时取出使用。待释放内存块队列用于记录KNI虚拟设备从用户空间程序处接收到报文后将不再使用的内存块,然后将该队列中的内存块释放回内存。用户空间程序从网卡接收到报文时,将报文发送给KNI虚拟设备,KNI虚拟设备接收到用户空间程序发来的报文后,交给内核协议栈进行协议解析。发送报文时,原始数据先由内核协议栈进行协议封装,然后将报文发送给KNI虚拟设备,KNI虚拟设备接收到报文后,再将报文发送给用户空间程序。
    在这里插入图片描述

    展开全文
  • https://wenku.baidu.com/view/327799bac281e53a5802ffcb.html
    展开全文
  • DPDK技术简介

    千次阅读 2021-10-11 19:59:10
    1. DPDK技术介绍 1) 简介 DPDK全称Intel Data Plane Development Kit,是intel提供的数据平面开发工具集,为Intel architecture(IA)处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持。通俗地说,...

    1. DPDK技术介绍

    1) 简介

    DPDK全称Intel Data Plane Development Kit,是intel提供的数据平面开发工具集,为Intel architecture(IA)处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持。通俗地说,就是一个用来进行包数据处理加速的软件库。

    DPDK不同于Linux系统以通用性设计为目的,而是专注于网络应用中数据包的高性能处理。具体体现在DPDK应用程序是运行在用户空间上利用自身提供的数据平面库来收发数据包,绕过了Linux内核协议栈对数据包处理过程。它不是一个用户可以直接建立应用程序的完整产品,不包含需要与控制层(包括内核和协议堆栈)进行交互的工具。

    相比原生 Linux(Native Linux),采用Intel DPDK技术后能够大幅提升IPV4的转发性能,可以让用户在迁移包处理应用时(从基于NPU的硬件迁移到基于Intel x86的平台上),获得更好的成本和性能优势。同时可以采用统一的平台部署不同的服务,如应用处理,控制处理和包处理服务。

    2) 技术优点

     通过UIO技术将报文拷贝到应用空间处理,规避不必要的内存拷贝和系统调用,便于快速迭代优化。

     通过大页内存HUGEPAGE,降低cache miss(访存开销),利用内存多通道交错访问提高内存访问有效带宽,即提高命中率,进而提高cpu访问速度。

     通过CPU亲和性,绑定网卡和线程到固定的core,减少cpu任务切换。特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中。

     通过无锁队列,减少资源竞争。cache行对齐,预取数据,多元数据批量操作。

     通过轮询可在包处理时避免中断上下文切换的开销。

    3) DPDK、网卡、用户应用程序、内核之间的关系

     PMD:Pool Mode Driver,轮询模式驱动,通过非中断,以及数据帧进出应用缓冲区内存的零拷贝机制,提高发送/接受数据帧的效率。

     流分类:Flow Classification,为N元组匹配和LPM(最长前缀匹配)提供优化的查找算法。

     环队列:Ring Queue,针对单个或多个数据包生产者、单个数据包消费者的出入队列提供无锁机制,有效减少系统开销。

     MBUF缓冲区管理:分配内存创建缓冲区,并通过建立MBUF对象,封装实际数据帧,供应用程序使用。

     EAL:Environment Abstract Layer,环境抽象(适配)层,PMD初始化、CPU内核和DPDK线程配置/绑定、设置HugePage大页内存等系统初始化。

    2. 源程序包组成1) Makefile &&CONFIG

    MakeFile文件主要位于位于 $(RTE_SDK)/mk 中。此处留在后面第5节进行讨论

    配置模板位于 $(RTE_SDK)/config。这些模板描述了为每个目标启用的选项。 配置文件许多可以为DPDK库启用或禁用的选项,包括调试选项。用户应该查看配置文件并熟悉这些选项。配置文件同样也用于创建头文件,创建的头文件将位于新生成的目录中。一般可以根据用户编译的编译器和操作系统来直接选择配置项。

    2) Lib库

    库文件源码位于目录$(RTE_SDK)/lib中。按照惯例,库指的是为应用程序提供API的任何代码。通常,它会生成一个(.a)文件,这个目录中可能也保存一些内核模块。

    Lib常用库文件包含以下内容

    lib

    +-- librte_cmdline # 命令行接口

    +-- librte_distributor # 报文分发器

    +-- librte_eal # 环境抽象层

    +-- librte_ether # PMD通用接口

    +-- librte_hash # 哈希库

    +-- librte_ip_frag # IP分片库

    +-- librte_kni # 内核NIC接口

    +-- librte_kvargs # 参数解析库

    +-- librte_lpm # 最长前缀匹配库

    +-- librte_mbuf # 报文及控制缓冲区操作库

    +-- librte_mempool # 内存池管理器

    +-- librte_meter # QoS metering 库

    +-- librte_net # IP相关的一些头部

    +-- librte_power # 电源管理库

    +-- librte_ring # 软件无锁环形缓冲区

    +-- librte_sched # QoS调度器和丢包器库

    +-- librte_timer # 定时器库

    3) 应用程序

    应用程序是包含 main() 函数的源文件。 他们位于 $(RTE_SDK)/app 和 $(RTE_SDK)/examples 目录中。

    常用示例文件:

    examples

    +-- cmdline # Example of using the cmdline library

    +-- exception_path # Sending packets to and from Linux TAP device

    +-- helloworld # Basic Hello World example

    +-- ip_reassembly # Example showing IP reassembly

    +-- ip_fragmentation # Example showing IPv4 fragmentation

    +-- ipv4_multicast # Example showing IPv4 multicast

    +-- kni # Kernel NIC Interface (KNI) example

    +-- l2fwd # L2 forwarding with and without SR-IOV

    +-- l3fwd # L3 forwarding example

    +-- l3fwd-power # L3 forwarding example with power management

    +-- l3fwd-vf # L3 forwarding example with SR-IOV

    +-- link_status_interrupt # Link status change interrupt example

    +-- load_balancer # Load balancing across multiple cores/sockets

    +-- multi_process # Example apps using multiple DPDK processes

    +-- qos_meter # QoS metering example

    +-- qos_sched # QoS scheduler and dropper example

    +-- timer # Example of using librte_timer library

    +-- vmdq_dcb # Example of VMDQ and DCB receiving

    +-- vmdq # Example of VMDQ receiving

    +-- vhost # Example of userspace vhost and switch

    3. DPDK架构分析

    4. Dpdk基础库介绍

    1) EAL 环境适配层

    环境抽象层为底层资源如硬件和内存空间的访问提供了接口。 这些通用的接口为APP和库隐藏了不同环境的特殊性。 EAL负责初始化及分配资源(内存、PCI设备、定时器、控制台等等)。

    典型函数:rte_eal_init

    抄自dpdk网站:

    EAL提供的典型服务有:

    • DPDK的加载和启动:DPDK和指定的程序链接成一个独立的进程,并以某种方式加载

    • CPU亲和性和分配处理:DPDK提供机制将执行单元绑定到特定的核上,就像创建一个执行程序一样。

    • 系统内存分配:EAL实现了不同区域内存的分配,例如为设备接口提供了物理内存。

    • PCI地址抽象:EAL提供了对PCI地址空间的访问接口

    • 跟踪调试功能:日志信息,堆栈打印、异常挂起等等。

    • 公用功能:提供了标准libc不提供的自旋锁、原子计数器等。

    • CPU特征辨识:用于决定CPU运行时的一些特殊功能,决定当前CPU支持的特性,以便编译对应的二进制文件。

    • 中断处理:提供接口用于向中断注册/解注册回掉函数。

    • 告警功能:提供接口用于设置/取消指定时间环境下运行的毁掉函数。

    2) Ring 库

    环形缓冲区支持队列管理。rte_ring并不是具有无限大小的链表,它具有如下属性:

    先进先出(FIFO)

    最大大小固定,指针存储在表中

    无锁实现

    多消费者或单消费者出队操作

    多生产者或单生产者入队操作

    批量出队 - 如果成功,将指定数量的元素出队,否则什么也不做

    批量入队 - 如果成功,将指定数量的元素入队,否则什么也不做

    突发出队 - 如果指定的数目出队失败,则将最大可用数目对象出队

    突发入队 - 如果指定的数目入队失败,则将最大可入队数目对象入队

    单生产者入队:

    单消费者出队

    3) Mempool 库

    DPDK提供了内存池机制,使得内存的管理的使用更加简单安全。在设计大的数据结构时,都可以使用mempool分配内存,同时,mempool也提供了内存的获取和释放等操作接口。对于数据包mempool甚至提供了更加详细的接口-rte_pktmbuf_pool_create()

     mempool的创建

    内存池的创建使用的接口是rte_mempool_create()。在仔细分析代码之前,先说明一下mempool的设计思路:在DPDK中,总体来说,mempool的组织是通过3个部分实现的

     mempool头结构。mempool由名字区分,挂接在struct rte_tailq_elem rte_mempool_tailq全局队列中,可以根据mempool的名字进行查找,使用rte_mempool_lookup()接口即可。这只是个mempool的指示结构,mempool分配的内存区并不在这里面,只是通过物理和虚拟地址指向实际的内存地址。

     mempool的实际空间。这就是通过内存分配出来的地址连续的空间,用来存储mempool的obj对象。主要利用rte_mempool_populate_default()进行创建

     ring队列。其作用就是存放mempool中的对象指针,提供了方便存取使用mempool的空间的办法。

     mempool的常见使用是获取元素空间和释放空间。

     rte_mempool_get可以获得池中的元素,其实就是从ring取出可用元素的地址。

     rte_mempool_put可以释放元素到池中。

     rte_mempool_in_use_count查看池中已经使用的元素个数

     rte_mempool_avail_count 查看池中可以使用的元素个数

    4) 定时器库

    定时器库为DPDK执行单元提供定时器服务,使得执行单元可以为异步操作执行回调函数。定时器库的特性如下:

    定时器可以周期执行,也可以执行一次。

    need-to-insert-img

    定时器可以在一个核心加载并在另一个核心执行。但是必须在调用rte_timer_reset()中指定它。

    定时器提供高精度(取决于检查本地核心的定时器到期的rte_timer_manage()的调用频率)。

    如果应用程序不需要,可以在编译时禁用定时器,并且程序中不调用rte_timer_manage()来提高性能。

    具体使用参考:http://blog.csdn.net/linzhaolover/article/details/9410529

    5. 库的编译(Makefile)及使用(API使用方案)

    need-to-insert-img

    makefile位于目录: /examples/xxx/Makefile。 文件中真正必须的为两个变量APP和SRCS-y,前者为示例程序编译生成的目标文件名称,后者为要编译的源文件。

    另外两个必须的为makefile文件rte.vars.mk和rte.extapp.mk。前者定义一些全局的编译打包链接用到的选项,如CFLAGS、ASFLAGS、LDFLAGS等变量,头文件位置和库路径等和体系架构相关编译选项。后者rte.extapp.mk内部又包含了重要的mk/rte.app.mk文件,首先变量LDLIBS初始化为DPDK核心编译生成的所有静态库文件。

    makefile编写

    在DPDK中,Makefiles的套路是

    1.在文件开头,包含$(RTE_SDK)/mk/rte.vars.mk

    2.设置RTE构建系统的变量,比如设置RTE_SDK和RTE_TARGET环境变量

    3.包含指定的 $(RTE_SDK)/mk/rte.XYZ.mk,其中XYZ 可以填写app, lib, extapp, extlib, obj,依赖构建的目标类型.

    3.1 应用程序类型(application)

    - rte.app.mk

    - rte.extapp.mk

    - rte.hostapp.mk

    3.2 库类型 (library)

    - rte.lib.mk

    - rte.extlib.mk

    - rte.hostlib.mk

    3.3 安装类型(install)

    rte.install.mk

    没有生成任何文件,仅仅用于创建链接和将文件拷贝到安装目录.

    3.4 内核模块(Kernel Module )

    rte.module.mk

    用于构建内核模块,在dpdk开发包框架中.

    3.5 Objects类型

    - rte.obj.mk

    - rte.extobj.mk

    3.6 Misc类型

    - rte.doc.mk

    - rte.gnuconfigure.mk

    - rte.subdir.mk

    4.包含用户自定义的规则和变量

    常用的变量

    系统构建变量

    RTE_SDK

    RTE_TARGET

    编译变量(库文件,库目录,C编译标志,C++编译标志)

    CFLAGS: C编译标志. 使用 += 为变量添加内容

    LDFLAGS: 链接标志

    need-to-insert-img

    CPPFLAGS: C++编译标志. 使用 += 为变量添加内容

    LDLIBS: 待添加的库文件的列表

    SRC-y: 源文件列表

    警告变量

    WERROR_CFLAGS:在dpdk示例makefile中是加上此标志的.

    CFLAGS += $(WERROR_CFLAGS)

    6. 性能优化1) 内存

     内存拷贝:不要在数据面程序中使用libc

    通过Linux应用程序环境,DPDK中可以使用许多libc函数。 这可以简化应用程序的移植和控制平面的开发。 但是,这些功能中有许多不是为了性能而设计的。 诸如memcpy() 或 strcpy() 之类的函数不应该在数据平面中使用。 要复制小型结构体,首选方法是编译器可以优化一个更简单的技术。

    对于经常调用的特定函数,提供一个自制的优化函数也是一个好主意,该函数应声明为静态内联。DPDK API提供了一个优化的rte_memcpy() 函数。

     内存申请

    need-to-insert-img

    libc的其他功能,如malloc(),提供了一种灵活的方式来分配和释放内存。 在某些情况下,使用动态分配是必要的,但是建议不要在数据层面使用类似malloc的函数,因为管理碎片堆可能代价高昂,并且分配器可能无法针对并行分配进行优化。

    如果您确实需要在数据平面中进行动态分配,最好使用固定大小对象的内存池。 这个API由librte_mempool提供。 这个数据结构提供了一些提高性能的服务,比如对象的内存对齐,对对象的无锁访问,NUMA感知,批量get/put和percore缓存。 rte_malloc() 函数对mempools使用类似的概念。

     内存区域的并发访问

    need-to-insert-img

    几个lcore对同一个内存区域进行的读写(RW)访问操作可能会产生大量的数据高速缓存未命中,这代价非常昂贵。 通常可以使用per-lcore变量来解决这类问题。例如,在统计的情况下。 至少有两个解决方案:

    使用 RTE_PER_LCORE 变量。注意,在这种情况下,处于lcore x的数据在lcore y上是无效的。

    使用一个表结构(每个lcore一个)。在这种情况下,每个结构都必须缓存对齐。

    如果在同一缓存行中没有RW变量,那么读取主要变量可以在不损失性能的情况下在内核之间共享。

     NUMA

    need-to-insert-img

    在NUMA系统上,由于远程内存访问速度较慢,所以最好访问本地内存。 在DPDK中,memzone,ring,rte_malloc和mempool API提供了在特定内存槽上创建内存池的方法。

    有时候,复制数据以优化速度可能是一个好主意。 对于经常访问的大多数读取变量,将它们保存在一个socket中应该不成问题,因为数据将存在于缓存中。

     跨存储器通道分配

    need-to-insert-img

    现代内存控制器具有许多内存通道,可以支持并行数据读写操作。 根据内存控制器及其配置,通道数量和内存在通道中的分布方式会有所不同。 每个通道都有带宽限制,这意味着如果所有的存储器访问都在同一通道上完成,则存在潜在的性能瓶颈。

    默认情况下, Mempool Library 分配对象在内存通道中的地址。

    2) lcore之间的通信

    need-to-insert-img

    为了在内核之间提供基于消息的通信,建议使用提供无锁环实现的DPDK ring API。

    该环支持批量访问和突发访问,这意味着只需要一次昂贵的原子操作即可从环中读取多个元素(请参阅 Ring 库 )。

    使用批量访问操作时,性能会大大提高。

    出队消息的代码算法可能类似于以下内容:

    #define MAX_BULK 32

    while (1) {

    /* Process as many elements as can be dequeued. */

    count = rte_ring_dequeue_burst(ring, obj_table, MAX_BULK, NULL);

    if (unlikely(count == 0))

    continue;

    my_process_bulk(obj_table, count);

    }

    3) PMD 驱动

    DPDK轮询模式驱动程序(PMD)也能够在批量/突发模式下工作,允许在发送或接收功能中对每个呼叫的一些代码进行分解。

    避免部分写入。 当PCI设备通过DMA写入系统存储器时,如果写入操作位于完全缓存行而不是部分写入操作,则其花费较少。 在PMD代码中,已采取了尽可能避免部分写入的措施。

     低报文延迟

    need-to-insert-img

    传统上,吞吐量和延迟之间有一个折衷。 可以调整应用程序以实现高吞吐量,但平均数据包的端到端延迟通常会因此而增加。 类似地,可以将应用程序调整为平均具有低端到端延迟,但代价是较低的吞吐量。

    为了实现更高的吞吐量,DPDK尝试通过突发处理数据包来合并单独处理每个数据包的成本。

    以testpmd应用程序为例,突发大小可以在命令行上设置为16(也是默认值)。 这允许应用程序一次从PMD请求16个数据包。 然后,testpmd应用程序立即尝试传输所有接收到的数据包,在这种情况下是全部16个数据包。

    在网络端口的相应的TX队列上更新尾指针之前,不发送分组。 当调整高吞吐量时,这种行为是可取的,因为对RX和TX队列的尾指针更新的成本可以分布在16个分组上, 有效地隐藏了写入PCIe 设备的相对较慢的MMIO成本。 但是,当调优为低延迟时,这不是很理想,因为接收到的第一个数据包也必须等待另外15个数据包才能被接收。 直到其他15个数据包也被处理完毕才能被发送,因为直到TX尾指针被更新,NIC才知道要发送数据包,直到所有的16个数据包都被处理完毕才被发送。

    为了始终如一地实现低延迟,即使在系统负载较重的情况下,应用程序开发人员也应避免处理数据包。 testpmd应用程序可以从命令行配置使用突发值1。 这将允许一次处理单个数据包,提供较低的延迟,但是增加了较低吞吐量的成本。

    4) 锁和原子操作

    need-to-insert-img

    原子操作意味着在指令之前有一个锁定前缀,导致处理器的LOCK#信号在执行下一条指令时被断言。 这对多核环境中的性能有很大的影响。

    可以通过避免数据平面中的锁定机制来提高性能。 它通常可以被其他解决方案所取代,比如percore变量。 而且,一些锁定技术比其他锁定技术更有效率。 例如,Read-Copy-Update(RCU)算法可以经常替换简单的rwlock

    7. 遇到的问题及解决方法

    https://www.xuebuyuan.com/1149388.html

    https://blog.csdn.net/hz5034/article/details/78811445



    链接:https://www.jianshu.com/p/86af81a10195
     

    展开全文
  • DPDK技术峰会,PPT讲稿分享 ,演讲者中兴通讯架构师,PPT名称:Network Performance Tuning, Lesson Learned – Fangliang Lou @ ZTE 该文档讨论了利用Intel和DPDK技术使无线工作负载达到明显性能提升的性能优化...
  • 但是基于硬件的劣势非常明显,发生Bug不易修复,不易调试维护,并且网络技术一直在发展,例如2G/3G/4G/5G等移动技术的革新,这些属于业务的逻辑基于硬件实现太痛苦,不能快速迭代。从前面的分析可以得知IO实现的方式...
  • 数据平面开发套件(DPDK[1],Data Plane Development Kit)是由6WIND,Intel等多家公司开发,主要基于Linux系统运行,用于快速数据包处理的函数库与驱动集合,可以极大提高数据处理性能和吞吐量,提高数据平面应用程序的...
  • 一、网络IO的处境和趋势从我们用户的使用就可以感受到网速一直在提升,而网络技术的发展也从1GE/10GE/25GE/40GE/100GE的演变,从中可以得出单机的网络IO...
  • DPDK技术介绍

    千次阅读 2021-10-11 20:35:39
    DPDK是INTEL公司开发的一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案,主要技术有用户态、轮询取代中断、零拷贝、网卡RSS、访存DirectIO等。 一、主要特点...
  • 收藏: 详解DPDK技术知识点

    千次阅读 2019-07-06 00:00:00
    导读:随着芯片和高速网络接口技术的快速发展,IO超越CPU的运行速率,为此DPDK应运而生。通过环境抽象层旁路内核协议栈、轮询模式的报文无中断收发、优化内存、队列管理、基...
  • DPDK是INTEL公司开发的一款高性能的网络驱动组件,旨在为数据面应用程序提供一个简单方便的,完整的,快速的数据包处理解决方案,主要技术有用户态、轮询取代中断、零拷贝、网卡RSS、访存DirectIO等。 一、主要特点...
  • 详解DPDK技术知识点

    2022-08-09 14:09:57
    2.1概念和术语 42.2 DPDK架构介绍 62.3 大页技术 92.4 轮询技术 92.5 CPU亲和技术 92.6 DPDK的应用模型 10。
  • DPDK技术峰会讲稿分享,DPDK开发者大会讲稿分享,DPDK Accelerated Load Balancer 演讲者Lei CHEN @ IQIYI.com, DPVS: open source HIGH PERFORMANCE l4 Load balancer BASED ON DPDK DPVS是基于DPDK的高性能四层...

空空如也

空空如也

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

dpdk技术