目录
一、DPDK与FPGA的关系及在数据包处理中的使用
DPDK与FPGA分别作为软件平台和硬件平台的倚天屠龙,二者一旦双剑合璧,在通信数据包处理方面可谓是天下无敌。
在节约成本和功耗的驱动下,我们希望数据包的底层处理可以转移到硬件上如FPGA。简单的交换机、防火墙、基本的负载平衡或路由功能可能不需要CPU编程和灵活性。但是,对于更复杂的L4-7功能,DPDK在有效地将数据包发送到用户空间以使应用程序执行更深入的分析中发挥关键的作用。例如,任何类型涉及L7代理中的HTTP标头检查和注入或有效负载处理时,都会更加倾向于使用DPDK。
二、基于FPGA&DPDK的收发包具体流程
当硬件结构较为简单时(指没有使用过多的硬件优化方案,如有的设计会在FPGA中加入负载均衡和多种FIFO模块来使服务器CPU各个核对数据包处理的业务分配更合理均衡从而提升性能),收发包大致流程如图所示。
2.1 收数据流程
- 高速光口接收数据包,通过物理层解析后,数据流以标准XGMII接口形式输出至FPGA内部的解析处理模块。
- 解析处理模块进行数据链路层解析,输出以太帧数据流及控制信号至FIFO缓存模块。
- FIFO中的数据通过AXI总线写入DDR。
(FPGA自带RAM存储空间很小,大数据量缓存需求要通过片外大容量DDR实现) - DMA模块将数据以DMA方式通过PCIE接口从DDR传输到服务器内存。
- 服务器通过DPDK驱动收取数据包,驱动会解析服务器内存中的数据包,并将数据包封装至DPDK的Mbuf数据结构中。
(DPDK将内存封装在Mbuf结构体内,Mbuf主要用来封装网络帧缓存,应用使用Mbuf结构来传输网络帧) - DPDK应用通过轮询获取Mbuf中的数据包,再进行后续处理。
(应用层通过while死循环,轮询调用rte_eth_rx_burst接口,从Mbuf软件接收空间中获取报文)
2.2 发数据流程
与接收数据包的过程大致相反,通过DPDK驱动将待转发的Mbuf中的数据包拷贝到指定服务器转发内存,整合成大块数据后以DMA方式通过PCIE总线发至FPGA硬件缓存区再经过光口往外发送。
三 基于FPGA的DPDK驱动模块要求
3.1 驱动需求背景
在网络流量分析、网络数据安全等领域,对网络数据采集速率的要求越来越高。从10Gb/s到100Gb/s,再到超过100Gb/s,为了适应越来越高的带宽,网络数据的采集速率不断提高,各种高速数据采集的软硬件方法也不断涌现。
DPDK是一组快速处理数据包的开发平台及接口,运行于Intel X86与arm平台上。DPDK采用了轮询方式来实现数据包处理过程,这种处理方式向应用层提供了简单易行且高效的数据包处理方式,使得网络应用的开发更加方便。因此,在高速数据包处理方面,越来越多的开发者选择使用DPDK来进行网络数据的采集和处理。
使用FPGA进行数据包处理具有许多优点,例如处理速度更快、延迟较低等。因而FPGA成为了高速数据包处理的主流平台之一。FPGA通过光口收取数据包,再通过PCIe接口连接到服务器,服务器对收取的数据包进行其它具体的复杂操作。要实现这些操作,需要通过定制基于FPGA的DPDK的相关驱动来实现。
3.2 DPDK自带的驱动层
DPDK驱动层运行在Linux操作系统的用户态,利用自身提供的数据面库进行收发包处理,绕过了Linux内核态协议栈,以提升报文的处理效率。DPDK驱动层是一组lib库和工具包的集合,主要组件包括:
PMD驱动模块(Pool Mode Driver,轮询模式驱动):通过非中断,以及数据帧进出应用缓冲区内存的零拷贝机制,提高发送/接受数据帧的效率;
流分类处理模块(Flow Classification):为N元组匹配和LPM(最长前缀匹配)提供优化的查找算法;
无锁环队列模块(Ring Queue):针对单个或多个数据包生产者、单个数据包消费者的出入队列提供无锁机制,有效减少系统开销;
MBUF缓冲区管理模块:分配内存创建缓冲区,并通过建立MBUF对象,封装实际数据帧,供应用程序使用;
环境抽象层(Environment Abstract Layer):用于PMD初始化、CPU内核和DPDK线程配置/绑定、设置Huge Page大页内存等系统初始化。
但是,上述驱动层模块功能偏通用性且仅提供相应功能的API接口,当系统中涉及专用模块如FPGA,需要定制基于FPGA的DPDK驱动模块,从而实现API接口的调用和其它驱动功能。
3.3 DPDK&FPGA驱动基本功能需求
- FPGA驱动绑定
用于实现FPGA加速卡与DPDK的绑定。 一般包括:
向DPDK驱动链表注册本驱动系统;
向DPDK的设备链表注册FPGA加速卡的设备类型号。 - FPGA设备配置初始化和管理
对FPGA进行初始化,获取FPGA信息以及对FPGA进行配置和管理。 - 数据包收取
在对FPGA加速卡进行配置和初始化后,可以通过调用驱动中接收数据包的函数接口来实现收包功能,主要功能为:解析服务器接收内存中的数据包,提取时间戳和包长信息,并封装到DPDK的Mbuf数据结构中。 - 数据包发送
对Mbuf数据结构中待发送的数据包按照预定格式进行封装,添加包头信息后拷贝至服务器的发送内存,整合成大块数据后通过DMA传输到FPGA的DDR中。
3.4 DPDK&FPGA驱动附加功能需求
- DMA动态调整
根据网络流量动态调整DMA传输数据块的大小,将FPGA加速卡的DDR中的数据包以DMA方式传输至服务器的接收内存中,具体要求包括:
监测FPGA加速卡光口的网络流量,动态调整DMA传输数据块的大小;
监测DDR的写指针和读指针,计算待传输的数据大小(DDR和服务器内存均采用环形buffer结构,包括写指针和读指针);
监测服务器接收内存的写指针和读指针,计算可写空间的大小;
当待传输的数据大小和可写空间的大小均满足一次传输的条件时,将FPGA加速卡的DDR中的数据包以DMA方式传输至服务器的接收内存中。 - 发包DMA超时补包
由于FPGA板卡的AXI4总线带宽设定为512位,为避免数据包在板卡中的滞留产生丢包问题,在转发部分的DMA模块添加超时补包机制,当一定时间内没有数据传输,且剩余在内存中的数据不足512位时,对其进行补包操作。
即在数据传输中高速率时以大数据块为单位进行处理,低速率时采用超时补包机制,并可根据实际网络流量动态调整数据块大小。
采用超时补包机制将服务器的发送内存中的数据包以DMA方式传输至FPGA加速卡的DDR中;具体为:
当服务器发送内存中待发送的数据大小达到DMA一次传输的大小时,以DMA方式传输至FPGA加速卡的DDR中;
当服务器发送内存中待发送的数据滞留时间超过阈值时,进行补包处理,填充到可发送的DMA一次传输的大小后,发送至FPGA加速卡的DDR中。 - 获取FPGA和用户态TCP/IP协议栈的实时统计信息
及时获取相关统计信息。
3.5 对FPGA的要求
- 定制的FPGA要能适配DPDK
DPDK对硬件的厂商、型号和版本均有要求点击查询官方支持,不是所有硬件都能适配,定制的FPGA要能适配DPDK。 - FPGA中FIFO的容量大小设置合理
FIFO是重要的缓存和高低速率匹配模块,在性能允许的范围内尽量设计大一些,FIFO过小影响性能,过高则过分占用FPGA的资源,需综合FPGA业务配置决定其容量大小。 - FPGA外加的DDR的容量大小设置合理
DDR和系统内存采用环形buffer结构(环形buffer的作用是使得读写模块既保存独立运作又需要相互依存),DDR传输能力比较有限,在允许范围内DDR尽量大些,以保证性能。 - FPGA中时间戳的分辨率要高
时间戳支持纳秒级,以更精准地进行被测设备的高精度时延测试。 - 可考虑在FPGA设计中加入负载均衡模块等性能优化方案
传统网卡使用RSS算法来实现负载均衡,定制的FPGA可在数据包经链路层解析后与FIFO之间加入负载均衡模块,以减轻服务器CPU的性能开销,进而保证线速和实时处理的要求。
同理,可在FPGA中加入其它性能优化方案。
3.6 业务性能及其它需求
- 高吞吐量、低延迟、不丢包收发、背对背值高;
- 系统复杂度低,资源占用率少;
- 支持光口10Gbps/100Gbps线速条件下64-10000bytes线速收发包(无论大包小包都要保证性能需求,通常1500bytes-9000bytes大小的帧为巨帧,视频传送等场景会应用到);
- PCIE链路带宽可以满足FPGA网卡带宽要求。
四 总结
最后,创作不易,喜欢的话记得点赞收藏,您的支持是我学习和分享的动力。
乘风起-xwm