《可编程数据平面:抽象、架构、算法与应用》是TechRxiv上一篇关于网络数据面编程的综述性文章,内容非常全面详实。本译文有删改。
原始论文链接如下:https://doi.org/10.36227/techrxiv.12894677.v1
可编程网络数据平面综述
可编程数据面用于对网络数据包的底层处理微架构进行重构,是面向未来快速协议创新的网络处理场景的关键驱动因素。本文详细调查了可编程网络技术的设计与实现最新的研究趋势和热点问题,通过架构、抽象、算法和应用四个角度来呈现给大家。
1 介绍
计算机网络连接整个IT基础设施,网络设备(网卡、交换机和路由器等)被部署在不同的环境中,支持各类场景,也受制于各类场景需求,在此基础上再保证最优的性能。网络处理有两种发展趋势:
- 定制化趋势,允许网络设备为特定任务定制优化;
- 通用化趋势,使得网络设备更加通用化,面向更多的场景,以此降低成本。
这两个几乎相反的发展趋势,共同推动了可编程网络设备的发展。
可编程性使得供应商和运营商之间的关系发生了重大变化。可编程性使得运营商不必等待传统网络设备长达数年的从研发到发布的周期,当需要推出新功能的时候,开发工程师可以通过设备的编程接口快速开发并部署新功能。同时,可编程性使得供应商不必为各种各样不同的客户需求定制网络设备,可以把精力投入到优化一组定义明确的基础构建块。这些基础构建块使得硬件实现和业务功能解耦,运营商的开发工程师通过这些构建块来实现自定义逻辑。
新一代的可编程设备对运营商来说特别有用处。大规模的云计算、大数据应用以及大规模机器学习,还有无处不在的物联网以及5G的广泛部署。软件定义网络(SDN)、边缘计算、网络功能虚拟化(NFV)等服务变得更加的普遍,这些应用迫使运营商采用新的方法来构建通信网络。总的来说,需要网络设备在目前已经支持的功能之上,持续不断的加入新的协议和功能集,这些特征包括隧道、负载平衡、复杂过滤和强制QoS约束等。
用传统定制ASIC的设备支持如此广泛的特征集,来满足运营商所需要的灵活性、动态性、性能和效率,需要设备供应商谨慎而昂贵的研发努力,包括定制ASIC的设计、制造、测试和部署[137, 177],这带来了两个方面的问题:
- 首先,推出新功能需要高昂的成本,而且速度缓慢。这迫使供应商只会在某个特性被广泛需求时才会支持它,这意味着更多小范围的需求不会被满足,这样会阻碍运营商的功能创新。
- 其次,设备的包处理逻辑中实现的每一个网络协议都会导致效率低下,这是由于花费了宝贵的内存空间、CPU周期等晶体管资源实现了很多的功能,而这些功能只有一小部分会被运营商使用到。
可编程网络设备可以解决这些问题,允许对设备功能重配置。可编程性对于网络设备的软硬件都很重要:
- 一方面,基于软件的网络交换机运行在通用CPU上,通过大量的处理原语集来支持可重构性,各种流水线可以通过标准编程实现[82, 135, 144, 160, 170]。利用IO框架的优化[87, 169],这些可编程的软件交换机可以在单个服务器上实现数十Gbps的转发能力。
- 另一方面,在数百Gbps的领域,则是可编程设备的领域,如可编程网卡(智能网卡) [86, 150, 151, 209]和可编程交换机[1, 6, 21]。可编程交换机提供了各种低级别的原语,可以使用特定领域编程语言[30]或通用语言的某种扩展来开发复杂的网络功能[53, 179]。
虽然可编程数据平面技术已经得到了大量的使用,但围绕着这项技术的许多问题仍未得到解答:
- 如何适应和采用基本的包处理原语,以支持高性能网络应用的广泛选择?
- 如何避免将复杂的处理逻辑暴露给用户,以实现简单、安全和可验证的配置?
- 如何抽象、复制和监控嵌入到处理逻辑中的短暂的包处理状态?
- 哪些应用程序和场景获益最大?
这些问题是目前网络社区中最活跃的话题。
追随者[105]的步伐,在本文中,我们对可编程网络的软件和硬件的当前技术、应用、趋势等进行了调查。我们将讨论常用的架构和抽象以及采用的设计、应用程序和算法方案。最后,论文提供了一个在线阅读列表[140],该列表将在持续不断的更新。我们的重点是数据平面,特别是数据平面内负责执行转发决策的可重构数据包处理功能;对于控制平面设计和SDN整体的综合调查,见[57,111,153,210]。
2 可编程数据面
2.1 控制面数据面的分离
传统的网络设备,其功能在逻辑上分为一个设备控制平面和设备数据平面。设备控制平面负责建立报文处理策略(如报文转发、报文重写等)、设备管理(如设备健康检查、设备维护等)。设备数据平面负责执行控制平面设定的数据包处理策略,通常对性能有很高要求。一个特定的网络范围内,各个设备的控制平面通过一个分布式路由协议交互,通过这种交互,创造了一个单一网络控制平面的错觉,以分布式的方式执行一个虚拟的全局包转发策略。图1(a)展示了网络和设备两个层级的控制和数据平面的架构。
(a) 传统网络架构中网络数据平面与设备数据平面的概念可视化
(b) 软件定义网络中网络控制平面和数据平面的分离
图1 传统和SDN的网络架构
随着软件定义网络(SDN)的引入[57,210],网络控制平面已经作为一个独立的实体出现,一个逻辑上集中的控制器,一些设备控制平面的功能被剥离出来,并转移到这个网络层级的功能。网络控制平面负责:
- 维护处于数据平面的设备清单;
- 通过一个北向的控制接口,接受高层级的全网策略;
- 编译这些全网策略为每个设备的包处理策略;
- 最后,通过南向控制接口,把这些策略下发给设备。
在这个体系中,单个交换机(或转发节点[3])不需要实现维护包转发策略所需的所有逻辑,例如,它们不运行路由协议来建立路由表;相反,他们从网络控制平面获得这些预先计算好的策略。在这里,控制器-交换机通信通过一个标准化的南向API来处理,如OpenFlow[138],ForCES[3],P4Runtime[155],或Open vSwitch数据库管理协议[4]。图1(b)描述了这个体系,需要注意的是,设备控制平面在SDN框架中并没有完全消失;它仍然负责实现与远程网络控制平面通信的控制通道,并管理设备数据平面(参见[43]关于控制平面和数据平面完全设备级分离的讨论)。
2.2 数据面功能
设备数据平面对网络数据包进行一系列的处理,包括数据包解析、确定操作的顺序,并根据这些操作的结果转发。报文处理包括解析、分类、修改、分离、转发等基本功能步骤。在基本功能之上,大多数包处理系统可以提供额外的功能,如调度、过滤、计量或流量整形。
- 解析是在数据包缓冲区中定位协议包头,并将相关包头字段提取到数据包描述符(元数据)中的过程。
- 然后在分类时使用这些值,以便将数据包与相应的转发策略匹配,转发策略描述了应用于数据包的转发决策(例如,使用哪个输出端口)和需要的数据包修改操作(例如,重写包头字段)。
- 修改步骤使用分类期间检索到的操作,还可能包括某些内部状态更新,例如增加流量计数器。一旦所有的修改完成,就可以从包描述符中重新生成新的包头。
- 最后在转发步骤中,信息包被发送到输出端口。
这个步骤可能包括调度策略的应用,例如,执行网络级别的QoS策略,以及流量整形,以限制一个流/用户可能消耗的网络资源数量。
这些步骤可以按照预期的顺序执行;然而,根据实现和底层设备的不同,某个包的某些处理操作可能会发生多次。例如,解析只能检查数据包的前几个字节,并且只有在对已解析的数据执行分类和修改/更新步骤之后,剩余的字节才可能经历一个新的解析步骤。分类-修改周期也可以重复多次,或者通过依次排序多个包处理阶段,或者通过将包再循环到流水线的入口,再进行附加处理。
2.3 数据面可编程
传统的网络设备中,数据平面功能深深地嵌入到设备的硬件和软件中,数据平面的功能通常不能在设备的生命周期内更改。对于基于软件的包处理系统,供应商的软件更新需要改变数据平面的功能。这种固定的功能实际上影响所有的数据平面操作:
- 可以加载到匹配操作表中的条目的格式和语义是固定的;
- 设备只能理解有限的协议头和字段集。
例如,一个以太网交换机不处理第3层字段,一个过时的路由器将不支持IPv6或QuiC。可采用的处理动作类型和执行顺序由设备供应商预先设置;通常,在执行ACL和执行组处理之前,MAC处理之后是IP查找阶段。这使得,从VxLAN隧道解封装的数据包采用IP路由查找是不可能的。最后,队列规则(例如,FIFO或仅优先队列,不支持BBR[35])或数据面可用的监视信息类型是预先确定的。
通过SDN和越来越多通用硬件设计的出现,当前的设备数据平面可以从网络控制平面部分或全部重新配置。这一发展推动了可编程数据平面的发展,可编程数据平面指的是允许基本包处理功能以编程方式动态改变的网络设备。在本文中,我们使用以下可编程数据平面的定义:
数据平面可编程性是指网络设备通过标准化API向控制平面公开底层包处理逻辑的能力,以便系统地、快速地、全面地重新配置。
需要强调的是,数据平面可编程性不是一个二进制属性。在某种程度上,配置一个传统的“固定功能”设备可以看作是数据平面编程。由于数据平面配置和可编程性之间的确切界限仍在社区中被积极讨论[14,136],在接下来的讨论中,我们对这个术语进行了广泛的解释,并将重点放在设备包处理功能所允许的修改类型的全面性上。相应地,我们将重点关注以下几个方面:
- 新的数据平面架构、抽象和算法,允许数据平面功能充分而全面的重配置,包括新的包头字段的解析、动态匹配包头字段定义,并且暴露新的数据包处理原语给控制面。这些措施共同作用,方便部署全新的网络协议给用户。
- 利用可编程性,可以在数据平面完全实现新应用,包括监测和遥测、大规模数据处理和机器学习,甚至完全在网络设备中实现键值存储,控制平面不需要或只需要最小干预。
3 架构
虽然数据平面的可编程性最初主要针对交换机(特别是数据中心设置),但今天,更广泛的设备和功能允许低层级的可编程。可编程数据平面硬件或软件不仅用于包交换,而且越来越多地用于通用网络处理和中间件功能(如防火墙或负载平衡器)[48,123,132]。此外,可编程网卡(SmartNIC)使网络边缘的数据平面可编程性成为可能。这些设备的可编程数据平面可以在几种不同架构上实现,或利用多种架构混合设计。
在硬件设计中,数据平面功能可以在ASIC、FPGA或网络处理器(NP)中实现。这些平台通常都是高性能的,这是由于专用的硬件组件,如用于高效的包匹配的TCAM[96]。另一方面,软件数据平面设备使用快速分组分类算法和数据结构,在通用CPU上执行整个处理逻辑[45,56,77,82,144,157,160,178]。硬件和软件数据平面之间的区别有点模糊。例如,基于硬件的设备仍然可以调用通用CPU(通常称为“慢路径”)来运行底层硬件不支持的或不需要高性能的功能。类似地,现代软件交换机由于效率原因依赖于特定领域的硬件功能的帮助,比如Data Direct I/O (DDIO)、分段卸载(TSO/GSO)、接收侧缩放和接收包转向(RSS/RPS),以及越来越多的SmartNIC卸载,以部分或全部在硬件中运行包处理逻辑。
下面我们将概述可编程数据平面体系结构中的设计要点,以及它们的特征、用例和所做的权衡。图2描述了不同章节之间的概要和高级别联系。
图2 概览:可编程数据面系统的硬件架构通常建构在此基础上
3.1 通用硬件
通用硬件架构和CPU(如x86或ARM)通常用于商用服务器,并大规模部署在数据中心,它们支持非常广泛的包处理任务。例如,电信运营商推进5G蜂窝网络标准和网络功能虚拟化(NFV)的努力[100,13,154]依赖于使用通用服务器执行高性能数据包处理的能力[106,157]。现代虚拟化数据中心通常有运行网络访问层[2,110]的服务器,使用软件交换机将虚拟机连接到物理网络[19,144,160,193]。由这些需求,在过去的几年中,在可编程软件交换机平台建立有效网络虚拟化方面,软件数据包处理,相比传统硬件升级网络设备市场[54,73,162],取得了重大进展。如[VPP[19], BESS[77], FastClick[20], NetBricks[157], PacketShader[78]和ESwitch[144]],用户空间的I/O库(PacketShader[8], NetMap[169],英特尔DPDK [87], RDMA [98], FD.io[56]和带有eBPF[22]的Linux XDP),以及NFV平台[101,112,192,196,207]。
在高层级,数据包处理在服务器是一个简单的进程,它包括将数据包从网卡缓冲区的数据复制到CPU,解析处理,修改/更新步骤之前数据再次复制或移动到另一个网卡缓冲区或一些虚拟接口[123]。在实践中,由于现代服务器硬件的复杂架构,这个过程非常繁琐,因此要为网络应用程序实现高性能,需要考虑底层硬件[10]的架构和特性。例如,现代多处理器系统实现了非均匀内存访问(NUMA)架构,这使得网卡、处理器和内存的相对位置与数据移动的延迟和性能相关[20,152]。对系统内存层次结构的优化可能会导致性能提高或损失几个数量级[19]。
为了加速网络信息包的输入和输出,数据包从网卡到CPU存在几个快捷路径,无论是在软件层面还是在硬件层面。在软件中,可以使用内核旁路将网卡所使用的内存区域映射到用户空间,网卡可以直接将数据包写入用户空间,也可以直接从用户空间读取数据包。这消除了代价高昂的上下文切换和包拷贝,与标准套接字相比,这种机制大大提高了网络性能。然而,使用内核旁路框架的应用程序,如NetMap[169]或Intel DPDK[87],不能使用任何内核网络接口,需要实现它们可能需要的所有包处理功能(例如,TCP堆栈或路由表)。Linux内核(XDP)中的Express Data Path[80]通过允许包处理应用程序在内核中一个受限的执行环境中实现,同时使用一些操作系统主机网络堆栈来缓解这个问题。在硬件层级,现代的网卡实现数据直接I/O (DDIO)[55,85],为了绕过相对较慢的主存直接将接收到的包描述符复制到CPU L3缓存中。最后,由于服务器已经发展到多处理器和多核架构,仔细规划、避免资源冲突对于高性能是非常重要的[196]。
基于上述硬件的属性和约束,软件实现采用了许多技术来有效使用可用的资源[10,123,160]。数据包通常分批处理,以便在处理流水线上分摊争用资源锁的成本,并改善数据局部性。在这里,位置非常重要,特别是对于处理数据包所需要的数据,例如,数据包分类所需要的查找表。此外,还可以通过降低CPU指令缓存的缺失次数,这对于一些指令较多的复杂程序[19]来说是有好处的。其他典型的技术包括采用最小化内存使用的数据结构,以更好地适应缓存[168],调整数据的高速缓存线路,以避免加载多个高速缓存线路的一些额外的字节[144],并在不同的处理器之间分发数据包,以保持流的亲和性,以避免缓存同步问题[101, 192]。
除了这些通用的优化技术,软件实现还可以使用进一步的优化策略来加速包处理[123]。例如,ClickOS [135], FastClick[20]和BESS[77]实现了一个运行到完成的模型,在这个模型中,同一个核上在下一个包处理之前,当前的包必须已经处理完成,而NFVnice[112]使用标准的Linux内核调度程序和反压机制来控制数据包处理函数的执行。不同的是,VPP[19]执行流水线处理,在开始下一个处理步骤之前,对所有同一批数据包要执行完当前的处理步骤。同样,解析、分类和修改/更新步骤也可以根据程序员的需要和期望而相互交织在一起[20,77]。可以使用惰性解析来避免不必要的和代价高昂的解析操作,例如,对于在[22]之前被丢弃的数据包。所有这些不同的方法当然都是可能的,这是由于通用CPU的灵活性,它不要求任何特定的处理模型。
3.2 网络处理器
网络处理器(Network Processors),有时也称为网络处理单元(NPU),是专用的加速器,通常在交换机和网卡中使用。与通用硬件不同,NPU体系结构专门针对网络数据包处理。网络处理器通常包含若干个不同的功能模块。其中一些模块专用于网络相关的操作,比如包负载均衡、加密或表查找。而其他一些硬件资源则专用于可编程组件,这些组件通常用于实现新的网络协议和/或包操作。考虑到它对研究的可用性和对当前数据平面编程抽象的支持,我们将描述Netronome网络功能处理器(NFP)可编程网卡(参见图3)的体系结构,作为NPU的一个例子[151]。
图3 Netronome NFP可编程模块架构
注:一些特殊的硬件块,例如密码学任务,没有被列出
由于网络流量主要是并行工作负载,数据包属于独立的网络流,因此网络处理器通常被优化为使用多个处理核心来执行并行计算。在Netronome术语中,可编程处理核心被称为微型引擎(Micro-Engine, ME)。每个ME有8个线程,它们共享的本地若干KB的内存。ME进一步组织在Island组。每个Island都有几百KB的共享SRAM内存:CLS和CTM内存。这些内存区域用于存放频繁访问的数据,并且需要处理每个网络数据包。最后,网络处理器提供了一个由所有Island共享的内存区域:4MB SRAM的IMEM,以及两个3MB SRAM(用作缓存)与更大的DRAM(称为EMEMs)相结合的内存子系统。这些较大的内存通常承载着网络子系统用来决定如何转发(或删除)网络包的转发表和访问控制列表。所有构建块都通过高速交换Fabric连接,这样MEs就可以与任何其他ME进行通信和同步,而无需考虑它们的位置。当然,跨Island的延时要更长一些,可能会影响当前程序的性能。报文通过PPC (packet processing core)阵列输入和输出系统,PPC对报文进行解析、分类和负载均衡。媒体访问控制(MAC)单元在网络中读写数据包。Netronome NFP支持2 × 40Gbit/s以太网接口。PCIe接口可以通过DMA与主机CPU通信。
与通用服务器类似,网络处理器支持灵活的编程模型,并且对数据包的处理步骤不强制任何特定的顺序。例如,可以在处理开始时只执行几个字节的解析,只有在需要时才继续进一步的解析。同样,由于数据可以存储在处理器内存层次结构的不同层级,所以整个包数据都可以进行处理。然而,与内存层级有关的数据处理对可实现的处理速度有很大的影响,因此在对设备编程时,这是一个非常重要的设计步骤(和限制因素)。
3.3 FPGA
FPGA是基于相互连接的CLB阵列的半导体器件。与ASIC相反,FPGA在制造后可以编程和重新配置,以实现自定义逻辑和任务。虽然ASIC设计通常提供最好的性能,但FPGA由于提高了时钟速度和内存带宽,在许多场景缩小了这一差距[119]。高级综合或专用编译器允许采用C或P4这样的语言来编程FPGA,而不是更复杂和笨重的硬件描述语言,如Verilog[200,203]。高性能和可编程性的平衡使FPGA不仅对原型设计有价值,同时也可以用于生产环境中ASIC设计的替代方案[16,32,118]。在网络环境中,FPGA主要用于网卡上,从服务器上卸载包处理,目的是节省宝贵的CPU周期[60]。
与完全可编程交换机(如Barefoot Tofino ASIC设备)相比,FPGA的可用性和相对较低的成本使学术界对高性能网络数据平面原型特别感兴趣。例如,NetFPGA是一种广泛使用的开源FPGA加速网络接口卡。最新版本(FPGA SUME)将Xilinx Virtex 7 FPGA与4个10Gb以太网端口耦合在一起[209]。在这个领域,最新的一个项目是Corundum[61],它为FPGA上实现100Gbps网卡提供了一个开源平台。Corundum是一个基本的NIC模块和构建块的集合,可以在若干商用FPGA卡上实现。FPGA还进入公有云市场,AWS提供了配备FPGA的虚拟机实例,使得FPGA技术更容易获取。
3.4 ASIC
在ARPANET和互联网的早期,路由和包处理是在软件中进行的[79],互联网的快速发展和不断扩大的规模需要更高效的基于硬件的设计(即ASIC)来跟上不断增长的包处理速度。网络ASIC是一种专门为(在这种情况下)高性能包处理而优化的芯片,专注于实现某个任务所需的最小操作集。事实上,使用ASIC构建的网络设备通常包括第二个通用子系统,例如基于CPU的子系统,以实现设备的监控和控制功能,以及ASIC不支持的更复杂(和不常见的)包处理功能。ASIC中的处理通常称为快速路径,相对应的,由通用子系统完成的处理称为慢路径。
一个典型的ASIC,实现为一个固定的流水线,不同的处理步骤按顺序执行,例如,L2处理是在L3处理或MPLS查找之前。流水线附属的SRAM或TCAM用于存储在各个查找阶段中需要访问的转发规则(如路由条目)。第一代基于ASIC的网络设备的一个典型例子是Juniper M40路由器[58],它通过在一个机箱内逻辑上分离的控制和数据平面组件以及高度定制的交换芯片,提供了40Gbit /s的路由性能。大多数高性能交换机和路由器,如Cisco ASR或Juniper MX系列设备仍然使用固定功能ASIC。虽然这些设备非常高效,但开发周期长且成本高,阻碍了灵活性和创新。
因此,更灵活和可编程的交换芯片架构,如可重构的匹配-动作表(RMT)[31],协议独立的交换架构(PISA)[37],以及具体实现,如英特尔Flexpipe[1],Barefoot Tofino[21],或Cavium Xpliant[6],都开始了可编程数据平面的尝试。可编程数据平面设备允许网络运营商以编程方式改变低级别数据平面功能,以支持新的或自定义协议,实现自定义转发或调度逻辑,或启用新的应用程序,然后完全在硬件中执行。
这些RISC启发的可编程ASIC被组织成可编程匹配阶段的流水线:
- 在数据包进入流水线之前,可编程解析器将数据包缓冲区分解为单独的协议头。
- 然后,匹配操作阶段由内存块组成,这些内存块实现了用于匹配提取的包头的表,以及用于修改包头、执行简单计算或更新内部状态等操作的算术逻辑单元(ALU)。这些表可能进一步具有不同的匹配能力,这取决于它们在硬件中实现的方式。例如,精确匹配的表可以在SRAM中实现为哈希表,而通配符匹配表通常使用更昂贵的TCAM实现。
- 在流水线的末尾,分离程序在将包发送到接口或传递到后续流水线之前,再次序列化各个头(可能已更改)。
在许多交换机中,通常至少有两个这样的流水线,一个入口流水线和一个出口流水线[37]。图4描述了可编程交换机的RMT参考设计。我们将在4.1.2节中进一步阐述本设计中使用的匹配-动作表抽象。
图4 类RMT交换ASIC架构
3.5 混合架构
除了上面讨论的平台之外,最近有人还提出了一些有趣的混合软硬件设计,这些设计将现有的概念与来自分布式系统和多处理器设计的新想法混合在一起。虽然大家通常认为可编程网络处理器的性能低于集成电路,但有文献质疑这一假设,并从经验上在分析和寻找这些开销。Pongrácz等人[162]的研究表明可编程性的开销可以相对较低。此外,可编程芯片和定制芯片之间的性能差距不是由可编程性本身引起的,而是因为可编程网络处理器通常针对更复杂的场景进行了调整。
在混合架构方面的工作,以前也探索了使用GPU加速的可能性。对于许多应用程序,例如网络地址转换或分析,包处理工作负载可以使用包的fkow-key进行划分(例如,IP五元组)。这使得包处理成为一种可大规模并行的工作负载,原则上适合在GPU等多线程硬件上实现[78]。然而,这种策略的优点和缺点正在社区中进行积极的讨论[68,99]。Kalia等人[99]认为,对于许多应用来说,好处与其说来自GPU硬件本身,不如说是来自用CUDA或OpenCL等语言来表述问题,这些语言通过大量并发来隐藏内存延迟和向量化。作者证明,当对不同算法实现采用类似的优化风格时,仅使用CPU的实现比在GPU上运行的版本更节省资源。Go等人对Kalia等人提出的问题做出了回答[68]。他们的工作发现,有八个流行算法广泛应用于网络应用程序:
- 有很多的计算算法,受益于GPU的并行计算能力;
- GPU的性能缺点主要是因为需要PCIe总线将数据从主内存移到GPU。
尽管如此,应该注意的是,在[68]中有几个用例,需要在包数据上运行一些加密算法。现在,这些工作负载可以通过CPU和网卡提供的专用硬件来更好地处理,从而减少了基于GPU的包处理加速的潜在应用领域。
许多应用程序适合于软硬件混合协同设计。其中之一是转发表优化。在[25,102]中,研究了通过结合更优的硬件和软件处理,即使在大规模规则表和快速更新的情况下也可以实现高速转发。特别是,CacheFlow系统[102]将最流行的规则缓存在一个小型TCAM中,并依赖软件来处理少量的缓存失效流量。作者观察到,不能盲目地应用现有的缓存替换算法,因为规则与重叠模式之间存在依赖性。必须打破相当长的依赖链,以缓存较小的规则组,同时保留策略的语义。
通常利用软硬件混合设计的应用程序的另一个例子是网络遥测和分析系统。这些系统必须在性能和灵活性之间进行艰难的权衡。虽然可以运行一些基本分析查询(例如,使用示意图) 在高速率的包处理的数据平面,系统通常遵循一个混合方法,分析硬件和软件之间的任务划分。这受益于高性能的硬件,以及可编程性、并发测量功能,在软件运行时可配置查询。采用这种设计的系统有*Flow[188]、Sonata[75]和Marple[149]。我们将在第6.1节中进一步阐述这些系统。
3.6 可编程NIC
与之前提出的架构正交的可编程NIC,作为可编程数据平面的一个新平台,在过去的几年里在网络界引起了极大的关注。这些设备(通常称为SmartNICs)通常是围绕NPU和FPGA构建的。可编程网卡的设计和操作涉及到与它们提供的主机网络通信接口和操作系统集成相关的一系列有趣的功能。因此,SmartNIC非常适合于卸载端到端机制(如拥塞控制)和应用程序,如键值存储和虚拟化。一般来说,现代网卡实现了硬件中的各种特性,比如协议卸载、多核支持、流量控制和自虚拟化。在下面,我们只关注架构设计论文,并将应用程序(如虚拟化支持)推迟到第6章节。
如果没有专门和特定于设备的优化,操作系统通常无法有效地利用和管理现代NIC所提供的大量硬件资源。为了重新激活对网卡设计的讨论,并克服目前的缺点,Shinde等人[182]开发了一个网络堆栈,它代表了网络硬件的物理能力,以及作为数据流图的机器当前协议状态,。在硬件中实现NIC特性会带来一些挑战,包括协议依赖、有限的硬件资源和不完整/有BUG/不兼容的实现等。由于设计复杂性的增加,硬件网卡的缓慢发展也可能跟不上新的协议和快速变化的网络架构。软网卡架构[77]被设计用来填补硬件能力和用户需求之间的差距。软网卡只假定硬件的流式数据处理功能,在几个专用处理器核上实现复杂的NIC特性。
一个主要的关注点是简化服务器应用程序的开发,将计算和数据卸载到NIC加速器。Floem[161]是一组用于NIC加速应用程序的编程抽象,它简化了数据放置和缓存、代码的并行划分以及跨设备程序组件之间的通信策略。它还提供了逻辑和物理队列、全局每个包状态、远程缓存以及与外部应用程序代码的接口的抽象。
与通用系统相比,SmartNIC卸载可以利用专门的并行处理器、用于许多网络任务的专用子系统(例如,流量控制或加密)以及高效的主机通信,从而带来显著的性能优势。在[126]中考虑了在SmartNIC上卸载分布式应用程序的不同用例。iPipe是一个通用的基于角色的卸载框架,用于在普通智能设备上运行分布式应用程序。它是围绕一个混合调度器构建的,该调度器结合了先到先服务和亏缺RR策略,以微秒级的精度在智能网卡上调度卸载任务。
NIC的一个基本挑战是与噪声邻居问题有关。Kumar等人[114]系统地描述了性能隔离如何破坏虚拟化堆栈,并找到了隔离和效率之间的基本权衡。一种新的NIC设计,PicNIC,即可预测的虚拟化NIC,在通常情况下有效地共享资源,同时快速响应以确保隔离,以便为隔离的工作负载提供可预测的性能。
另一个用例是,用于数据中心执行基于微服务的应用程序的SmartNIC加速服务器的上下文中。通过将合适的微服务卸载到SmartNIC的低功耗处理器,可以在不损失延迟的情况下提高服务器的能效。利用这种方法的系统是E3[128],它遵循Azure Service Fabric微服务平台的设计理念,并将关键的系统组件扩展到SmartNIC。E3解决了与此体系结构相关的挑战,这些挑战涉及负载平衡工作负载、在异构硬件上放置微服务以及管理共享SmartNIC资源上的冲突。
包处理应用程序固有的高内存和处理开销的主要原因是普通网卡对内存和I/O资源的低效使用。FlexNIC[104]实现了一个新的网络DMA接口,允许操作系统和应用程序安装简单的数据包处理规则到网卡,然后在将数据包传输到主机内存前执行这些操作。
作者:Chaobo
来源:https://mp.weixin.qq.com/s/p3lKSQ8QH8QJcrEJsoDYnw
作者微信公众号
相关文章推荐
更多软硬件技术干货请关注软硬件融合专栏。