Intel E810 DDP在VPP offload加速框架中的应用

概述

Intel近期发布了其新一代E810网络适配器,该适配器提供了一种DDP(Dynamic Device Personalization, 动态设备个性化)能力可以有效加速多种协议报文的处理。本文将以FD.io VPP为例,介绍怎么利用Intel E810网卡的这种能力加速GTP-U报文的处理。

Intel E810网卡及DDP简介

英特尔® 以太网 800系列是新一代英特尔® 以太网控制器和网络适配器,采用增强的可编程报文处理引擎,可实现更深入、更多样化的报文协议头处理。这种片上功能称为动态设备个性化(DDP)。在英特尔®以太网800系列中,每台设备的驱动都可以动态加载DDP软件包。Comms DDP包除了支持通用DDP包含的协议之外,还增加了对GTP和PPPoE协议的支持。本文中加速GTP-U报文所使用的就是这种Comms DDP包。

关于该网卡和DDP的具体介绍参见: 英特尔®以太网控制器E810介绍:面向5G核心网络

VPP简介

开源项目VPP(Vector Packet Processing)是由cisco贡献给FD.io社区的核心项目。VPP是一个运行于用户态的高性能可扩展报文处理框架。VPP的报文处理建立在各种graph node上。通过组织这些node的顺序,VPP可以高效灵活地组织各种基础组件和plugins来处理特定的业务逻辑,而不需要修改核心代码。

更多VPP详细信息请见:VPP/What is VPP?

(链接为https://wiki.fd.io/view/VPP/What_is_VPP%3F)

VPP从19.04版本开始支持Intel E800系列网卡,在即将发布的VPP 20.09版本中,很多高级DDP特性已经支持。在后面的章节中我会介绍怎么利用E810的DDP功能来加速GTP-U报文处理。

VPP vnet/flow infrastructure简介

VPP提供了vnet/flow infrastructure 来利用硬件网卡的卸载能力。当使用DPDK plugin作为基础IO插件时, dpdk plugin使用rte_flow来支持这些flow类型。

 

vnet/flow支持的flow类型有:

  • Ethernet_type,

  • IPv4, IPv6,

  • IP4_N_TUPLE, IP6_N_TUPLE,

  • IP4_L2TPV3OIP,

  • IP4_IPSEC_ESP, IP4_IPSEC_AH,

  • IP4_VXLAN, IP6_VXLAN,

  • IP4_GTPC, IP4_GTPU

Intel E810网卡支持绝大多数的flow类型。

Vnet/flow infra支持的action有:

Intel E810 DDP在VPP offload加速框架中的应用

其中,MARK, REDIRECT_TO_QUEUE, RSS, DROP实际由硬件完成。而BUFFER_ADVANCE和REDIRECT_TO_NODE是由IO node的软件协助完成。

 

Flow infra可以通过CLI或者VAPI来配置,也可以被各种app运行时做配置。下图1是配置通路:

Intel E810 DDP在VPP offload加速框架中的应用

Figure 1:config path

E810 DDP加速VPP GTP-U报文处理实例解析

在VPP中,使用“create gtpu tunnel”命令来创建一条gtpu tunnel:

vpp# create gtpu tunnel src 1.1.1.2 dst 1.1.1.1 teid 10 decap-next ip4

gtpu_tunnel0

vpp# show gtpu tunnel

[0] src  1.1.1.2 dst 1.1.1.1 teid 10 tteid 10 encap-vrf-id 0 sw-if-idx 3 encap-dpo-idx 9 decap-next-ip4

vpp#

我们可以看到,一条gtpu tunnel由SIP, DIP, TEID来标识。

GTP-U 处理流程图如下图所示:

Intel E810 DDP在VPP offload加速框架中的应用

Figure 2: data path - before

我们看到,在进入到GTPU graph node处理之前,报文经过dpdk node, ethernet node, ipv4 node, udp node等一系列node的处理, 剥离掉Ethernet层,IPv4层和UDP层,最终暴露出了GTPU header在GTPU node中进行处理。

 

Intel E810 NIC通过加载Comms DDP package来获得GTPU报文的支持。E810可以识别GTP-U报文,并使用flow director和RSS对报文进行预处理。VPP中有一个专用的node "gtpu4_flow_input_node"来处理被硬件加速的GTP-U报文,用户可以通过CLI或者VAPI使能硬件加速功能。

在我们的例子中,VPP下发的flow为:

Pattern:

    SIP: 1.1.1.1

    DIP: 1.1.1.2

    TEID: 10

Actions:

  • VNET_FLOW_ACTION_MARK: tunnel index

  • VNET_FLOW_ACTION_REDIRECT_TO_NODE: gtpu4_flow_input_node.index

  • VNET_FLOW_ACTION_BUFFER_ADVANCE: sizeof (ethernet_header_t) + sizeof (ip4_header_t) + sizeof (udp_header_t)

 

我们来解析一下这条flow:

  • Pattern中指定了SIP, DIP, teid, 通过这个pattern组合我们可以确定一条唯一的gtpu tunnel

  • 我们使用mark action来给这条flow打一个标记。在这个case中这个标记就是gtpu tunnel index(实际上该值需要加上一个gtpu node的offset, 并在dpdk plugin中做全局变换。这部分跟我们今天的内容没有太大关系因此略过)。

  • Action REDIRECT_TO_NODE是用于指定这条flow的next node。DPDK plugin在发现这条flow后会直接指定next node为gtpu4_flow_input_node,而不再需要经过ethernet, ipv4, udp等node的处理。

  • Action BUFFER_ADVANCE是为了配合REDIRECT_TO_NODE来使用。因为这条flow会“跳过”一些node,因此需要调整一下vlib(VPP的metadata, 类似于dpdk的rte_mbuf)的数据指针, 暴露出gtpu header。

 

具体实现见图3:

Intel E810 DDP在VPP offload加速框架中的应用

Figure 3: gtpu offload的流属性

VPP配置这条flow之后,所有符合条件的gtpu packet即被NIC匹配,并给这条flow打上一个"flow_id"。VPP的dpdk plugin从DPDK PMD收到报文后,通过检测rte_mbuf.flag中包含PKT_RX_FDIR_ID flag,并从rte_mbuf.hash.fdir.hi中提取到flow id,然后根据上文描述的actions来进行动作:调整vlib_buffer 指针并把报文直接送到GTPU node做处理。具体实现见代码:

Intel E810 DDP在VPP offload加速框架中的应用

Figure 4: dpdk plugin处理被mark的flow

符合条件的gtpu flow被直接送入node "gtpu4-flow-input"。这个node是专门处理被硬件加速的GTP-U packet的。我们来看一下这个node的主要处理逻辑:

Intel E810 DDP在VPP offload加速框架中的应用

Figure 5: gtpu4-flow-input 主要逻辑

第1631行:我们可以直接拿到gtpu报文header, 这是因为在GTPU header前的Ethernet header, IPv4 header, UDP header已经BUFFER_ADVANCE这个action被剥离。

第1635 - 1654行:合法性检查,确认是GTP-U v1 header。

地1657行:我们直接通过flow_id字段拿到gtpu tunnel id。如果没有硬件的加速, 我们需要通过hash表查找tunnel index。

第1572行:指定next node index。

我们可以使用VPP的trace来直观的观察到被硬件加速后的处理流程:

Intel E810 DDP在VPP offload加速框架中的应用

Figure 6: show trace 

新的处理流程如下图红色箭头所示,我们看到在硬件加速后我们跳过了大量的node,因而一定会获得性能提升:

Intel E810 DDP在VPP offload加速框架中的应用

Figure 7: E810加速VPP GTP-U处理

下面是硬件加速前后throughput变化对比图:

测试环境:

CPU:Intel(R) Xeon(R) Platinum 8280M CPU @ 2.70GHz, single core

Memory: DDR4 2666, 1G hugepage

NIC: Intel E810 25G*2

VPP: 20.05

DPDK: 20.05

Intel E810 DDP在VPP offload加速框架中的应用

Figure 8: 不同报文长度下的性能对比

Intel E810 DDP在VPP offload加速框架中的应用

Figure 9: 多flow下的性能对比

图8是不同长度的GTP-U报文处理能力对比图。我们看到在小包下使用Flow offload可以获得非常大的加速收益。

图9是固定长度(128 Bytes), 多条GTP-u tunnel下的处理能力对比,我们可以看到Flow offload同样带来了非常大的性能提升。

总结

通过上面的文字大家应该对VPP的硬件offload加速框架和Intel E810网卡的DDP功能有了初步的认识,并且通过简单明了的性能对比图感受了硬件加速的带来的巨大受益。实际上Intel E810 DDP还有丰富的硬件加速功能是这篇文章没有覆盖到的。在后续的Advanced RSS介绍文章中,我们会利用E810精细的RSS配置能力给大家演示如何进一步加速报文处理。

Intel E810 DDP在VPP offload加速框架中的应用

转载须知

DPDK与SPDK开源社区公众号文章转载声明

推荐阅读

英特尔®以太网控制器E810介绍:面向5G核心网络

Intel E810 DDP在VPP offload加速框架中的应用

Intel E810 DDP在VPP offload加速框架中的应用

你的一个“分享”

让我们之间的距离又近了一步