“未来我们应该不再从协议的角度来思考(网络),而是从软件的角度来思考。所有功能和“协议”都将从硬件迁移到软件中。”
——Nick McKeown
编者按:Nick McKeown,斯坦福教授、SDN之父、创办了Nicira(网络虚拟化的先驱)和 Barefoot(推出了首个完全可编程的交换机)、目前担任英特尔公司网络与边缘事业部 (NEX) 高级副总裁兼总经理。
本文系SDNLAB整理自Nick McKeown教授的演讲视频。Nick教授90年代“自研”Bay Bridge 路由器,这段经历让他对微代码可编程硬件加速器产生怀疑,他认为当时昙花一现的网络处理器无法从根源解决网络加速问题,系统地梳理了可编程发展的历史;Nick开始研究在各个领域出现的特定领域的处理器,并提出了P4高级语言,推出了Tofino芯片;Nick教授认为,应该把网络看作一个可编程的平台,而不是一个独立元素的集合,网络的行为应该自顶向下进行描述,并分享了对未来网络的很多看法。视频内容非常精彩,详细内容可阅读下文。
作为网络开源社区的忠实支持者,Nick McKeown认为在过去十年或更长时间里,开源的兴起推动了“真正的网络革命”。在十多年前,每个人使用的都还是闭源的专有网络设备,但如今,大型数据中心大部分都运行在开源软件上(主要是在基于 Linux 的设备上)。这种从闭源到开源开放的变化,让网络设备变得可编程,从而改变原有网络,这种创新方式加速了未来网络的发展。
可编程发展的历史
上世纪90年代初,互联网还被称为NSFNet,路由器被称为“思科盒子”。这些路由器是基于 CPU 的,可以“每秒处理高达10000个数据包”。当时Nick和其他一些学生决定创建一个名为Bay Bridge 的多端口光纤分布式数据接口(FDDI,Fiber Distributed Data Interface) 路由器,它使用复杂的可编程逻辑设备(CPLD——FPGA 的前身)而不是 CPU,以此试图超越商用路由器。
Bay Bridge 由Sun工作站通过SBus控制。CPLD 实现了一种新的微编码语言,该语言描述了如何处理数据包,这让Bay Bridge每秒可以处理大约 100000 个数据包,是商用路由器的10倍。该设备在伯克利大学的 FDDI 环上放置了大约五年。
在很长一段时间之后,他们想为Bay Bridge添加一些新功能,也就是那次经历给Nick上了宝贵的一课,“我们甚至不记得如何对其进行编程”。最终,添加一个相当简单的功能所花费的时间甚至比最初开发Bay Bridge所花的时间更长。在当时,创建一个非常长的指令字(VLIW)微控制器似乎是一个很棒的主意,但这个经历让他对微代码可编程硬件加速器产生了怀疑。
当网络处理器(或 NPU)的想法在 90 年代后期出现时,Nick认为“此路不通”。NPU 开发人员并没有从根源上寻找需要解决的问题,而是简单地创建了一个包含 CPU 内核阵列的芯片。他说,网络处理需要“非常深的管道和非常非常快的 I/O”,而 CPU(或 CPU 阵列)上都不存在这些。
Nick表示,目前最好的芯片可以处理大约12.8Tbps,而 CPU 仅略高于 100Gbps。在他最早研究这些的时候两者的差距在5倍左右,但现在则达到了100倍左右。这使他得出结论,为了获得最高性能,不可避免地需要使用“基于深度管道、高速 I/O 和与标准协议相对应的固定操作序列”的东西。这需要最少的功率,最有可能安装在单个芯片上,因此将“提供最低的总成本”。
例如,今天的一个专用集成电路 (ASIC) 交换机以 10Tbps 的速度处理 40 种协议,使用 400W。而CPU“等效”以10Tbps仅处理4个协议就需要 25KW。CPU是针对内存加载和存储操作进行了优化,而ASIC针对 I/O 和流水线进行了优化。这可以得出一个结论,在可预见的未来,高性能交换机将基于 ASIC。
然而,当需要添加新的协议时,问题就来了。举个例子,当需要将VXLAN协议添加到固定功能交换机时,大约需要四年时间才能在新硬件中推出。在日新月异的网络世界,四年这个数字“相当疯狂”,因此Nick认为这样改变数据包处理方式的开发过程是错误的。
第一批问世的可编程交换机基于各种方法——FPGA、NPU 或 ASIC,但它们都没有能够让用户根据自己的需要编写代码,真正编写代码的是设备制造商。但是,设备制造商并不运营大型网络,所以他们倾向于简单地实施现有的标准——他们永远不会主动成为创新的人,所有这些都使得引入新想法变得困难,因此一切都趋于停滞。
特定领域的处理器
Nick开始研究在各个领域出现的特定领域的处理器:用于图形的 GPU、用于机器学习的数字信号处理器(DSP)、用于机器学习的张量处理单元(TPU) 等等。与 CPU 上的通用计算一样,所有特定领域的处理器都有一些为处理器编译的高级语言。这些编译器将优化发出的代码以利用可用的指令集和并行性。
大约在 2010 年,他和其他人开始考虑一种针对数据包处理进行优化的新的特定领域处理器,它允许网络运营商自行编程。为此,需要一种新的高级语言,它独立于硬件,并且可以在不牺牲功率、性能或大小的情况下编译成以线速运行。这就是 P4 语言。
P4是一种特定领域的编程语言,用于描述可编程的转发设备如何处理报文。P4的架构是PISA(Protocol Independent Switch Arch)全流水线可编程架构。
- 简要来说,它的基本单元是match-action table。
- match单元可以匹配任意报文的偏移与字段长度。
- action单元,则有相对比较丰富的报文编辑功能。
- 此外,片上资源SRAM与TCAM也可以进行灵活的配置。
整个P4的控制过程包括包头解析、可编程入流水线、可配置缓存管理TM,以及可编程出流水线的处理。对应的编程框架包括自定义报文头、match-action表项的定义,以及全流水线控制流的串接。
下图展示了固定功能交换机和基于 Barefoot Networks 的 Tofino P4 可编程芯片的交换机的比较:
- 两者都有 64 个 100Gbps 端口,除了使用的数据包处理芯片外几乎完全相同。
- 最大转发速率基本相同,基于 Tofino 的交换机稍高一些。
- 每个端口使用的功率差不多,但 Tofino 略低。
- 同样,Tofino上的延迟要少一些,但大致相当。
所有这些都表明,可编程交换机具有与固定功能交换机相同的性能、功耗和成本。这也意味着网络运营商可以选择可编程交换机以获得更多的灵活性。
未来的方向
Nick表示,企业和运营商正在“试图掌控那些控制他们网络的软件”,这是“他们的命脉”,因此他们需要确保它是可靠、安全的,并且可以以各自不同的方式进行扩展。为此,随着可编程交换机和网卡越来越多地投入使用,他们还开始控制数据包的处理方式。
Nick想知道这对未来的网络编程方式意味着什么。他认为,我们应该把网络看作一个可编程的平台,而不是一个独立元素的集合。网络的行为应该自顶向下进行描述。他的希望是,行为将被分区、编译,并在网络中的所有元素上运行。然而,要实现这一目标还有很多工作要做。
此外,每个数据中心都将以不同的方式工作,在本地进行编程和定制。例如,可以通过删除不需要的协议,或者根据运行在数据中心里组织的需要添加特定的安全措施,使它们更加简单。
Nick还提出了一个更具争议的观点:未来我们应该不再从协议的角度来思考,而是从软件的角度来思考。所有功能和“协议”都将从硬件迁移到软件中。
最终目标是要建设一个“多数人编程但少数人运维”的网络。但目前距离做到这一点还有很长的路要走。
如果我们把网络看做一个可编程平台
如果把网络看做一个可编程平台,如何编写描述网络的代码,并且保证它清晰、以线速运行,并且可以移动到最适合运行的组件?
Nick描述了网络管道的元素,从用户空间开始,它使用数据平面开发工具包(DPDK) 在虚拟机 (VM)、容器或用户空间程序中进行网络连接,内核使用 XDP 和 eBPF,NIC 和交换机则更多地使用 P4 进行编程,当然以后也可能会出现其他语言或技术。
Nick表示,DPDK 和 XDP/eBPF 组件的应用已经非常成熟,PISA 和 P4 也正在用于交换机和网卡中,这两种不同的方式之间存在潜在的冲突。但他并不是提倡抛弃C和C++,而是需要一种“受约束的编程方式”,这样这些程序才能在内核中安全地运行。已经编写了大量用户空间和内核网络的代码应该继续维护,但这些通用代码不会直接在网卡或交换机中的硬件加速管道上运行,而是需要某种方法来约束这些程序。
Nick的想法是用P4指定整个管道结构。使用P4 extern功能,大部分程序代码仍然可以用C/C++编写,尤其是对于那些在CPU上运行的内容。其他代码将用P4编写,这样就可以转移到硬件加速器上。
他举例说明了目前在智能网卡中实现的一些功能,用于云中的虚拟机和容器安全。当云运营商想要向云中添加新的裸机系统(如超级计算机)时,他们无法信任这些设备上的网卡,因为他们无法控制在其上运行的软件。如果他们可以把已经在网卡上运行的代码放在交换机上,这个过程就会变得更容易。
P4社区和Linux网络社区都有着专业的知识和能力,本着开源的精神,他们应该一起合作解决这些问题。Nick建议netdev和 P4.org 组成一个工作组,专门致力于寻找开源解决方案。最后,Nick表示,在接下来的十年里,他相信网络将变得更加端到端可编程,这也会带来大量的网络创新。