目录
1.什么是dpdk
DPDK(Data Plane Development Kit)是一个开源的高速数据包处理框架,专为高性能网络应用设计。它提供了一组用于处理数据包的库,旨在提高网络设备与处理器之间的数据传输速度,减少延迟,并且使得处理网络数据更加高效。
2.dpdk的优势
2.1.传统协议栈交互模型
首先,我们需要了解网络分层模型。OSI 模型中将网络划分为七层,从下到上依次为:物理层(Physical)、数据链路层(Date Link)、网络层(Network)、传输层(Transport)、会话层(Session)、表示层(Presentation)和应用层(Application)。目前实际广泛使用的 TCP/IP 协议框架体系内,我们一般将网络划分为五层,从下到上依次为:物理层、数据链路层、网络层、传输层和应用层,下层协议对上层协议透明,即上层协议无需关注下层协议的实现逻辑和机制。
Linux内核网络协议栈涉及其中三层,分别为数据链路层、网络层和传输层,不涉及物理层,应用层的任务也是由用户空间程序来实现的。Linux内核网络协议栈的任务:
1、接收数据包时:Linux内核网络协议栈将接收到的数据包从网络设备驱动程序传递给网络层(通常为IPv4或IPv6)。接下来,如果数据包目的地为当前设备,Linux内核网络协议栈就将其传递给传输层(应用TCP或UDP协议侦听套接字);如果数据包需要转发,就将其交还给数据链路层进行传输。
2、发送数据包时:Linux内核网络协议栈将本地生成的出站数据包,从传输层依次传递给网络层和数据链路层,再由网络设备驱动程序进行传输。
2.2.dpdk交互模型
由于包处理任务存在内核态与用户态的切换,以及多次的内存拷贝,系统消耗变大,以CPU为核心的系统存在很大的处理瓶颈。为了提升数据包处理效能,Intel推出了服务于IA(Intel Architecture)系统的DPDK技术。
DPDK是Data Plane Development Kit的缩写。简单说,DPDK应用程序运行在操作系统的User Space,利用自身提供的数据面库进行收发包处理,绕过了Linux内核态协议栈,以提升报文处理效率。
DPDK 能够绕过内核协议栈,本质上是得益于 UIO 技术,通过 UIO 能够拦截中断,并重设中断回调行为,从而绕过内核协议栈后续的处理流程。UIO 设备的实现机制其实是对用户空间暴露文件接口,比如当注册一个 UIO 设备 uioX,就会出现文件 /dev/uioX,对该文件的读写就是对设备内存的读写。除此之外,对设备的控制还可以通过 /sys/class/uio 下的各个文件的读写来完成,实际上就是将网卡设备暴露在用户态,网卡通过UIO进行内存映射,使得DPDK应用可以直接访问网卡的内存区域,绕过内核协议栈进行数据包的处理。通过这种方式,DPDK可以在用户空间快速处理大量的网络数据包。
3.dpdk基本原理
DPDK采用了轮询或者轮询混杂中断的模式来进行收包和发包,此前主流运行在操作系统内核态的网卡驱动程序基本都是基于异步中断处理模式。
1、异步中断模式
当有包进入网卡收包队列后,网卡会产生硬件 (MSIX/MSI/INTX)中断,进而触发CPU中断,进入中断服务程序,在