1 ---> DPDK 实现原理解析 (快速入门简介)

内核协议栈的数据转发性能瓶颈。
在X86 体系结构中,接收数据包的传统方式是CPU 中断方式,即网卡驱动接收到数据包后通过中断通知CPU处理,然后由CPU 拷贝数据并交给内核协议栈。在数据量大时,这种方式会产生大量 CPU 中断,导致 CPU 无法运行其他程序。

Linux 内核协议栈的数据接收流程:
在这里插入图片描述详细的转发流程请参考下列文章;
https://blog.csdn.net/weixin_38387929/article/details/113812682

内核协议栈的数据转发性能瓶颈:
1). 硬件中断导致的线程/进程切换:硬件中断请求会抢占优先级低的软件中断,频繁到达的硬件中断和软件中断意味着频繁的线程切换,随着而来的就是运行模式切换,上下文切换。线程调度器负载、高速缓存缺失、多核缓存共享数据同步、竞争锁等一系列的cpu性能损耗。
2). 内存拷贝:网卡驱动位于内核态,网络驱动接收到的数据包后会经过内核协议栈的处理,然后在拷贝到用户态的应用层缓冲区,这样的数据拷贝是很耗时的操作,据统计,拷贝的实践会占据数据包处理流程的57%。
3).多处理器平台的CPU漂移:一个数据包肯尼中断在cpu0,内核态处理在cpu1,用户态处理在cpu2,这样跨多个物理核的处理,导致大量的cpu Cache Miss,造成局部性失效,如果是NUMA架构,还会出现跨NUMA remote access Memory 的情况,这些都影响cpu的性能。
4). 缓存失效:传统服务器大多采用页式虚拟存储器,内存页默认为4K的小页,所以在存储空格键较大的处理机会存在大量的页面映射条目,同时因为TLB缓存有限,最终导致 TLB 快表的映射条目频繁变更,产生大量的快页表 Cache Miss。

故此,对应的优化方案:
(1). 使用 NUMA 亲和,避免 CPU 跨 NUMA 访问内存。
(2). 使用 CPU 绑定,避免款 cpu 的线程/进程切换。
(3). 使用大页缓存,避免 TLB Cache Miss。
(4). 使用内核旁路技术,避免频繁的硬件中断和软件中断。

在此背景下,DPDK (Data Plane Development Kit 数据平面开发套件)完全内核旁路技术产生,DPDK是一个开源的、快速处理数据拼命数据包转发的开发平台及接口,运行于intel x86 、ARM 和PowerPC架构上。

英特尔在2010年启动对DPDK技术的开园后进程,于当年9月份通过BSD开源许可协议正式发布开源代码软件包,并于2014年在 www.dpdk.org 上正式成立独立的开源社区平台,为开发者提供支持。开源设计的参与者们大幅推进 DPDK 的技术创新和快速演进,而今它已经发展成为 SDN 和 NFV 的一项关键技术。

DPDK 提供了一个用户态的高效数据包处理库函数,它通过环境抽象层、内核旁路协议栈、轮询模式的报文无中断收发、优化内存/缓冲区/队列管理、基于网卡队列和流识别的负载均衡等多项技术,实现在x86 处理器架构下的高性能报文转发能力,用户可以在Linux用户态开发各类高速转发应用,也适合于各类商业化的数据平面加速解决方案进行集成。简而言之,DPDK 重载网卡驱动,将数据包的控制平面和数据平面分离,驱动在接收到数据包后不再硬中断通知cpu,而是让数据包通过内核旁路的协议栈绕过 Linux 协议栈,并通过零拷贝技术存入内存,这时应用层的程序就可以通过 DPDK 提供的接口读取数据包。

DPDK 数据包处理流程:
在这里插入图片描述
这种处理方式节省了 cpu 中断处理时间、内存拷贝时间,并向应用层提供简单易行且高效的数据包处理接口函数,使得网络应用的开发更加方便。但由于需要重载网卡驱动,因此开发包目前只能应用子采用 intel 网络处理芯片的网卡设备中, DPDK 支持网卡列表: https://core.dpdk.org/supported/ ,主流使用Intel 82599 光口 和 intel x540 电口 。 DPDK 可以将数据包处理性能最多提高十倍,在单个英特尔至强处理器上获得超过你 80 Mbps 的吞吐量,在双处理器配置中则可将该其提高一倍。

DPDK 数据接收与Linux协议栈接收流的对比

在这里插入图片描述
左侧 Linux 内核协议栈: 网卡 -> 驱动 -> 协议栈 -> Socket 库 -> 网络应用。
右侧 基于 UIO的内核旁路 DPDK :网卡 -> DPDK 轮询 -> DPDK PMD 库 -> 网络应用。

注: 支持DPDK 的NIC Kernel Driver 可以转换为 UIO Driver 模式,因此 DPDK 是可以在虚拟机上使用的,只要虚拟机的网卡驱动支持DPDK PMD 模式,如:e1000 。

DPDK 实现原理 ( UIO Framework )
Linux 协议栈的收发数据包方式,首先网卡通过中断方式通知内核协议栈对数据包进行处理,内核协议栈会对数据包进行合法性检查,然后判断数据包目标是否为本机的 Socket, 满足条件则会将数据包拷贝一份向上提交到用户态 Socket 来处理,不仅处理路径冗长,还需要从内核到应用层的一次拷贝过程。
为了使得网卡驱动 运行在用户态,实现内核旁路。Linux 提供 UIO 机制,使用 UIO 可以通过 read() 感知中断,通过 mmap() 实现和网卡设备的通讯。

简单来说, UIO 是用户态的一种 I/O 技术,DPDK 能够绕过内核协议栈,提供用户态 PMD Driver 的支持,根本上是得益于 UIO 技术。DPDK 架构在 Linux 内核中安装了 IGB_UIO (igb_uio.ko 和 kni.ko.IGB_UIO)模块, 以此借助 UIO 技术截获中断, 并重设 中断回调行为, 从而绕过内核协议栈后续的处理流程,并且 IGB_UIO 会在内核初始化的过程中、将网卡硬件寄存器映射到用户态。

UIO 实现机制:
对用户态暴露文件接口,当注册一个UIO 设备 uioX 时,就会出现系统文件 /dev/uioX, 对该文件的读写技术对网卡设备内存的读写,除此之外,对网卡设备的控制还可以通过 /sys/class/uio 下的各个文件的读写来完成。

UIO Framework 如下图:
在这里插入图片描述DPDK 还在用户态实现了一套精巧的内存池技术,内核态和用户态直接的内存交换不需要进行拷贝操作,只做控制权转移,这样,当收发数据包时,就减少内存拷贝的开销。

DPDK UIO 实现主要分为内核态(igb_uio) 和 用户态 (PMD) 两个部分,用户态部分实现真正的数据转发业务处理,内核态部分主要时接管硬件资源提供给用户态使用。
在这里插入图片描述
UIO Framework 的框架划分为四层:
(1) 用户层
(2) 接口层
(3) 内核层
(4) 硬件层

网卡 e1000 开始是与对应的驱动绑定,当用户层程序执行解绑以及绑定命令后;通过 sysfs 将信息发送至内核层后, 网卡与igb_uio驱动进行绑定, 此时内核层 igb_uio 接管网卡,并为用户层 PMD 提供服务接口。

请参考 DPDK 系列之 DPDK 技术框架解析文章,进一步了解技术实现细节。

参考链接:
http://core.dpdk.org/doc/
http://doc.dpdk.org/guides/prog_guide/poll_mode_drv.html#poll-mode-driver-api
https://is-cloud.blog.csdn.net/article/details/98944634

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值