【协议森林】DPDK原理及使用(三)

1.简述

利用DPDK来优化网络驱动,通过无锁硬件访问技术加速报文处理,例如Intel网卡的Flow Director技术将指定的TCP流导入到特定的硬件队列,针对每个Connection(连接)分配不同的TX/RX队列。
在这里插入图片描述
其次,在Socket协议层,我们可以利用DPDK去除共享数据结构的内核锁,降低内核驱动的延时和上下文切换,加速数据处理,从而实现高效的用户态网络协议栈。当然,即使有了用户态网络栈的支持,从程序开发的角度来讲,我们还必须保持这个用户网络栈和内核态网络栈接口的兼容性。理想情况下,所有上层应用程序可以不修改已有的代码,就无缝地迁移到用户态的软件栈,这样对于软件开发的影响可以降低到最小。
另外,使用DPDK技术实现用户态下的存储设备驱动,最大限度地减少内存拷贝和延时,提高数据吞吐量。

2.框架

在这里插入图片描述
在最底部的内核态(Linux Kernel)DPDK有两个模块:KNI与IGB_UIO

  • KNI提供给用户一个使用Linux内核态的协议栈以及传统的Linux网络工具(如ethtool、ifconfig)。
  • IGB_UIO(igb_uio.ko和kni.ko. IGB_UIO)则借助了UIO技术,在初始化过程中将网卡硬件寄存器映射到用户态。

DPDK的上层用户态由很多库组成,主要包括以下几部分,用户应用程序可以使用这些库进行二次开发。

  • 核心部件库(coreLibraries)
  • 平台相关模块(platform)
  • 网卡轮询模式驱动模块(PMD-natives & virtual)
  • QoS库
  • 报文转发分类算法(classify算法)

2.1核心部件库

该模块构成的运行环境建立在Linux上,通过环境抽象层(EAL)的运行环境进行初始化,包括巨页内存分配、内存/缓冲区/队列分配与无锁操作、CPU亲和性绑定等;其次,EAL实现了对操作系统内核与底层网卡I/O操作的屏蔽(I/O旁路了内核及其协议栈),为DPDK应用程序提供了一组调用接口,通过UIO或VFIO技术将PCI设备地址映射到用户空间,方便了应用程序的调用,避免了网络协议栈和内核切换造成的处理时延。另外,核心部件还包括创建适合报文处理的内存池、缓冲区分配管理、内存复制、定时器、环型缓冲区管理等。

2.2平台相关模块

其内部模块主要包括KNI、能耗管理以及IVSHMEM接口。其中,KNI模块主要通过kni.ko模块将数据报文从用户态传递给内核态协议栈处理,以便用户进程使用传统的Socket接口对相关报文进行处理;能耗管理则提供了一些API,应用程序可以根据分组接收速率动态调整处理器频率或进入处理器的不同休眠状态;另外,IVSHMEM模块提供了虚拟机与虚拟机之间,或者虚拟机与主机之间的零复制共享内存机制,当DPDK程序运行时,IVSHMEM模块会调用核心部件库API,把几个巨页映射为一个IVSHMEM设备池,并通过参数传递给QEMU,这样,就实现了虚拟机之间的零复制内存共享。

2.3轮询模式驱动模块

PMD相关API实现了在轮询方式下进行网卡报文收发,避免了常规报文处理方法中因采用中断方式造成的响应时延,极大提升了网卡收发性能。此外,该模块还同时支持物理和虚拟化两种网络接口,从仅仅支持Intel网卡,发展到支持Cisco、Broadcom、Mellanox、Chelsio等整个行业生态系统以及基于KVM、VMware、XEN等虚拟化网络接口。DPDK还定义了大量API来抽象数据平面的转发应用,如ACL、QoS、流分类和负载均衡等。并且,除以太网接口外,DPDK还在定义用于加/解密的软硬件加速接口(extension)。

3. 架构图

在这里插入图片描述

4.加入讨论

在这里插入图片描述


版权声明:本文为u012503639原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。