|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
智能网卡成为国内大厂追逐的热点,如阿里、腾讯、百度,甚至Ucloud均在自研智能网卡,然而,作为智能网卡核心的数据处理器DPU芯片研发周期长、研发成本高、研制需求又随应用不断变化,难以形成确定的specification集合,虽然,国内市场上有许多公司投身DPU研究,如中科驭数、迈普等,鲜有成熟产品。目前,市场需求旺盛,然而技术壁垒积高,在这两难的境地下,可重构的智能网卡应用而生,即基于可编程硬件FPGA芯片的智能网卡,虽为中庸之道,却不失目前较好的解决途径,国内也有许多厂商投身于此,如国内的同悦、锐文等。+ O7 a9 g2 j/ V8 M
3 e! n1 o5 |$ K) o0 ^4 `5 R2 p
在此趋势下,我们这个小厂也算不上的小作坊如何立足,选择哪个发力点,成为一直悬而未决的困惑。从多年的做系统的经验,从多年自主可控产线的积累,我们不想用比较成熟的xilinx的一键式解决方案,我们选择了基于自主可控FPGA的可重构智能网卡实现方案,走上了一条不归路。
3 W! W5 |, p3 S/ A& e/ g
6 }' p& B! q+ P$ g- m+ X. w2 b 我们设置了几个目标:4 X" X' ]0 L8 q+ w
! s( j7 W% c1 j
1)性能高,如果是10GE接口,服务器自己可以应付,因此,最小目标是40GE,而且是双40GE,最好结果是100GE;
, M3 b# L4 o5 y/ s3 \, R9 ~
1 L" `9 n- m$ \ 2)可编程,想从两个层次设置两个目标,报文内容深度处理层次,C语言可编程,性能不是问题,主要用于异构计算加速,另一个是通用报文处理层次,网络领域定制语言可编程,主要指P4,一定要达到线速,主要用于网络加速;
3 Z2 ?: [. J7 a* P6 h( g7 i0 {! T9 p/ w4 V4 y% m$ N0 ^. k5 W9 ?: O
3)好移植,主要是给应用友好的开发接口,甚至是智能网卡支持商用的开发套件,比如DPDK;
4 A7 [/ O9 p- R9 P) J
6 b( L9 @8 \1 f% J) s6 r! J! p 4)开源,不涉及第三方知识产权的原理图、硬件逻辑、驱动等进行开放。( J% d* s: ]. {! j! U
8 i1 \% j" t) r8 @ 针对上述大山,背后还有一群小山,我们开始了漫长的攻关.今天,仅仅简单介绍一下我们自认为多项第一的原型FiNIC。我们一直认为,这不仅仅是网卡,支持100G高速接口,支持P4,支持DPDK,这还是异构计算在线加速器FPGA-inline,是泛在计算平台,远大的目标使自己保持干劲。4 [5 L; @' s- B+ v2 _
, t. d4 P3 `: l1 L2 ?& D+ vFiNIC原型2 J. y& Q6 W4 ` x& B. v, }2 W
6 w4 U8 j6 C8 ?+ U6 O/ b 1)硬件资源
( l2 D% x# V( L4 J/ j" j. o" \* x, e9 \
前序已经介绍了可重构FPGA网卡的架构,主要集成两个层次的可编程资源,可编程硬件FPGA和通用多核处理器。8 B: N. ^8 ]% @
. A) @8 I% E6 W2 ^* u3 D/ o
可编程硬件FPGA是直接在PCB上集成,国产可编程FPGA共提供了80路高速SerDes,两组4路SerDes连接QSFP,提供2个40GE接口,两组10路SerDes连接QSFP28,提供100GE接口,从物理形态上,满足了双40GE接口的目标。由于目前100GE接口通常采用QSFP28,因此,将FPGA输出的10路SerDes通过gearbox转换后连接到QSFP28。国产FPGA共提供了3个PCIE3.0硬核,其中,1组PCIE3.0硬核x8连接到网卡金手指,另有1组PCIE3.0硬核x8连接到连接器。
) ?, z# {" Y7 R/ D9 r
! i/ f0 j& f, T* m/ c: n5 e. F( { 从链路带宽上来说,1组PCIE3.0 x8接口无法处理2组40GE接口流量,因此,网卡上需要分流,将部分流量卸载到板载通用多核处理器。另外,2组40GE接口从接口功能上来说,更多是服务器网络接口的冗余备份,而不是链路聚合。对于更高性能,2组PCIE3.0 x8才能应付1组100GE接口流量。9 ], H/ L( v" V0 n- k9 A) v6 C$ r
7 h1 y$ f' F& y1 K 为了减小系统研发难度,通用多核处理器资源采用商用FT2000+模块,通过FPGA网卡上COMe连接器,连接FPGA中的1组PCIE3.0 x8硬核。FT2000+模块一方面提供C语言程序的运行环境,支持报文数据的深度处理,可以卸载部分流量,另一方面,作为网卡控制器代理,支持远程控制器对网卡的管理配置。
' c& p# R) @" m# F Y. P. S- }+ Y
可以说,巴掌大的网卡也是一个微型的路由器,不仅有转发处理,还有控制协议处理。为了卸载和加速基本网络处理,减小可编程硬件FPGA逻辑资源占用,在网卡上额外增加网络查表引擎,来实现精确查找和模糊查找功能的卸载。
) `" Q/ d) }* e3 p( c+ N; W6 {7 ^
! I; Z7 e2 |2 `) y0 u+ p, E- L& Z' n 2)硬件逻辑/ S& p1 r& _: ^2 f, T
D% r- U7 t* t 可重构FPGA网卡硬件逻辑主要分为四部分,PCIe和DMA引擎Corundum模块,用户自定义模块UD,RMT流水线,40GE/100GE IP核HSEC等。
# P V" @( ]% ~+ g
i. u4 r2 Y9 W8 d. c Corundum模块是开源的DMA引擎,支持Xilinx的Ultrascale和Virtex-7系列可编程FPGA,支持多队列操作,支持时间戳处理等,因此,我们选择了Corundum架构。Corundum模块层次非常清晰,自顶向下分别是Core,InteRFace,Port和Sink/Source等层次化模块。Core模块中,对多路Interface模块的Data和Ctrl两条通路分别进行聚合和分派;Interface模块中,对多个Port模块的Data和Ctrl两条通路分别进行聚合和分派;Port模块中分为Tx、Tx_Cpl、Rx和Rx_Cpl等四大功能块,其中source子模块负责Tx的处理,sink子模块负责Rx的处理。# g" i1 Q' l' b& ` T) X
5 \5 d' y$ W$ x+ D( P6 V
RMT流水线在前序章节也进行了介绍,这是我们设计开发的Match-Action多级流水线,在Match模块中,采用CAM实现了模糊匹配查找,在Action模块中实现了基于ALU的报文分组选项处理,在Match和Action之间是关键字的交叉开关,实现ALU的共享。RMT的ALU中加、减、移位等操作,并将操作数的宽度从32bits扩展到48bits。可以基于P4语言编写报文分组处理程序,编译后下载到RMT流水线,在线改变RMT流水线功能,实现功能动态重构。( I0 N" S: J- D+ E4 ]8 U& \' P
/ q) D& j D9 k5 F3 J" T# h
HSEC是高速40GE/100GE MAC核,实现了40GE、100GE接口线速处理。在这里需要额外注意的有两点:一个是FIFO接口到RMT的AXIS接口的转换,另一个是RMT流水线到2组40GE接口的交换,这里应用了AXIS_Interconnect IP,实现冗余备份端口的切换。( {# _" |0 ]' |- ~4 m, n5 K; u
& o5 E7 L7 Y3 |: @9 i' x9 g' o
FiNIC驱动及DPDK适配" k4 `- d( S0 l7 c' S
- ?: t, H9 d# }
好用的网卡不仅仅是实现网络功能卸载、应用加速等等,更重要的是向应用提供透明的接口,即用户程序少量修改即可运行,甚至是不修改。这就要求要瞄准市场上最为广泛的应用中间层,特别是发挥零拷贝、用户态协议栈等优势,我们认为DPDK是目前比较全面的数据平面开发套件,因此,在内核态驱动的基础上,主要实现对DPDK的适配和支持。
4 Z% D5 N/ V% d& x* ?
3 V* E" ]) N {& O, f DPDK尽其所能的将有助于包处理加速的软件特性与优化方法于一身,最大限度的提升包处理能力。如Huge Page、TLB、缓存对齐、多通道内存访问、NUMA、预取、CACHE、多核并行、线程绑定、无锁队列、零中断、零拷贝、IA最新或特定指令等等。- ~. E% {) i% G3 @$ Q
2 B* g7 X5 ^: o- f 根据DPDK开发环境架构及分层结构模型,我们的驱动功能主要还是原始驱动的主要逻辑,基本不用做大修改,只是按照DPDK开发环境的架构设计进行重组适配即可。其移植过程也与标准内核网卡驱动开发流程类似。/ L5 \& ]( O4 z$ ~% i2 n( s
4 Y; f$ A' ^" l0 J% s; o
首先在DPDK的设备驱动列表中增加设备型号,通过PCI设备注册的方式告诉DPDK,可以为该设备型号提供驱动能力;其次,实现驱动的探测函数功能与设备释放函数功能,并在控测函数中完成硬件资源地址的映射;然后,创建DPDK的以太网设备对象,并对该对象进行实例化操作,主要包括对设备的配置功能(如队列数、每队列描述符个数、硬件卸载属性)、收发队列的初始(接收队列还需要填充描述符信息)、对端口的使能、Link及UP/DOWN操作;最后,实现设备的批量接收与发送函数功能,支持对每端口每队列进行分组接收和对每端口每队列进行分组发送。
: X" A+ Y* b! v8 @
) q" {8 ]8 v9 Y. {$ C7 \+ A& o' f 驱动移植开发实现上述基本功能即可使用,剩下部分就是DPDK的功能。) ~ K/ \& X8 [* ]( i( H1 a
/ Q9 @* Y9 `- }: tFiNIC网卡测试
2 S* _6 n$ `9 V" W- N
$ I. h/ I* J$ s+ ~6 e 1)测试环境
8 S0 O) z; @- N* V6 k, v: [
5 m$ b+ U, K8 T6 }# U FiNIC是一个系统级板卡,为了方便调试,我们直接在台式机上部署调试。目前,系统占用资源比较少,仅为27%,为异构计算加速器等用户自定义模块UD扩展预留了足够的空间。 ]6 q! o' d* n5 N
- E. v3 Q% M( h
2)处理流程
# b/ b) q& @! g* |8 L/ w' b' [* l! F- D( N/ F
6 @6 ?1 b8 L, @* m- {! D+ A
; b6 |7 l7 V& C; T* W" P 从DPDK的系统初始化流程开始,一般地,跟系统相关,如DPDK环境初始化、CPU检查、中断检查等这些标准内容都跟具体驱动无关,可以直接跳过。在环境初始中的PCI设备初始化过程开始验证。PCI设备的初始也与系统初始过程类似,DPDK编译环境中会记载着能为哪些设备类型(厂商ID与设备ID)提供驱动能力,再通过实际的探测扫描找到具体的设备类型,通过信息比对发现,有设备和驱动列表中匹配了,则调用该驱动的设备探测函数,开始对设备时行一些基本的初始化操作。PCI设备探测函数执行完成后,会紧接着调用其设备配置、队列配置、端口配置等一系列功能函数,将整个设备的硬件初始工作环境配置好。最后通过开始操作,使能端口,使其具备数据的收发功能。
5 R! W- a2 z% ?4 b) s- K0 ]/ i, {" Q+ d ~; m
DPDK的环境初始化完成后,就可以根据业务的要求来进行数据收发操作,以DPDK中examples目录中的l2fwd程序为例,后续在每个核上启动一个相应的处理线程,在线程中先调用驱动的批量接收函数获取硬件接收到的报文,然后根据交换规则稍做处理后,直接再将接收到的报文分发到其指定的输出端口。
3 ~, [% g8 r' g: J. V; i; E
/ x, Q/ @. R' @. ~; I( } 3)演示验证
9 y* t" S# X) s' Z
! i3 E4 R, D; O FiNIC实例化了4个逻辑端口,对端口接收到的报文直接转发到另一个端口。如0接收转发至1,1接收转发至0;2接收转发至3,3接收转发至2。
! u2 N9 W) c# C( u& [' M; p
) F+ S5 X% `+ k& r- m! j- D* } 踩过的雷
9 f5 |: w \ y' g6 o* f6 A& _4 d( O2 A( y" I
1)debug工具:debug自己一直存在clk找不到,port缺失等问题,工具的问题,综合后仔细检查一遍即可。
* @0 }0 e9 `) j3 A. v! }/ b* G: w: ~3 F$ k; v$ {# K
2)Corundum调试:Corundum风格太好啦,我都已经看不懂啦,一个显著地风格就是一个寄存器,分段赋值分给多个端口,比如reg [255:0] axis_tdata,这是4个interface的数据组合在一起。另一个就是时序,务必对异步时钟设置set_clock_groups。
9 E/ N8 ~8 m- Z8 I+ \# w4 p/ P! w2 n0 L# T- g. e
3)AXIS_Interconnect调试:按理来说应该是很简单的模块,不仅实现分派和聚合,还是先位宽转换,还实现端口交换,功能非常强大,但是面临的问题是丢包,结果发现FIFO Normal模式信号与AXIS信号时序有较大差异,牺牲资源,改成了Packet模式。
3 x3 ]5 W; U! j$ [ |
|