系统厂商在为满足未来的扩展性和集成挑战而研究下一代数据包处理技术时,面临着多种架构选择。目前有两种常用架构:通用多核架构和专用数据流架构。
每种架构都有其长处。通常情况是,每个系统供应商的设计决策归根到底都是平台的预期任务。从本质上讲,决策过程就是根据应用选择架构的过程。
数据包处理背景
数据包处理是数据密集型操作,需要优化的硬件。在宽带互联网出现之前,通用处理器既被用于控制会话处理又肩负用户流量的数据包处理。
但是,由数据和控制平面共享中央处理单元(CPU)资源的作法已被证明难以满足随带宽需求增长带来的更高要求。对于交换机和路由器来说,数据平面的数据包处理任务已转交给定制的固定功能ASIC或可编程网络处理器单元(NPU)。从而把通用CPU解放出来以专门应对控制平面任务。
有几家NPU供应商一直在试图针对2-4层包处理任务优化通用处理器,并提供集成了网络硬件(即物理层、媒体存取控制器和表存储器)以及用于特定任务(即散列)的硬件引擎的多核架构。在20世纪末20世纪初,MMC、C-Port和英特尔的IXP部门等机构开发了这类器件。
虽然这些产品各有不同,但它们的基本架构是相同的。通过降低复杂性,处理器核能够得到简化,从而使得器件内可以集成数十个处理器核以满足更高的并行要求。
除了极少数例外,这些NPU供应商在商业上都不成功。根本原因是这些NPU不能有效地满足超过10Gbps的网络应用对处理能力和存储器访问方面的要求。
现在,当我们迈进2010年,我们看到了旨在应对网络处理市场的新一代多核供应商的出现。虽然CMOS技术、存储器带宽和时钟周期性能得到了提升,但它们仍基于同样的基本架构。因此,这些新兴公司能期待获得更大的成功吗?
这将取决于它们针对的是哪类应用。现在的网络节点不仅处理2-4层的数据包,也需在更高层进行处理以支持服务和增加安全性。我们将研究其中的差异,以及对任何给定应用来说,为什么某些架构比其它架构效果更好。
线速包处理
2-4层数据包处理不同于其它网络应用(表1)。首先,能对所有大小的数据包进行线速处理是一个关键目标。现代路由器和交换机被设计为拥有广泛的网络功能,服务提供商期望能同时获得这些功能且不降低性能。
第二,数据平面将数据包视为独立个体,允许高度并行的处理。对一个100Gbps应用来说,网络处理器需要每秒处理1.5亿个数据包以确保线速性能。处理器10μs的延时相当于1,500个数据包的并行处理时间。
第三,数据平面程序需要高I/O存储器访问带宽以完成表查询转发、状态更新及其它处理。在高速平台上,数据包到达间隔时间非常短,因而对存储器延时提出了苛刻要求。对于小型数据包来说,执行这些任务的存储器带宽是链路带宽的数倍。
最后,当今网络的功耗很高。出于运营成本和环保两方面的考虑,服务提供商在煞费苦心地追求最佳的每瓦性能。考虑到包处理的特点,应以线速性能条件下、每瓦功率可实现的最高性能来衡量最有效的架构。
服务和安全处理特征
与数据包处理相近的市场是服务和安全处理。这些应用具有与2-4层数据包处理不同的特点。因此,可实施其它的硬件设计优化。
在客户机-服务器方式中,这些应用终止和处理主机至主机协议,或在中间网络节点(即防火墙、负载均衡器、入侵和防御系统)上处理重组的净载数据包数据。这些产品必须能够跨数据包边界工作,因为它们通常需要在更大的数据量上进行更大规模的操作,这将导致数据并行性较低。另一方面,相对所处理的数据而言,这类所需的I/O存储器带宽较低。
架构比较
NPU承诺可提供定制ASIC的性能,且具有通用处理器的可编程能力。但是,比较处理器的性能较困难,因为理论上的最大值通常与真实世界关联不大。此外,有效利用可用处理性能的能力,以及与处理容量相关的I/O存储器的利用情况也是影响处理器性能的因素。
因此,这种比较必须从设计层面开始。我们首先从一个通用多核NPU架构开始。多核NPU架构衍生于通用处理器架构,该架构希望通过增加处理器核来实现更高的并行处理能力。降低复杂性并移除当今通用处理器架构内不必要的功能(即浮点指令)可实现这一目标。
多核NPU架构对处理器核进行了专门分组。这些内核或被分组到各个并行池或以串行方式进行流水线排列(图1)。NPU供应商在设计时,允许架构对这种分组实施严格控制以优化性能。
图1:处理器核采用流水线或者并行池架构,混合模式也很常见。
如果定义得较松散,这种分组就允许程序员更自由地在内核间划分任务,最终结果是以性能控制为代价提供更大的灵活性。在许多情况下,多核网络处理器最终会以流水线和并行池的混合架构形态出现。
处理器核的分组对编程模式有重要影响。并行池带有相关的多线程编程模式,其中每个处理器核可运行一个或多个线程。从本质上讲就是程序获取一个数据包并对其执行一系列操作。
一旦处理完一个数据包,程序就准备好按顺序取用下一个数据包。程序员通过把数据包分配给不同的并行池来有效利用处理资源。线程之间的同步是程序员的另一个关键系统任务。
流水线模式处理数据平面应用,并将其划分为不同的处理任务(即:分类、修改、隧道处理以及状态更新)。然后,每个任务被映射到不同的处理器核,任务的执行或由架构强制完成,或交由程序员处理。由于吞吐量受限于速度最慢的部分,因此如何在各内核间有效地划分任务通常是个挑战。
通用多核架构内的数据包通常存储在共享存储器区域(图2)。在这种情况下,程序员必须将分类和数据包修改任务分别分配给处理资源的并行池和流水线。
图2:多核架构共享资源,以及用于处理器核和资源互连的高速总线或crossbar总线。
共享数据的复杂性
在并行数据包处理过程中,多个线程可能需要访问和更新诸如状态和ARP条目等共享数据。不同的线程需要进行同步以强制互斥并实现通用共享模式。但众所周知,同步并非易事而且会对性能造成影响。
为提高性能,许多多核处理器采用硬件缓存。虽然这可以极大缩短平均存储器访问延迟,但架构会变得更难以预测。
缓存一致性协议保证了采用缓存层次结构的多核系统中数据的完整性。虽然这对于程序员是透明的,但为了调节性能,程序员需要了解缓存和一致性协议是如何运作的。另一方面,存储器一致性模型也对程序员开放。因此,程序员需要了解存储器一致性模型以编写正确的程序。
保持数据包顺序
并行数据包处理的另一个挑战是保持数据包的顺序。所有节点都应针对相关的数据包保持数据包顺序,因为上层传输协议的正常工作依赖这种顺序。了解哪些类数据包需要保持包顺序以及如何最有效地满足这一需求通常是程序员的职责。
为降低复杂度,NPU供应商通常会提供硬件支持和软件库。添加更多的数据包缓冲器可有助于确保数据包顺序,但这总是以增加延迟为代价。
降低复杂性需求
驾驭基于多核的NPU并非易事。英特尔公司的Larry Huston在第10届高性能计算机体系结构国际研讨会上发表的论文中总结道:
“理想的情况应是,程序员将应用写成一段软件,而工具会自动划分应用并将应用映射到并行资源集。这也许是个难以实现的目标,但在该方向上的任一进步都将升华开发者的开发生命。”
数据流架构正好满足这一需求。虽然Larry Huston的上述见解发表在2004年,但它在今天的效用和意义与6年前一样。
确定性数据流架构
数据流架构(图3)采用了独特的方法,且具有处理器内核组成的单个流水线。该架构已被设计成完全确定性和超高效的。除执行语境外,它还包括一个数据包指令集计算机(PISC)和一个引擎接入点(EAP)。
图3:数据流架构(图3)拥有包含数百个PISC处理器内核的单个流水线,以及嵌入式引擎接入点。
PISC是专为数据包处理设计的处理器核。流水线可以包含数百个(超过400)PISC。EAP是用于分类任务的专用I/O单元。EAP统一访问存储在嵌入式或外部存储器(TCAM、SRAM、DRAM)中的存储表,并包含用于计量、计数、散列、格式化、流量管理以及表搜索的资源引擎。
执行语境是程序员可用的数据包内的具体数据。它包括数据包最初的256个字节、通用寄存器、设备寄存器和状态标志。一个执行语境唯一地对应一个数据包并使该数据包在流水线内传送。
数据包在流水线中传送就像在一个固定长度的先入先出(FIFO)设备中行进一样。在每个时钟周期,流水线内的所有数据包都前移一级以便在下一个处理器或EAP内执行。
指令总是在一个时钟周期内执行完。每条指令都能以超长指令字(VLIW)方式并行执行多达5个操作。然后,数据包继续前进到下一个PISC或EAP。
数据平面程序经编译后存储在位于处理器核内的指令存储器,从而无需在程序执行期间从共享存储器内将指令发送到处理器内核。另外,此举还显著提升了性能,降低了功耗。
编程模式反映出众所周知的顺序单处理器模式,其中,程序员可以编写顺序执行的模块以避免多个并行编程(即存储器连贯性、一致性和同步)的麻烦。当软件被编译后,程序代码会自动映射到由处理器内核构成的单一流水线。一个VLIW指令占用流水线中的一个处理器核。
这种架构和编程模式的一个显著好处是,它强制执行线速运作。每种数据包都有经确保数量的操作和分类资源。
降低复杂度,提高性能
多核架构无法保证某一水平的性能,而数据流架构是完全确定性的(表2)。通过降低复杂度并面向2-4层包处理充分优化架构,数据流架构的设计可扩展到数百个处理器核,从而能以强大的线速保证支持100Gbps的速率和每秒1.5亿个数据包的操作。
虽然原始处理器的性能非常重要,但在数据流架构中,程序员将处理器性能发挥到极致的能力是衡量架构实际效用的另一关键因素。从原子操作到表存储的一系列公共存储器操作允许高效编码和代码复用,这些操作独立于存储器类型(片上或外部存储器)和贯穿整个流水线的通用处理器核。
在多核架构中,每一级都需要处理能力的冗余配置,在实践中,这对于总是感到处理资源短缺的程序员来说是个重大挑战。因此,为恢复丢失的时钟周期,数据平面程序员会陷入“测试-性能优化-再测试-再性能优化”这样一个无尽的循环中。
针对数据包处理比较数据流与多核架构,两款架构在效率上的差异显而易见。下面让我们借助两款当今最先进的处理器来比较2-4层包处理的各项指标。
第一款处理器是Xelerated基于数据流架构的HX 330 NPU。它工作在300MHz,拥有448个处理器核,每个内核可同时进行5项操作。每两个时钟周期就有一个新数据包可以进入流水线。
这相当于每秒可处理1.5亿个数据包,也就是说即使是最小的64字节以太网数据包,也需要确保能提供100Gbps的线速操作支持。每个数据包可确保5×448 =2240个操作。
当然,2240个操作是理论上的数值。真实的数据平面应用并不会用到全部的潜能。经优化的数据平面代码大约用到50%的资源,这允许很高的服务密度。
第二款处理器是市场上性能最高的多核处理器之一。它拥有64个处理器核、工作在700 MHz。将该处理器用于100Gbps的数据包处理应用时,需要每四个时钟周期调度一个新的数据包。平均而言,每个数据包理论上将获得256个时钟周期的处理能力。
同步挑战以及管理共享数据所耗费的性能会将整体性能降低到利用率最多为50%。这相当于每个数据包128个操作,或者HX NPU的13%处理资源。此外,这些操作的性能得不到保证。
如果再考虑功耗因素,则两者的差异更为显著。基于数据流架构的NPU,其每瓦性能(在线速下)是多核处理器架构NPU的15至20倍。
不同需求,不同架构
对于2-4层数据包处理来说,数据流架构具有明显优势。但其它比较却会产生不同结果。因此,起初看起来具有竞争力的方法实际上也许要大打折扣。
对面向服务的应用来说,由于多核架构能很好地协调共同工作,因此它们能够有效地扩展。在一个分离的架构中,系统供应商可以利用基于数据流的处理器执行2-4层处理并通过运行多核处理器完成内容识别、加密和完成服务等操作。
本文小结
有关架构的争论在不断循环往复。十年前,在10Gbps以上领域业内有30多家NPU供应商。这些公司的研发大多基于多核架构。
而今天,我们知道这种架构在进行2-4层数据包处理时,无法与专用数据流架构媲美。数据流架构的能效要比多核架构高出15至20倍,且严格保证线速。
当就网络处理对架构进行比较时,不要被其所支持的接口带宽所误导,因为如果不考虑服务密度,则这一指标没有意义。当服务提供商评估网络平台时,真正有价值的是在线速操作下同时支持的服务数量。系统供应商需要在研发阶段的早期就密切关注服务密度。
虽然在2-4层处理的服务密度上达不到要求,但新一代多核处理器仍可满足巨大且不断增长的网络市场的需求。这是对基于网络的服务和安全处理应用的大力推动,它为现代多核处理器和数据流架构的结合创造了新的机会(表3)。