本文为腾讯研发工程师张军伟的大作。
随着5G应用的发展,高带宽低延迟的诉求会越来越强烈,网关设备作为流量汇聚点,更能深刻感受到这种压力。发展了近十年的CPU+DPDK模式,在性能和成本双重压力下,也面临越来越大的挑战。在这样的背景下,各种智能硬件随之登场,提供各种各样的硬件offload方案。
Region EIP网关是TGW(注:Tencent GateWay)的一部分。TGW承载着公网弹性IP和负载均衡业务,负责公网和vpc网络的转换的同时,还要承担起带宽限速和流量计费的功能。我们结合Region EIP业务需求,经过技术调研,最后采用了P4+Tofino芯片可编程交换机作为Region EIP的下一代网关。
Region EIP X86网络架构
Region EIP网关一边与IDC内的vpc网络互联,一边与公网网络相连,是内外网转换的桥头堡。Region EIP之前的网关使用的是X86服务器,其网络拓扑如下图所示。
这种集群的架构设计有几个特点:
下面结合region EIP的业务,介绍下我们在P4可编程交换机网关上的一些实践和总结。
P4简介
网上关于P4入门的介绍材料很多,这里只做原理性的介绍。(参考阅读:P4语言教学视频和P4系列教程)P4是一种网络数据面编程语言的格式,其目的是统一数据面的编程结构,屏蔽不同硬件制造商间的差异。Tofino是目前比较成熟的P4芯片,是由Barefoot这家公司生产的,目前已经被Intel收购。我们常用的Tofino交换机是设备制造商提供的。
1. P4开发流程:
2. Pipeline:
Tofino芯片也有流水线(pipeline)的概念,一条流水线表示一组完整的数据处理流程,这一概念和传统交换机中的的流水线是相似的。如下图所示,一个pipeline包含两个阶段:ingress和egress。
3. 可编程的Ingress/Egress:
Ingress/Egress每个阶段都可被划分成三个可编程模块:parser、ingress/egress、deparser。P4程序也基本是针对这六个模块进行编程的。每个报文经过这些处理单元时候,始终都有一块内存用于存放metadata数据,缓存中间处理数据和结果,这些meta信息可以是action的输出结果,也可以是下一个table里match的输入。
实践中,有时候会通过不同pipeline还有两种不同的用法,一类是不同pipeline承载不同功能,类似nfv的想法。另一种方法是"折叠",通过多个pipeline接力,串联使用。前者可以承载更大的带宽和网口,后者可以实现更复杂的功能逻辑,也可以获取更大的表容量。具体P4技术细节,推荐大家看一下Tofino的培训文档(见上)。
设备简介
我们目前使用的P4交换机其芯片是Tofino1代,我们有时候简称TF。交换机端口可以用被分为两类:管理口和数据口。
管理口用来链接带外和管理网,这两个口对内直接连通交换机上的CPU。带外口主要是用来做服务器设备硬件管理,上架初始化等工作的。通过管理口,交换机跟region EIP管控系统进行交互,接受下发的管理命令、业务变更等消息,并及时上报设备状态、端口流量、业务统计等数据。
交换机还提供了32个100G的网口。这些口是从Tofino交换芯片上引出来的,也正是我们可编程的部分网口。
项目收益
作为新技术的探索性项目, 我们使用P4可编程交换机从成本和性能两个维度带来了很大的收益。
Region EIP P4的网络架构
相比x86网关设备,P4可编程交换机网关的架构相对简单些。主要区别是:
目前交换机有32个100G口,可以支持3.2T到6.4T的转发能力。我们仅使用其中16个口,主要是为了让规则容量和带宽相匹配。目前交换机规则容量是瓶颈,带宽很富余。当规则容量达到瓶颈后,再增加网口去扩带宽,不仅没法提升整体收益的,反而造成网络端口的浪费。
P4可编程交换机网关,省略XGWW和XGWL,减少网络层级,降低网络复杂度,节约建设成本,相同规格下,机器成本可节省一半。与此同时保留了原有x86集群的可扩展性和容灾备份的能力。具体集群容量可以根据业务和容灾备份要求,进行按需扩展,可以两台或者多台,组成一个集群。
Region EIP的处理流程
网关设备可以被分为有状态网关和无状态网关两类。经常有同学问怎么算无状态的?这个我也没找到标准的出处,结合我个人理解做个解释。
相同的一个网络报文,在任何时间,经过任一台设备(集群里有多台设备)处理后,结果相同,就可以算是无状态的逻辑。比如tunnel封装,路由查找都是无状态的,而full nat则是有状态。限速是一个例外,限速导致的丢包,不能算有状态的。一个网关设备上的处理逻辑全部是无状态的,那就是个无状态的网关,否则就是个有状态的。所以,我们把Region EIP的归为无状态的网关。
控制面逻辑
我们把网关从功能处理上,可以被划分为控制面和数据面两个大模块。
控制面主要负责交换机上业务的配置管理、状态转换等,不处理具体的报文。数据面根据业务面下发的规则,对具体的报文进行转换和过滤,侧重报文转发的功能和性能。
Region EIP的控制面可以分为两部分,一部分集中部署,另外一部分分布在每台设备上。在接收到网关集群控制系统下发的业务规则后,会在交换机上做一些规则转换,把业务规则转换为一系列TF上的表项和命令,下发到TF芯片上,同时也根据控制系统要求主动或者被动采集、汇总、转换设备上的统计信息(如EIP流量,端口状态,资源利用率等)发送给指定的服务(如监控,计费等)去处理。整个逻辑如下图,灰色框图部分所示。
数据面逻辑
从业务使用角度,我们把交换机的流量分为4类场景:
BF芯片上承载着后面三种场景的业务流量,其处理流程,被分成两部分:平台支撑和EIP业务。
EIP业务模块是指Region EIP独有的那部分业务逻辑。比如EIP转换(overlay信息和underlay信息)功能。这个模块不仅仅要求功能,同时对容量和性能也有很高的要求。Region EIP的主要的业务逻辑,可以分为三部分:
平台支撑模块跟业务相对比较松散,将来可以供其他网关设备复用。这部分功能有报文镜像,CPU报文处理等。以CPU处理为例,既要转发CPU发往TF端口的,也要处理反向报文。把TF端口上收到的报文,进行分类过滤,把发往CPU的报文识别出来,并转发给CPU口。这部分功能是TGW的代码库里的一部分,目前正在OTeam(注:腾讯内部开源协同小组)的协助下,进行技术方案讨论,后续会贡献到公司可编程交换机(TF)平台上,并与其他平台功能进行融合和集成。
整个流程中,每个报文都有一个预定义的metadata信息,用来缓存一些查询结果,比如output口序号,GRE报文字段等,最后tunnel模块会根据metadata里的数据,封装外层GRE头并发送。有时候异常报文或者配置错误,导致报文查找失败或者超过限速丢包时,会统计各类异常,然后再丢弃报文。
P4编程的一点变化
硬件是把双刃剑:硬件offload能够实现软件无法达到的性能和低延迟,同时也在软件设计方面带来了一些变化。在我们方案设计时,需要兼顾这些变化。有时候,还需要我们做比较大的调整,才能把硬件的优势完全体现出来。下面结合两个比较有代表性的方法,解释一下。
"傻快”
虽然大家都习惯称各种offload方案为智能网卡,智能(可编程)交换机,可以达到10倍甚至100倍的性能提升,能做到us级别的延迟,性能很强,经常被称为高性能的实现方案。但相比软件来说,他们只能实现些简单逻辑,因为我称他们为"傻快"。那我们应该怎么设计P4处理逻辑,才能更好的发挥硬件"傻快"的优势?我们采用“拆”:拆分功能表,让每个表功能单一,利用性能优势,提高灵活性。
使用软件(DPDK)处理时候,我们为了追求高性能,充分利用cache的性能,往往做尽可能减少表的数量和查找。简单说,就是"拿内存换性能”。一般把多个逻辑整合到一张大的会话表里,把必需的信息放到一个大而全的结构体里,通过一次查找,找到这个结构体。比如EIP的vpc信息,统计,限速等汇聚在一个结构体里,根据EIP进行一次查找,就把主要的信息获取到,然后对报文进行处理。避免多次查找,降低查找和cache更新造成的性能损耗。
在P4编程时候,这样的设计的劣势会因为硬件的特性被放大。因为:
我们把小的功能单元拆成多个单独的table,利用多级table进行匹配查找。利用硬件的高性能,抵消掉多次查找的损耗。因为硬件table查找延迟是ns级别,增加的延迟可以忽略不计。这样使得系统保持高性能的同时,还能做的更灵活,减少信息的冗余,使用10M左右的内存,存放了6W个EIP的规则,相比x86节省了不少内存。
数据面自学习和硬件offload
“自学习”一直以来都是很有争议的话题。就像“tab宽度是到底应该几个字节一样”,公说公有理婆说婆有理。先举个例子,出于容灾和调度的考虑,有时候我们需要把一个cvm从一台母机热迁移到另一台母机。CVM热迁移时候如何保证外网通信平滑顺畅,需要网关和母机侧协同处理。一般有"自学习"和"延迟代转"两类方法。
"自学习"让切换变得更顺畅, 特别是在一些灾备场景下,能够做到极快的切换时间。但同时也增加了系统之间的相互依赖。在可编程硬件场景下会让这个矛盾更突出。
硬件的特点是“傻快”。目前的硬件能够识别解析报文,但是很难做到根据报文特定字段去更新硬件表项内容。个别FPGA可能通过定制化开发实现一些简单的学习功能,很难做到比较普适。此外也有些软硬件结合的方案来实现自学习功能。比如:
软硬件学习的方案有一个潜在的风险就是upcall的流量瞬间太大,产生成为瓶颈。在一些极端异常情况下,考虑不周或者控制不细致,可能会造成”雪崩“。
相对这些方案,“延迟代转“的方式对硬件基本无依赖,更容易在可编程硬件上落地。
1、TF芯片的优势
在P4的开发过程中,随着对芯片熟悉程度的深入,我们也逐渐意识到到芯片的优势和一些缺陷。P4带来的优势在一些大带宽的场景下体现的更明显。
a. 大带宽&高性能:
目前基于Tofino芯片的100G端口交换机,单机有3.2T到6.4T带宽,小包线速(这里的小包是套用厂家的宣传词而已,特指256字节,不是通常的64字节:)报文转发。相当于单颗芯片大约1GPPS的转发性能,跟x86服务器相比,单核大约有近百倍的提升,整机性能有数倍提升。
b. 编码更简洁
使用DPDK编写数据面转发的时候, 经常使用一些优化的方法,如 :
通过这些方法的优化,提升了性能,也给开发设置了很多限制,增加开发的难度。在考虑业务处理逻辑时,还要兼顾优化性能。通过多核线性扩展支持更高性能,同时又要尽量避免核和核之间的交互,往往最后还要做些妥协。比如一个EIP的流量我们分到多个CPU上处理, 限速的时候就很难做到很精准。相比之下,P4的编程是单线程模型,限制也少了很多。P4编程更多关注的功能实现,通过match-action-table的模式实现数据转发功能。
2、TF芯片的局限
在Tonifo芯片编程中,我们也遇到过一些TF本身设计上的局限。这些局限需要我们在设计方案时候有所了解,避免踩坑。
最后作为一种新的设备形态,在引入到生产环境中,还经常会遇到一些流程和管理方面的问题,需要多部门协同,打通流程规范。比如经常被问到的:P4设备是交换机还是服务器?以往网关设备都是服务器,现在用交换机做网关,如何对设备进行管理?IP地址分配、机器交付和维修、成本核算等,都经常被问到这个问题。这些问题不同于高难度的技术问题,但也很重要,会影响产品的上线和运营。目前Oteam团队在着手推动这些问题的解决。