下载本文的PDF版本 PDF

高性能网络

网络前端处理器,卷土重来

Mike O'Dell,新企业联合公司

“这次肯定行,洛奇!” 牛winkel J. Moose

NFE处理器的历史揭示了设计网络堆栈软件所涉及的权衡。

NFE(网络前端)处理器的历史,目前最广为人知的是TOE(TCP卸载引擎),可以追溯到Arpanet IMP(接口消息处理器),甚至可能更早。这个概念非常简单易懂:将执行通信协议的工作与执行需要这些协议服务的“应用程序”的工作分离开来。这样,应用程序和网络机制就可以实现最高的性能和效率,并可能利用特殊的硬件性能辅助。虽然这在白板上看起来极具吸引力,但架构和实现的现实却会侵入进来,而且往往具有相当大的力量。

本文不打算辨别NFE是上天的恩赐还是邪恶的化身。相反,它将追溯从纯粹基于主机的网络堆栈实现开始的演变,然后将网络堆栈进一步远离最初的位置,观察出现的问题。目标是深入了解影响大型系统环境中网络堆栈软件位置选择的权衡。因此,它旨在防止重蹈覆辙,同时尽可能多地收获干净的成果。

基本情况

作为起点,考虑在多核处理器出现之前,常见的Workstation或服务器的典型结构。忽略操作系统代码的来源,这个模型直接来源于典型的20世纪80年代中期的计算机科学系计算机,DEC VAX 11/780,它具有10兆位以太网接口,具有单周期DMA(直接内存访问)能力,并连接到相对较慢的16位总线(DEC Unibus)。

由于只有一个处理器,网络堆栈与机器上运行的所有其他程序争夺CPU的注意力,尽管可能借助软件优先级机制,使网络代码“比其他程序更平等”。

当数据包到达时,以太网接口验证以太网帧CRC(循环冗余校验),然后使用DMA将数据包传输到网络代码用于协议处理的缓冲区中。DMA传输对于每个16位字只需要一个本地总线周期,在VAX 11/780上,Unibus的处理器控制器将16位字缓冲到单个32位传输到主内存中。

然后,网络代码计算TCP校验和,协议状态机执行其业务,TCP有效载荷数据被复制到“套接字缓冲区”中,等待应用程序程序的消耗。当读取有效载荷数据时,它从套接字缓冲区复制到应用程序进程内存中,以便根据需要进行消化。这使得在应用程序有机会使用数据之前,单个数据包中的数据总共经过了四次传递。当网络速度与内存带宽和处理器速度相比很慢时,数据复制效率低下被认为是次要的,与工作网络堆栈的喜悦相比,因此未能立即引起改进。

这个基本情况平台似乎是“TCP每秒10兆位网络性能需要一个(VAX-)MIPS”这一民间定理的起源。每秒10兆位的以太网可以提供大约每秒1兆字节的有效载荷,因此这与另一个“每兆字节I/O每MIPS每兆字节内存”的民间定理一致。这来自哪里更难确定,但它经常被归功于Gene Amdahl。

更多“加速”,更小的盒子

现在将相同的模型转移到PC硬件。在很长一段时间里,PC和小型计算机之间的主要区别之一是I/O性能。残酷地说,与它的小型计算机前辈相比,PC平台在生命之初几乎没有I/O能力。在PC平台的整个生命周期中,这种明显的缺乏促使对PC的I/O架构进行了重大改造。在我们感兴趣的时期内,它从16位

ISA总线发展到32位PCI,再到现在的PCI Express。由于原因太无聊,不在此处探讨,在很长一段时间里,数据包从PC以太网卡移动到协议处理缓冲区时,CPU执行字节复制操作,使数据处理传递计数增加到五次。

第一个重大改进出现在原始数据包复制操作和TCP校验和相结合时。一些网络代码尝试在软件中执行此操作。随着PCI以太网卡开发出高效的DMA硬件,一些将TCP校验和生成与复制操作相结合,将传递计数减少到三次。这显然减少了给定TCP吞吐量的CPU使用率,并开始了网络接口执行“协议辅助”服务的进程。(“如果一点帮助是好的,那么很多帮助应该更好!”)调整网络堆栈代码以利用这种新的校验和能力并非易事,但墙上的字迹清楚地表明这种演变很可能会继续。必须对网络代码进行重大重新设计,以便将来更容易地在硬件和软件之间移动功能。这是真正的架构进步,尽管它不是一蹴而就的。

成功的灾难

随着Web的爆炸式增长,对网络服务器的性能需求急剧增加。处理器和网络接口变得更快,内存带宽瓶颈正在得到解决。千兆以太网迅速在服务器主板(和游戏玩家桌面主板)上变得司空见惯。到这个时候,所有这些数据复制的成本显然是不可接受的。简单地将复制次数减半将接近使许多Web工作负载的可持续事务率翻倍。

这促成了后来被称为零拷贝TCP的圣杯。这个想法是,编写为利用这种新功能的程序可以将数据直接交付到应用程序缓冲区中,而无需任何中间复制(忽略可能存在的一次来自硬件的高效DMA传输)。显然,这将需要以太网接口硬件设计者的一些合作(或至少减少对抗),但一个可行的解决方案将赢得许多人心。

从零拷贝TCP网络堆栈到完全成熟的TCP卸载引擎的步骤在这一点上看起来非常明显。考虑到许多基于PC的平台在利用PC正在开发的多处理器能力方面进展缓慢,这似乎更具吸引力。(是多个芯片还是一个芯片上的多个内核在很大程度上是无关紧要的。)添加一个可以完全应用于协议处理的快速处理器的能力当然是一个有吸引力的想法。然而,在现实生活中做到这一点比最初在白板上看起来要困难得多。

控制与数据

仅仅将数据直接从网络线缆移动到应用程序缓冲区是不够的。数据包的交付必须与应用程序正在做的所有其他事情以及幕后所有其他操作系统机制协调。正因为如此,网络协议栈以极其微妙的方式与操作系统的其余部分交互。说实话,这种协调机制是大多数堆栈实现中代码的主要部分。实际的TCP状态机可以放在半页纸上,一旦摆脱了将其与系统环境其余部分集成所需的所有粘合剂和支架。正是这种微妙而复杂的控制耦合使得将网络协议栈完全从其主机操作系统中隔离出来出奇地困难。这种交互成为实现错误滋生的温床有很多原因,但一个庞大的类别是“抽象不匹配”。

由于通信协议本质上处理多个通信实体,因此必须对这些实体的行为做出一些假设。主机系统和协议代码之间的这些假设的匹配程度决定了映射到现有语义的难度以及需要多少新的结构和机制。

当网络首次进入Berkeley Unix时,双方的细微之处都需要付出相当大的努力才能协调一致。人们非常希望使网络连接看起来像是现有Unix机制的自然扩展:文件描述符、管道以及使Unix在概念上紧凑的其他想法。但是,由于行为上的根本差异,尤其是延迟,因此不可能完全掩盖从环球网络连接读取1,000字节,使其看起来与从本地文件系统上的文件读取相同的1,000字节没有区别。

网络具有需要新的接口来捕获和管理的新行为,但这些新接口需要与现有接口相符。这是一项艰苦的工作,并且修改几乎没有触及系统的任何部分;一些部分发生了深刻的变化。

回归基础

网络协议栈提供的基本功能是数据传输、多路复用、流量控制和错误管理。所有这些功能都是跨Internet在端点之间协调数据交付所必需的。这就是数据包头中所有结构的目的:携带控制协调信息以及有效载荷数据。

关键的观察是,协调网络协议栈和单个系统内的主机操作系统之间的交互需要完全相同的操作。当所有代码都在同一位置(即,在同一处理器上运行)时,这种信令很容易通过简单的过程调用来完成。但是,如果网络协议栈在远程处理器(如TOE)上执行,则必须使用显式协议跨越连接前端处理器到主机操作系统的任何东西来完成此信令。此协议称为HFEP(主机前端协议)。

设计HFEP并非易事,特别是如果目标是使其在实质上比要卸载到远程处理器的“主要”协议更简单。从历史上看,HFEP一直是NFE处理器的阿喀琉斯之踵。HFEP最终变得与要卸载的“主要”协议一样复杂,因此在卸载它方面几乎没有什么收获。此外,HFEP必须实现两次:一次在主机中,一次在前端处理器中,就HFEP而言,每个都是不同的主机平台。两次实现,两次与主机操作系统集成——这意味着两倍的细微竞争条件、死锁、缓冲区饥饿和其他讨厌的错误的来源。这种成本需要巨大的回报才能弥补。

但是等等

大约现在,一些读者可能会急于抛出“没有说服力的挥手”的处罚标志,因为即使在基本情况下,以太网接口和主机计算机设备驱动程序之间也存在协议。“这不算吗?” 你理所当然地问。是的,确实算。

外围芯片的设计历史悠久,接口非常糟糕。众所周知,这样的芯片会让设备驱动程序编写者考虑缓慢而痛苦的暴力,如果他们曾经在黑暗的小巷里遇到芯片设计师。来自一家著名半导体公司的早期以太网芯片绝对是过分设计的杰作。它们不仅包含许多可疑效用的复杂功能,而且真正需要的功能也遭受了与无用位相同的恶性bug侵扰。Tom Lyon在1985年撰写了一篇著名的Usenix论文“All the Chips that Fit”,对这个广泛的主题进行了史诗般的咆哮。(对于任何考虑硬件设计的人来说,这应该是必读的。)

如果目标是网络代码的效率和性能,则必须仔细检查整个网络协议子系统中的所有“迷你协议”。内部复杂性和集成复杂性都可能是严重的瓶颈。最终,问题是,将这部分粘合到它必须经常交互的其他部分有多难?如果非常困难,那么它可能既不快(绝对意义上),也不可能从bug的角度来看是健壮的。

请记住,协议状态机通常不是复杂性或性能问题的主要来源。额外的数据复制可能会对最大可实现性能产生巨大影响。因此,实现需要专注于避免数据移动:将其放在第一次触摸它的地方,然后让它保持原样。如果需要对数据包有效载荷进行其他操作,例如校验和计算,则将其埋在不可避免的操作中,例如单次传输到内存中。根据这些建议,简化操作系统接口以最大程度地提高并发性。一旦所有这些问题都得到积极解决,就没有太多工作要避免了。

这对NFE意味着什么?

总的来说,这意味着在很多时候,但不是每次,NFE都可能是一个对于错误部分的问题来说过于复杂的解决方案。它可能是一种权宜之计的短期措施(而且世界上肯定有它的位置),但作为一种长期的架构方法,处理器内核的商品化使得专用硬件很难证明是合理的。

在缺乏NFE的情况下,最大化基于主机的网络性能需要什么?以下列表提供了一些指导方针

历史视角

NFE至少在四到五个不同的时期被重新发现。本着全面和公平披露的精神,我必须承认我直接促成了其中的两项努力,并且购买并集成了另一项。那么,如果事实证明这个想法比最初看起来要困难得多,为什么它会不断地重复出现呢?

计算机系统的容量和经济性不会平稳地发展,各种组件的改进速度也不会同步。由此产生的相互作用产生了截然不同的系统划分权衡,这些权衡会随着时间的推移而演变。今天正确的事情在下一次技术改进之后可能就不正确了。一个例子将说明这一点。

很久以前,磁盘存储非常昂贵——真的非常昂贵——但它也表现出显着的规模经济。当时,LAN连接和处理器性能足以使在多个工作站之间共享大型磁盘变得理想,从而产生了无盘工作站。这种情况持续了几年,但是随着磁盘沿着学习曲线下滑,每兆字节磁盘空间的成本降低压倒了无盘工作站的操作复杂性,因此它们变成了有盘工作站,并且从那时起一直如此——直到最近。

如今,典型的大型组织平均每个员工配备一台PC的大部分,因此管理所有这些桌面的操作麻烦很大。这种成本现在已经足够高,以至于无盘工作站已被重新发现,这次被命名为瘦客户端。存储在其他地方;桌面单元上不存在任何永久性的东西。历史正在忙碌地重演。为什么?因为各种成本曲线相对于彼此移动了足够多的程度,以至于集中化变得有意义。

NFE也发生了同样的事情。在某个时间点,系统没有足够的网络“加速”来提供所需的性能,因此只需在网络接口上添加一个专用处理器即可弥补。然而,这种经济效益充其量只是短暂的。在芯片设计和系统集成复杂性之间,NFE需要在相当长的一段时间内成为一种具有经济吸引力的解决方案,才能收回开发成本。不幸的是,基本PC平台中处理器、内存系统和系统互连的不断改进使这种优势窗口成为一个不断缩小的快速移动的目标。有人还记得HiFN文件压缩处理器芯片吗?它在很短的时间内被内置到PC系统中。处理器很快就改进到足以即时执行压缩/解压缩,这就是HiFN梦想的终结——甚至在磁盘存储成本下降会扼杀它之前。

“但不是每次都如此”

前一节质疑NFE功效的部分应包括一个特殊情况的警告,该情况值得特别提及,因为它确实为特定风格的NFE提出了令人信服的理由。

微控制器在恒温器、灯开关、烤面包机以及几乎所有带有简单开/关开关以上的设备中的激增为NFE创造了真正的机会。几乎所有这些微控制器应用的典型特征是巨大的成本压力,这通常转化为对可用计算资源的极端限制。在绝大多数这些系统中放置网络堆栈根本是不可能的,但是每天对远程管理这些设备的渴望都在增加。

这催生了一种新型的NFE:NCA(网络通信适配器),它专门研究微控制器主机和NFE之间协议的简单性——串行ASCII。大多数微控制器都具有某种串行端口能力,因此通过看起来像终端,NCA可以扮演翻译器的角色,一侧输出串行,另一侧输出TCP/IP。NCA在TCP网络上显示为主机,通常包含一个简单的Web服务器,该服务器提供状态信息,并可能提供某些其他管理功能,这些功能被转换为与微控制器系统的简单ASCII交换。

NCA通常在更强大的微控制器之一中实现,这些微控制器旨在提供以太网接口并支持足够的RAM和ROM来包含简化的网络堆栈。NCA现在可以作为现成的模块使用,其集成难度不高于串行端口上的调制解调器。

在许多这些应用中,哪个是尾巴,哪个是狗的问题浮现在脑海。从TCP网络的角度来看,NCA是主机,微控制器正在被管理。从照明控制器的角度来看,NCA看起来就像另一个开关,尽管是一个健谈的开关。这种区别通常是无关紧要的——它只是把学究式的分层图搞砸了。这真是令人满意。

结论

本文没有争论NFE(特别是TOE类型)的宗教适宜性,而是考察了导致其反复兴衰的架构问题。TOE风格的NFE最好被视为一种战术工具,其经济可行性的预期寿命有限,而不是一种持久的架构方法。

这只是另一个在专用外围设备和系统CPU之间功能反复消长,经济性来回波动并与系统需求相互作用的例子。NFE优势的有限寿命使其难以证明任何但最高价值应用程序的重大开发成本是合理的。

话虽如此,廉价的NCA很可能是一种持久的方法。它实际上将网络通信转变为一种廉价的、可插拔的物理组件。通过这样做,它为应对微控制器应用中固有的极端成本压力提供了一条途径,同时在客户愿意为此付费时,提供了一种真正的网络公民身份的增量选择。

喜欢它,讨厌它?请告诉我们
[email protected]

MIKE O'DELL 是新企业联合公司 (NEA) 的风险合伙人。他主要关注大型复杂系统的结构和行为动态。他与 NEA 的技术团队合作,以识别早期信息技术、通信和能源机会。Odell 从 UUNET Technologies 加入 NEA,在那里他担任首席科学家,负责商业互联网出现期间的网络和产品架构。他还曾在 Bellcore(现在的 Telcordia)、GaAs Sparc 超级计算机创业公司和美国政府承包商担任职位。他是国际同行评审学术期刊 Computing Systems 的创始编辑。他获得了俄克拉荷马大学计算机科学学士和硕士学位。

© 2009 1542-7730 /09/0200 $5.00

acmqueue

最初发表于 Queue vol. 7, no. 3
数字图书馆 中评论本文





更多相关文章

David Collier-Brown - 你根本不了解带宽
当您的员工或客户说他们的互联网性能很差时,带宽可能不是问题。一旦他们拥有 50 到 100 Mbps 范围内的带宽,问题就是延迟,即 ISP 路由器处理他们的流量需要多长时间。如果您是 ISP,并且所有客户都讨厌您,请振作起来。这现在是一个可以解决的问题,这要归功于一群执着的人,他们追查到了这个问题,消灭了它,然后在家庭路由器中验证了他们的解决方案。


Geoffrey H. Cooper - 使用 FDO 和不受信任的安装程序模型的设备入职
设备的自动入职是处理正在安装的越来越多的“边缘”和物联网设备的重要技术。设备的入职与大多数设备管理功能不同,因为设备的信任从工厂和供应链转移到目标应用程序。为了通过自动入职加快流程,供应链中的信任关系必须在设备中正式化,以允许过渡自动化。


Brian Eaton, Jeff Stewart, Jon Tedesco, N. Cihan Tas - 通过关键路径跟踪进行分布式延迟分析
低延迟是许多 Google 应用程序(如搜索)的重要功能,延迟分析工具在维持大规模低延迟方面发挥着关键作用。对于包含功能和数据不断发展的服务的复杂分布式系统,将总体延迟保持在最低限度是一项具有挑战性的任务。在大型、真实的分布式系统中,现有的工具(如 RPC 遥测、CPU 性能分析和分布式跟踪)对于理解整个系统的子组件很有价值,但在实践中不足以执行端到端延迟分析。


David Crawshaw - 一切 VPN 又焕然一新
VPN(虚拟专用网络)已有 24 年的历史。这个概念是为与我们今天所知的互联网截然不同的互联网而创建的。随着互联网的增长和变化,VPN 用户和应用程序也随之发展。VPN 在 2000 年代的互联网中度过了一个尴尬的青春期,与其他广泛流行的抽象概念交互不良。在过去的十年中,互联网再次发生了变化,而这个新的互联网为 VPN 提供了新的用途。一种全新的协议 WireGuard 的开发为构建这些新的 VPN 提供了技术基础。





© 保留所有权利。

© . All rights reserved.