Kernel Bypass & DPDK

1、Kernel Bypass简介

kernel bypassing是用来做low latency 中的一项常见解决方案,往往在高速科学计算、低延迟交易设备常中用到。

Kernel Bypass(内核旁路)是一种绕过Linux内核(TCPIP协议栈)的技术,不使用Linux内核子系统的功能,采用自己实现的相同功能的代码来处理,从用户空间直接访问和控制设备内存,避免数据从设备拷贝到内核,再从内核拷贝到用户空间。
Kernel Bypass目前主流实现方案如DPDK、SolarFlare。

2、Kernel Bypass优点

Kernel Bypass技术本身为高性能低延迟而设计,因此最大优点是高性能、低延迟。

3、Kernel Bypass缺点

Kernel Bypass技术的缺点如下:
(1)改变了现有操作系统的工作方式,很难与现有操作系统集成。
(2)由于网络数据不经过内核网络协议栈,相关网络应用程序需要重新实现由操作系统提供的功能。
(3)由于操作系统没有相关网络硬件的控制权,操作系统提供的网络管理部署工具不再可用。
(4)破坏了操作系统内核提供的安全性。在容器场景中,资源的抽象和隔离主要由操作系统内核提供。
(5)需要消耗1个或者多个CPU核来专门处理网络包。

DPDK简介

DPDK(Data Plane Development Kit)是Intel提供的数据平面开发工具集,为Intel Architecture处理器架构下用户空间高效的数据包处理提供库函数和驱动的支持,专注于网络应用中数据包的高性能处理。
DPDK应用程序是运行在用户空间上利用自身提供的数据平面库来收发数据包,绕过Linux内核协议栈对数据包处理过程。Linux内核将DPDK应用程序看作是一个普通的用户态进程,包括编译、链接、加载方式和普通程序一样。DPDK程序启动后只能有一个主线程,然后创建一些子线程并绑定到指定CPU核心上运行。
DPDK(Data Plane Development Kit)是一个开源的、快速处理数据平面数据包转发的开发平台及接口,支持X86、ARM、Power PC硬件平台。
Intel在2010年启动了对DPDK技术的开源化进程,2010年9月通过BSD开源许可协议正式发布源代码软件包,并于2014年4月在www.dpdk.org上正式成立了独立的开源社区平台,为开发者提供支持。
DPDK提供了一个用户态的高效数据包处理库,通过环境抽象层、内核旁路协议栈、轮询模式的报文无中断收发、优化内存/缓冲区/队列管理、基于网卡多队列和流识别的负载均衡等多项技术,实现了在 x86处理器架构下的高性能报文转发能力,用户可以在Linux用户态开发各类高速转发应用,也适合与各类商业化的数据平面加速解决方案进行集成。
DPDK重载了网卡驱动,将数据包的控制平面和数据平面分离,驱动在收到数据包后不再硬中断通知CPU,而是让数据包通过内核旁路协议栈绕过Linux内核协议栈,并通过零拷贝技术存入内存,应用层的程序可以通过DPDK提供的接口读取数据包。
DPDK数据包处理方式节省了CPU中断时间、内存拷贝时间,并向应用层提供了简单易行且高效的数据包处理接口函数,使得网络应用的开发更加方便。但由于需要重载网卡驱动,因此DPDK目前只能用在部分采用Intel网络处理芯片的网卡设备中。DPDK 支持的网卡列表:https://core.dpdk.org/supported/,主流使用 Intel 82599(光口)和 Intel x540(电口)。DPDK 可以将数据包处理性能最多提高十倍。在单个英特尔至强处理器上获得超过 80 Mbps 的吞吐量,在双处理器配置中则可将该其提高一倍。

Linux性能优化(九)——Kernel Bypass

 

DPDK原理

Linux性能优化(九)——Kernel Bypass

DPDK架构

Linux性能优化(九)——Kernel Bypass


在Linux Kernel中,DPDK有KNI与IGB_UIO两个模块,在用户态由多个DPDK库组成,主要包括核心部件库(Core Libraries)、平台相关模块(Platform)、网卡轮询模式驱动模块(PMD-Natives&Virtual)、QoS库、报文转发分类算法(Classify)等,用户可以使用DPDK库开发应用程序。

UIO

传统的收发数据包方式,首先网卡通过中断方式通知Linux内核协议栈对数据包进行处理,内核协议栈先会对数据包进行合法性进行必要的校验,然后判断数据包目标是否为本机的Socket,满足条件则会将数据包拷贝一份向上递交到用户态Socket来处理。
为了使得网卡驱动(PMD Driver)运行在用户态,实现内核旁路,Linux提供了UIO(User Space IO)机制。使用UIO可以通过 read感知中断,通过 mmap实现和网卡设备的通讯。
UIO是用户态的一种IO技术,是DPDK能够绕过内核协议栈,提供用户态PMD Driver支持的基础。DPDK架构在Linux内核中安装了IGB_UIO(igb_uio.ko和kni.ko.IGB_UIO)模块,以此借助UIO 技术来截获中断,并重设中断回调行为,从而绕过内核协议栈后续处理流程,并且IGB_UIO会在内核初始化的过程中将网卡硬件寄存器映射到用户态。
UIO实现机制是对用户态暴露文件接口。当注册一个UIO设备uioX 时,就会出现系统文件/dev/uioX,对UIO设备文件的读写就是对网卡设备内存的读写。

 

DPDK特点

(1)轮询:在包处理时避免中断上下文切换的开销,
(2)用户态驱动:规避不必要的内存拷贝和系统调用,便于快速迭代优化
(3)亲和性与独占:特定任务可以被指定只在某个核上工作,避免线程在不同核间频繁切换,保证更多的cache命中
(4)降低访存开销:利用内存大页HUGEPAGE降低TLB miss,利用内存多通道交错访问提高内存访问有效带宽
(5)软件调优:cache行对齐,预取数据,多元数据批量操作

Guess you like

Origin blog.csdn.net/weixin_44260459/article/details/120922200