DPDK应用基础
SDN:软件定义网络,将网络的控制平面(control plane)和数据平面(data plane)分离,并使用集中式的控制器来管理和编程网络,以提供更高的灵活性、可编程性和自动化。
- 控制平面:负责网络的决策和策略制定
- 数据平面:负责实际的数据包转发
NFV:网络功能虚拟化,将网络功能以软件的形式虚拟化,在通用的虚拟化平台上运行。
VNF:虚拟网络功能,传统网络中的特定功能(如防火墙、路由器、负载均衡器等)以虚拟化的方式运行在通用的硬件设备上的网络功能实例。
Hypervisor:虚拟化层,用中间抽象层屏蔽物理资源的差异,并将物理硬件分片为虚拟硬件资源。
传统的网络功能通常由专用的硬件设备执行,每个网络功能都需要独立的物理设备进行部署和管理。而VNF技术将这些网络功能以软件的形式虚拟化,并在通用的硬件平台上运行,实现了网络功能的解耦和集中管理。
网卡等外设的驱动程序与操作系统连接,并将数据收入内存的过程,对I/O性能有重大影响,DMA机制可以保证外设直接访问系统内存而无需CPU参与底层报文的转发,但是普通网卡驱动程序中,DMA对每个报文处理完毕后依然产生一个中断送达CPU,这会造成严重的CPU阻塞。解决方法:
- 中断唤醒数据接受的应用程序,然后采用的POLL轮询方式,(NAPI),不用EPOLL是因为EPOLL只支持Linux,而POLL是Posix标准的一部分,支持多个操作系统。
- I/O报文直接访问CPU内部缓存
- 采用UIO技术,用户态进程直接读写网卡缓冲区,减少报文处理时的内核系统调用。通过内核mmap功能将内核空间映射到用户空间,用户通过标准的读写操作对网卡缓冲的零复制收发。
DPDK软件架构:
内核态有两个模块:KNI和IGB_UIO,KNI为用户提供使用Linux内核的协议栈以及传统的网络工具,IGB_UIO在初始化过程中将网卡硬件寄存器映射到用户态。
DPDK的上层用户态库主要包括核心部件库、平台相关算法、网卡轮询模式驱动模块、QoS库、报文转发分类算法等几大类。
- 核心部件库:通过环境抽象层(EAL)的运行环境进行初始化,包括巨页内存分配、内存/缓冲区/队列分配与无锁操作、CPU亲和力绑定等;此外,实现了对内核和网卡I/O的屏蔽,将PCI设备地址映射到用户空间,方便用户的调用。此外核心部件还包括报文处理的内存池、缓冲区分配管理、内存复制、定时器、环形缓冲区管理等。
- 平台相关模块:KNI通过kni.ko将用户态传递给内核态协议栈处理,以便用户进程使用传统的Socket接口对相关报文进行处理;能耗管理提供了一些API,应用程序可以分组接受速率调整处理器频率,IVSHMEM提供了虚拟机之间或虚拟机和主机间的零复制共享内存机制,其会调用核心部件库API,将巨页映射为一个IVSHMEM设备池。
- 轮询模式驱动模块:PMD相关API实现了在轮询方式下进行网卡报文收发,避免了常规报文处理方法中因为中断方式造成的相应时延,提升了网卡的收发性能。
巨页技术
内存管理的两个概念:物理内存和虚拟内存。物理内存按照帧进行管理,虚拟内存按照页进行管理。内存管理单元(MMU)完成虚拟内存到物理内存地址的转换。转换过程需要查找页表(Page Table),为了提高页表查找效率,CPU实现了一块缓存TLB(Translation Lookaside Buffer)来保存查找结果。
巨页技术:一个TLB表可以支持更大的页表尺寸,(默认是4Kb),这样可以减少TLB Miss的场景,此外因为预读技术,相邻的内存页会预读到CPU缓存区中,这样可以减少内存访问的延时。
DPDK采用巨页技术,所有的内存都是在巨页里分配,实现了对内存池(Mempool)的管理。
轮询技术
DPDK网卡收到报文后,直接将报文保存到处理器缓存中(有DDIO(Direct Data I/O))技术时,或者内存中(没有DDIO),并设置报文到达的标志位,然后应用程序周期性轮询报文到达的标志位;
CPU亲和技术
将一个线程固定在一个核或者多个核上运行,可以消除切换带来的额外开销和缓存数据失效的开销
硬件对DPDK的性能的影响
- CPU频率:CPU频率越高,DPDK性能越高
- LLC(最后检测缓存)大小:缓存越大,DPDK性能越高,LLC被多个处理器核心共享,存储频繁使用的数据,以提高数据的访问速度和系统性能。
- PCIe:计算机总线标准,用于高速数据传输和设备间通信,用于连接计算机主机和各种外设。需要确保其带宽可以满足所插网卡的带宽。
- NUMA:非统一内存访问,系统中的内存被划分为多个区域(通常称为节点),每个节点与特定的处理器核心或一组核心相连。每个节点有自己的本地内存,并且可以访问其他节点的远程内存。由于不同节点之间的内存访问延迟可能不同,称为非均匀访问。NUMA架构通过将内存和处理器核心尽可能地靠近彼此,以减少内存访问的延迟,并提高系统的性能。