一种面向可编程确定性零拷贝的FPGA加速器

2024-03-05 01:48王继昌吕高锋刘忠沛杨翔瑞
小型微型计算机系统 2024年3期
关键词:描述符拷贝网卡

王继昌,吕高锋,刘忠沛,杨翔瑞

(国防科技大学 计算机学院,长沙 410073)

0 引 言

当前,云数据中心网络的吞吐量已经达到百万兆级,网络流量趋于多样化,紧耦合且代码库庞大的单体应用架构逐渐被可扩展、易开发的微服务架构[1]所取代.而云函数(serverless)[2]作为一种实现微服务架构的最具代表性的方式,其异步并发、突发不可预测、组件独立扩展和快速开发迭代的需求对网络设备提出了新的挑战.传统商用的网卡由于硬件设计以及软件驱动的限制,已经难以满足部署云函数serverless的高吞吐、可定制和确定性时延的数据传输需求,迫切需要一种新型网络设备破解传统商用网卡面临的困境.通过查阅文献[3,4]可知,传统商用网卡的局限性体现在如下3个方面:

硬件特性方面的局限性包括:1)可编程性.通常情况下,支持serverless服务的网络节点需处理多样化的请求.而基于ASIC的完全定制的网络设备编程的难度极大,可商用的基于FPGA的设备往往具有无法直接修改的网卡配置.硬件设计的封闭性严重限制研究人员在开发新的网络应用特性时的效用和灵活性;2)确定性.随着被工业物联网(IIoT)的兴起,云、边、端的很多业务需要精确地控制点到点的时延和抖动.传统支持“尽力而为”的以太网的商用网卡无法满足这一需求.因此,需要一种可提供“准时、准确”数据传输服务质量的新一代硬件设备,能够具备确定时延、确定抖动的能力以及对多个队列的精确传输控制;3)数据拷贝.网卡与用户程序之间频繁的数据拷贝从根本上限制了微服务的高性能数据包处理.当报文到达网卡后,网卡通过直接内存访问(DMA)技术将报文拷贝至主机内存中的环形缓冲区(ring buffer);随后网卡产生硬件中断以通知主机CPU接收到一个报文(每个报文一个中断);CPU为报文分配一个套接字缓冲区(skb),送到协议栈对报文进行层层解析.最终接收端的应用程序通过套接字的recv()接口陷入内核态,将数据从内核复制到用户空间进行处理.发送过程按相反顺序执行.过程中,需经历1次DMA拷贝、1次CPU拷贝.研究数据[2]表明,单个报文的CPU拷贝消耗500-2000个时钟周期以及3倍于报文大小的内存.频繁的CPU拷贝会消耗服务器大量的资源,数据包将会由于无法及时处理而出现丢包和乱序,导致服务器无法达到高性能的要求.

为克服硬件处理和软件设计的局限性,构建处理高效的微服务网络节点.本文提出了面向serverless的可编程确定性零拷贝DMA加速器.在硬件层面实例化多个硬件队列,设计基于硬件时钟的确定性发送机制,实现对多个队列发送进行精确时间控制.在设备驱动层面,引入基于多队列的零拷贝(Zero-Copy)[5]机制,消除频繁的数据拷贝带来的CPU开销.此外,为增强serverless场景下服务的扩展性和灵活性,在传统多队列网卡的RSS(receive side scaling)[3]功能的基础上,添加基于流规则的数据流分发模块,可用于扩展针对新兴传输协议QUIC(Quick UDP Internet Connection)[6-8]的基于流标识(Stream id)的数据分发功能.此外,用户可通过远程服务器修改流表中的流规则,实现对设备的转发行为编程.在实验评估环节,模拟云数据中心的网络环境,设计多节点的数据包转发仿真拓扑,针对FPGA加速器的原型系统在不同队列数量、不同报文长度条件下的吞吐率和转发时延进行测试和分析.

本文介绍的支持零拷贝DMA的可编程确定性多队列加速器的设计、实现和评估,破解现有商用网卡设计在支撑微服务架构的桎梏,其主要创新可归纳为:

1)基于硬件时钟的精确时间同步设计,对加速器的硬件多队列的确定性发送控制;

2)基于规则的流分类算法的实现,可根据流量特性和用户需求匹配流表,实现多样化的基于硬件队列的调度;

3)分布式的数据流分发控制代理,网络中的管理节点可以通过下发流表的方式对数据流分发和封装行为进行定义,有利于分布式serverless网络节点的集中管理.

1 零拷贝DMA技术概述

在服务请求数据较大时,中断和数据拷贝将会占据大量的时钟周期.硬中断需要CPU的频繁的响应,可能导致中断活锁(livelock)[9].CPU数据拷贝以及上下文切换消耗大量的内存和时钟周期.针对硬中断以及CPU拷贝带来的性能瓶颈,业内提出用以提高数据的收发效率的零拷贝概念,最具代表性的技术以及框架有pf_ring zc、Netmap、DPDK[10-12]等,其中性能最好[13]的是DPDK,也是本文的主要研究对象.以下通过对比(如表1所示)几种不同零拷贝DMA技术特征来设计加速器驱动.

表1 零拷贝技术对比Table 1 Comparison of four zero copy technologies

1.1 PF_RINF ZC

PF_RING ZC[10]实现了DNA(Direct NIC Access,直接网卡访问)技术,将网卡内存和寄存器映射到用户态.其实现零拷贝的具体流程:1)使用DMA技术,把数据从网卡拷贝到主存(RX buffer)中;2)调用库函数mmap()直接将RX buffer的数据映射到用户空间,应用直接访问RX buffer的数据.PF RING ZC的API强调了便利的多核支持,它不使用标准系统调用,提供自定义的函数(polling),其驱动基于Linux驱动实现.PF_RING ZC处于活动状态期间,常规应用程序无法使用各自默认的系统接口收发数据.由于PF_RING ZC数据包处理经历的流程少,可达到与DPDK相同的数据处理效率.

Ntop[14]提供大量应用运行在PF_RING ZC之上,如报文捕获工具(n2disk[15]),流量监控工具(nProbe[16])等.但是PF_RING ZC必须购买相应的许可证(license)才能使用,且在应用于多队列网卡时,用户态的多个应用程序之间需要提前沟通需要使用的队列号,才能分发数据包,否则容易导致队列的使用冲突.

1.2 Netmap

Netmap[11]实现零拷贝的方法主要是将网卡的收发报文缓冲区(Packet Buffer)映射到共享内存区域(Shared Memory Region),内存中的环形Netmap ring与网卡中的NIC ring对应,应用程序通过调用Netmap API访问Netmap ring中的内容.Netmap的网络驱动主要是对Linux内核的网卡驱动打补丁实现,在执行到open/rx/tx等关键逻辑时,转而去执行Netmap自定义的逻辑.一旦开启Netmap使能的应用,网卡就会进入“Netmap模式”,在该模式下工作时,报文被转换成Netmap特定的数据结构,对启用Netmap的应用可用.在驱动程序中保持这种兼容性可以方便地集成到通用操作系统中.

Netmap已经被整合到FreeBSD内核中[17],且多个应用已经通过采用Netmap提升了性能,如:软件路由器(Click[18])、虚拟交换机(VALE[19])以及FreeBSD防火墙(ipfw[20]).但是Netmap完全不考虑网卡硬件卸载特性(如VLAN卸载、校验和卸载、TSO等),没有其他任何对报文进行处理的库,不便于进行GRO、GSO、IP分片/重组、QoS、加解密等应用的扩展.

1.3 DPDK

DPDK[12]完美支持多队列与多核扩展,是当前已知的性能最好的开源零拷贝I/O技术[13].它实现性能加速的方法包括:1)PMD(Poll Mode Driver)轮询模式驱动.I/O线程周期地轮询报文到达的标记位,从而避免中断处理引入的上下文切换的开销;2)UIO(Userspace I/O)[21]驱动,拦截网卡中断并重新设置中断对应的回调函数,将对硬件设备的操作映射为用户空间对文件的直接操作,规避了用户态和内核态切换以及数据拷贝的过程;3)HugePage访存,大页意味着页表级数减少,则快表中需要记录的页表项数减少,从而降低CPU地址转换过程中访问内存的次数,提高访问内存时TLB命中的概率.4)亲和性独占,将线程绑定在与之亲和性高的CPU核上,实现RTC(Run-To-Complete)的运行模式,避免了线程在不同核之间频繁切换,减少CPU内存访问的开销.

DPDK的典型应用包括加速的ovs交换机[22](DPDK vSwitch),以及高性能软件交换方法(xDPd)[23]等.从表1的特征对比来看,无论在部署、开发还是在性能方面,DPDK都具备其他零拷贝DMA技术和框架无法比拟的优势,而且DPDK作为一个开源技术,为本文的零拷贝驱动的设计提供了便利条件.

2 可编程确定性多队列加速器模型

传统商用网卡在可编程、确定性等方面设计缺陷,无法满足serverless网络的服务需求.鉴于此,本节提出如图1所示的可编程确定性多队列加速器模型.该加速器模型对比传统的网卡,在多队列分派的可编程性、数据包发送的确定性等方面进行了相关的改进设计.结合零拷贝DMA技术大幅提升数据包收发效率的相关研究[24],设计适配该加速器模型的零拷贝驱动,为提升网络节点的吞吐量提供参考.

图1 可编程确定性多队列加速器模型Fig.1 Deterministic multi-queue accelerator model

2.1 模型设计

加速器模型从结构上可分为serverless友好的可编程多队列,serverless友好的确定性DMA、用户态DMA零拷贝驱动3个模块.结合当前网络服务器的众核特性,采用可编程的基于规则的流分类器,将输入数据流精确的转发到与不同内核绑定的硬件队列中,提升硬件的并发性.加速器上添加的硬件时钟部件,与传输调度器交互,对每个硬件队列的传输引擎进行控制,实现数据发送的确定性.此外,主机用户空间的零拷贝驱动,消除传统数据处理流程中的硬件中断和数据拷贝开销,可以进一步提升模型的数据包收发效率.

3个模块提供各自的特性,而三者之间的交互则是通过由加速器和主机共同管理的硬件描述符环完成.该描述符环位于驱动开辟的内存池中,可由DMA控制器和零拷贝DMA驱动共同操作.每个描述符用于存放数据的物理地址、时间戳和描述符完成标志等信息,硬件描述符环使用的状态遵循生产者-消费者模式,其状态变化如图2所示.描述符环的起始物理地址存入加速器的base寄存器、大小(描述符个数)存入size寄存器,使用寄存器tail和head指针表示描述符生产和消耗的情况.tail与head之间数量就是当前可用描述符的数量avail.驱动写tail寄存器来生产描述符,硬件队列写head寄存器来消费描述符,两者通过读写寄存器的方式进行交互.加速器与主机之间的数据包流通则通过DMA控制器与PCIe总线协同完成.确定性DMA的功能由驱动在硬件描述符环中写入带有自定义时间戳字段的描述符,结合PTP硬件时钟的精确对时功能实现.

图2 硬件描述符使用Fig.2 Hardware descriptor usage

2.2 serverless友好的可编程多队列

可编程多队列模块包含RSS流分类和硬件多队列两个组成部分.其中,RSS流分类是可编程多队列模块的核心组件,完成基于规则的流分类和转发工作.每个硬件队列由rx和tx两个缓冲区组成.RSS模块与加速器的网络接口相关联,Agent代理用于远程管理,云服务器通过向Agent下发流表的方式实现对数据转发动作的编程,Forwarder转发器负责对传入的报文根据流表匹配信号进行转发.

相比传统商用网卡的RSS设计,RSS流分类不仅具备面向多队列的数据包分发功能,还扩展多层数据包转发特性.通常情况下,RSS使用传统的Toeplitz哈希算法[25],对数据流的5(4)元组进行哈希计算,根据结果将数据流定向到指定的硬件队列中,在layer 3或者layer 4层实现流的分类.而在传输QUIC等新兴传输协议数据时,还可以根据QUIC单一传输对象采用相同流编号(Stream id)的特性,识别QUIC报文负载(payload)中的相同流编号的数据后,转发到同一个硬件队列中,实现layer 4.5层的转发.

转发器是可编程多队列模块的主要功能组件,工作流程如图3所示.当数据包到达加速器时,网络接口将接收到的数据包交给与接口绑定的RSS流分类组件,由RSS中定义的报文接收函数处理.首先,由流分类器(Flow Classifier)进行报文头信息的提取,识别报文类型标识(flag),送入流表(Flow Table)中进行匹配;之后,数据包的控制权与秘钥(key)值(通常min(核心数,启用的队列数),也可以进行自定义)一并被送往转发中继器(Repeater).flag在流表中匹配到流表项后,生成信号(signal)交付给转发中继器,转发器结合不同的信号值获取报文的不同字段(如TCP数据包的五元组,QUIC数据包的Stream id)进行哈希计算,根据哈希值将报文转发到相应的队列上.

图3 RSS多队列接收流程Fig.3 RSS multi-queue receiving process

流表代理(Agent)作为RSS分类组件的控制器,它通过网络接口与远程服务器相连,负责主动为云服务器报告节点变化或者请求服务数据.云服务器也可以通过Agent更新流表内容,实现转发行为的可编程性.

2.3 面向serverless的的确定性DMA

确定性DMA模块主要由传统的DMA组件、传输引擎(tx engine)、传输调度器(Tx scheduler)[27]以及PTP硬件时钟(HC)[28]组成.队列传输引擎特定于某个硬件队列,处理来自传输调度器的传输指令,负责协调传输数据包所需的操作,同时通过写寄存器的方式控制该队列的启用/禁止.传输调度器管理多个传输引擎.PTP硬件时钟为加速器提供与主机亚微秒级误差的高精度对时,结合传输调度器对传输引擎的控制,实现数据包的准时、准确发送.

当主机提出确定性请求传输时,驱动将时间戳与描述符一并写入硬件描述符环中,DMA控制器感知到描述符环的队列尾(tail)指针变化后,找到传输描述符环中下一个将要使用的描述符.控制器首先读取时间戳,在通过PCI总线将描述符指向的缓存区数据复制到加速器指定传输队列的同时,将读取的时间戳信息通报给传输调度器.此时传输调度器通过与PTP硬件时钟对时来获取当前时间,并在时间戳规定的时间点,为该传输队列对应的传输引擎发布指令,然后传输队列通过MAC芯片将数据转发出去.发送完后,加速器更新描述符环的头(head)指针,DMA控制器启动硬中断通知CPU释放数据缓存区.

以上通过应用程序下发时间戳的方式,结合PTP硬件时钟的精确对时功能,将数据包发送的控制权转交给加速器的队列调度器,从而进一步控制的传输引擎来发送报文.不仅简化了主机的操作流程,还为传输提供确定性的控制.

2.4 用户态零拷贝驱动

用户态零拷贝模块由内核态的零拷贝驱动、共享的内存池(mempool)、用户态的PMD轮询组成.实现用户态零拷贝的重点是内核态零拷贝驱动申请的一块DMA一致性共享内存池.其中包括硬件描述环(ring buffer)、软件描述符环(sw_ring)以及用于存放收发数据的连续内存空间mbuf.数据包在加速器与应用程序之间的流通,通过DMA+mmap共同实现,所有的数据复制均不需要主机CPU的参与.零拷贝工作流程如图4所示(以接收数据包为例):①内核态零拷贝驱动初始化时分配一块内存池,用于存放rx_ring、sw_ring以及mbuf;②申请mbuf;③将新的mbuf的物理地址放入硬件描述符中,将DD(描述符完成)位置为0(0表示可用,1表示不可用);④并将mbuf的虚拟地址赋给软件描述符(sw_ring),便于应用程序直接访问;⑤驱动从第一个描述符开始,轮询硬件描述符的DD位是否为1,如果不为1,则由DMA将硬件描述符获取到加速器;⑥数据包到达加速器时,DMA控制器从获取描述符中解析出mbuf的物理地址;⑦将数据包从加速器队列DMA写到指定的硬件地址中(对应sw_ring描述符的某个mbuf元素),设置rx_ring和sw_ring描述符的DD位以及其他的信息;⑧应用程序通过PMD轮询DD位的方式检查是否有数据包到达,其判定DD位的方式与DMA控制器相反.如果数据包到达则取出数据使用,否则将进入下一个PMD轮询周期.

图4 零拷贝工作流程Fig.4 Zero-copy workflow

2.5 面向serverless的CPU的亲和性

一般情况下,支持微服务架构的服务器上部署着多个CPU核,并同时运行着多个微服务进程(或者云函数),运行微服务进程使用的信息存储在每个CPU的缓存中.在进程运行过程中,可能会被操作系统调度到其他CPU核上,由不科学调度导致的CPU缓存命中率降低以及内存污染就会导致程序的运行效率降低或者崩溃.解决这一问题最直观方式就是将微服务进程绑定到一个CPU核上,为该进程开辟一致性内存空间.CPU核与应用进程绑定后,就会一直在指定的CPU核上以RTC模式运行,减少了进程上下文切换带来的开销.

CPU核的亲和特性通过RSS多队列、零拷贝驱动和确定性DMA模块共同作用实现.零拷贝驱动负责初始化加速器各类寄存器,注册内核接口,为硬件描述符分配DMA可访问的缓冲区.驱动读取加速器中使用寄存器空间公开的参数,如队列数量以及时间戳等,并结合CPU核的数量,通过Num=Min(硬件队列数,CPU核数)得出所要激活的队列数量(Num).此时,驱动为硬件队列分配各自的内存池,并申请Num个中断号,使用irqbalance[26]为每个硬件队列分配唯一的irq号.

CPU亲和性在两个场景适用,一是CPU核的负载均衡.RSS多队列模块在接收到数据包时,根据流规则将数据包均衡到不同的硬件队列,此后该硬件队列会根据irq号向绑定的CPU核发出中断请求,DMA控制器将数据包复制到该队列对应的内存池中.此时应用程序可以通过轮询irp号对应的内存池获取用户数据.第2个场景是基于优先级,将重要的业务进程隔离开,对于部分实时进程设置高优先级,将其绑定到指定核上,既可以保证实时进程的调度,也可以避免其他CPU核上进程被该实时进程干扰.将控制面以及各个数据面进程绑定到不同的CPU核,省却了反复调度的性能开销,在进程之间互不干扰的情况下完成工作.

3 性能评估

可编程多队列加速器理论上可以支持成千上万的传输队列,用于跨多个终端传输数据.该加速器原型与传统的支持DPDK的网卡相比,主要改进之处在于:1)数据包的转发可以根据加速器内的流表内容,直接在加速器硬件中完成,同时还配置如VxLAN[27]封装等多层转发的功能;2)借助硬件时钟与发送队列传输调度器的控制,可实现确定性发送,并且对于实时性要求较高的数据流,可以设计更高的发送优先级.

3.1 原型系统实现

原型系统分别在Virtex-7 X 690T和X 2000两种类型的FPGA板卡上实现.主机配置为Intel(R) Core(TM) i7-10510U CPU,1.8GHz,8G RAM,8 Cores.操作系统采用KylinOS,Linux 4.18.0-25-generic.基于两种类型的开发板实例化多队列加速器,配置1个网络接口,多个硬件队列,并将加速器的配置参数写到指定的硬件寄存器中供零拷贝驱动读取.图5列举了在启用不同数量的硬件队列时,FPGA资源使用情况.从表中可以看出,开发板可以支持实例化8个硬件队列的加速器原型,硬件队列数量每增加1倍,消耗的硬件资源超过原始资源占比的2倍.

图5 FPGA资源占用Fig.5 Resource utilization of FPGA

加速器原型系统中的可编程多队列模块,是加速实现多路并发、可编程、确定性等特性的最核心部件.其中远程服务器可通过Agent以openflow协议对流表进行编程,转发其则根据流表的表项对数据包的进行可编程的转发,转发器的工作逻辑见算法1描述.

算法1.Rule-based flow classification algorithm

输入:incoming packetPkt,f low_tableTable,hash_key K

输出:A action to delivery packet

1.functionFORWARDER(Pkt,Table,K)

2. flag=Flow_Classifier(Pkt)

3. signal=Match(Table,flag,Pkt.tuple)

4. Repeter(Pkt,signal,K)

5.endfunction

6. //Overall process of flow classification and forwarding

7.functionFLOW_CLASSIFIER(Pkt)

8. ExtractPkt.tuple,Pkt.typefrom Pkt.header

9.ifPkt.type !=QUICthenflag ← 2

10.elseflag ← 1

11.endif

12.returnflag

13.endfunction

14. //Get the packet type and flag from the packet header

15.functionMATCH_TABLE(Table,flag,Pkt.tuple)

16.ifPkt.tuple match in Table is drop

17.thenret ← -1

18.elseifPkt.tuple match in Table is forward

19.thenret ← 0

20.elsePkt.tuple match in Table is process ret ← 1

21.endif

22. signal ← flag * ret

23.returnsignal

24.endfunction

25. //Get signal using the flag matching flow table

26.functionREPEATER(Pkt,signal,K)

27.ifsignal=1then

28. Extractstreamidform quic payload

29. num ← hash(K,streamid)

30. delivery tonumth queue for processing

31.elseifsignal=0then

32. num ← hash(K,streamid)

33. delivery tonumth queue for transmition

34.elseifsignal <0thendrop it

35.elsenum ← hash(K,Pkt.tuple)

36. delivery tonumth queue for processing

37.endif

38.endfunction

//The forwarding behavior of different type of packets

零拷贝驱动依然遵循DPDK的主要逻辑,主要在以下几个方面的工作逻辑进行修改.首先,在零拷贝驱动的设备列表中增加X2000和690T设备型号,通过PCIe设备注册的方式,提供驱动能力.其次,实现自定义的探测函数与设备释放函数,并在探测函数中完成硬件资源地址的映射.然后,创建DPDK的以太网设备对象,读取硬件寄存器中的配置参数,并对该对象进行实例化操作,主要包括对设备功能的配置、收发队列的初始化、端口的使能、Link及UP/DOWN操作.最后,实现硬件的批量接收和发送函数,支持对每个使能的网络接口和硬件队列的数据包收发功能.

3.2 实验拓扑与设计

实验拓扑:基于FPGA板卡的多节点网络拓扑如图6所示,由发包、转发和收包3个网络节点组成.拓扑节点的网络接口之间使用100G光纤连接.在零拷贝驱动的初始化完成后,可以根据业务的要求来进行数据收发操作.以零拷贝驱动中examples目录下的pktgen为示例程序,运行后会根据启用的队列数,在每个相应的核上启动一个相应的收发包线程,然后根据转发规则稍做处理后,直接将接收到的报文分发到其指定的输出端口.

图6 实验拓扑Fig.6 Experiment topology

实验目的:实验主要对加速器3个方面的特性进行验证:1)零拷贝驱动的实现,在双主机端运行示例程序,通过观察程序运行情况验证驱动与可编程多队列加速器的适配;2)加速器转发行为的可编程性,通过远程控制器配置转发节点(X2000)的流表,将来自Host0直接向Host1转发,验证对转发行为的编程;3)多层数据包转发的扩展性.启用RSS模块中的VxLAN网络虚拟化技术,在3个节点之间建立网络隧道,增强实验模型在云数据中心网络中的可扩展性.

变量和参数:为了实现上述实验目标,在实验过程中设置两个变量,即队列数量,和数据包长度,以测试不同队列数量在传输不同大小的数据包时的总吞吐量.同时,考虑启用/禁用加速器的VxLAN虚拟化技术作为变量,进一步验证加速器的多层转发功能.此外,还测试了单队列下各种大小数据包的转发延迟.编写一个shell脚本,直接获得网络接口的吞吐量,该脚本每隔1秒执行一次命令,将相应的网络端口流量大小重定向到后台文本(.txt)中.与直接使用脚本读取吞吐量的方法不同,获得延迟测试结果相对复杂.由于网络拓扑中有3个节点,两个用于发送和接收流量,一个用于转发流量.接收节点在网络接口上捕捉数据包和时间戳,并将数据包以.pcap格式保存,从.pcap文件中提取时间戳数据进行计算.由于数据包数量众多,本文从数据包中均匀的抽取一小部分用于计算.

过程和计算:为实现上述实验目标,本文测试不同队列数(1,2,4,8)在在启用和禁用VxLAN的情况下,传输不同长度数据包(64B,128B,256B,512B,1024B,1536B)时的吞吐率和转发时延,验证加速器的多层转发功能.每个实验持续了1分钟.为保证实验结果的准确性,本文通过加权计算平均值的方法消除误差.在计算平均总吞吐量时,使用50个获得的数据来计算平均值.在计算平均延迟时,由于每次获得的消息数据量巨大(远远超过1000条),为方便计算,采用均匀取值的方法,取50条数据进行计算.平均吞吐量和延时的计算方法是 如公式(1)~公式(3)所示:

(1)

(2)

LATk=Timestamp.recv-Timestamp.sent

(3)

3.3 实验结果与分析

实验结果如图7和图8所示,图7显示了平均总吞吐量和报文大小之间的相关性.图8显示评估单队列的平均转发延迟与传输不同大小数据包的关联.两个实验均表明加速器可以适配零拷贝DMA驱动,支持零拷贝数据收发.

图7 平均吞吐量Fig.7 Throughput with various queues

图8 平均转发时延Fig.8 Forwarding latency with various packet sizes

在图7中,传输同一长度的报文时,启用的队列数越多,吞吐量越大.而在同样队列数的情况下,随着报文长度的增大,加速器吞吐量增长速率减慢.在报文长度为1536B时,8个队列的加速器的数据吞吐量可接近线速率(100Gbps).这意味着8核的主机可能满足线速率转发需求.为3个节点启用VxLAN功能后,通过对流表的编程,同样可以进行报文的收发.对比同等情况下未启用VxLAN的加速器,虽然吞吐量有所下降,但是影响较小,既验证了加速器的高吞吐率,又验证了多层转发功能.结合FPGA资源占用和吞吐量增益来看,实例化的硬件队列的数量每增加一倍,所消耗的FPGA硬件资源就需要增加一倍以上,但是吞吐量增益却小于50%.

图8显示了报文长度与平均延迟之间的相关性,不同的数据包大小在发送方和接收方都启用了单队列.随着数据包长度的增加,数据包的发送和接收延迟也随着增加,而且在数据包长度超过512B时,延迟增加的速率逐渐减慢.由于中间节点直接数据包,所以一次发送和接收的延时应该是计算出的平均延时的一半.例如,传输64B数据包的平均延迟约为6.37,而传输1536B时的平均延迟为7.05.该测试的传输延迟接近于目前最先进的ovs-DPDK[28]模型,验证了加速器的“及时”转发特性.

以上两个实验对加速器的零拷贝驱动适配、数据包收发的高吞吐量以及数据包转发的可编程和低延迟进行验证和分析,总体达到了上述实验目标.未来的工作将继续致力于serverless友好的可编程确定性零拷贝DMA加速器的开发,主要对多队列的确定性转发进行扩展和实现,并进一步探索提升Agent代理与流表之间编程的高效能.

4 结束语

面向微服务的支持零拷贝DMA的可编程确定性加速器是满足serverless中突发流量、多样化需求,破解传统商用网卡局限性的一个可行性尝试.本文介绍了可编程确定性多队列FPGA加速器硬件以及配套零拷贝驱动的设计、实现.从部署、性能等多个方面对比了多种零拷贝技术优缺点,根据当前性能最好的DPDK的驱动逻辑设计该加速器的多队列零拷贝DMA驱动.使用两种类型的FPGA板卡构建了100G加速器原型,并进行多节点数据包收发评估.实验表明,本文设计的零拷贝DMA驱动能够完美的适配加速器,实现多队列数据包收发的零拷贝,且支持多队列的数据包转发的可编程,并扩展了多层次的转发功能,一定程度上满足了微服务网络架构的数据传输需求.

猜你喜欢
描述符拷贝网卡
在DDS 中间件上实现双冗余网卡切换的方法
基于结构信息的异源遥感图像局部特征描述符研究
基于AKAZE的BOLD掩码描述符的匹配算法的研究
Server 2016网卡组合模式
唐氏综合征是因为“拷贝”走样了
Linux单线程并发服务器探索
利用CNN的无人机遥感影像特征描述符学习
挑战Killer网卡Realtek网游专用Dragon网卡
Windows系统下强化容错拷贝命令的实现
读编往来