“这次是肯定的,洛奇!”
鹿兄鼠弟j .驼鹿
网络前端(NFE)处理器最著名的名字是TCP卸载引擎(TOE),它的历史可以追溯到阿帕网接口消息处理器,甚至可能更早。这个概念非常简单:将执行通信协议的工作与执行需要这些协议服务的应用程序的工作分开。通过这种方式,应用程序和网络机器可以获得最大的性能和效率,并可能利用特殊的硬件性能辅助。虽然这在白板上看起来完全令人信服,但体系结构和实现的现实侵入,往往是相当大的力量。
这篇文章将不试图辨别NFE是上天的礼物还是邪恶化身的表现。相反,它将从纯基于主机的网络堆栈实现开始,然后将网络堆栈从初始位置移动到更远的位置,观察出现的问题。目的是深入了解在更大的系统上下文中影响网络堆栈软件位置选择的权衡。因此,在收获尽可能多的干净粮食的同时,这是一种防止旧错误被重复的尝试。
首先,考虑在多核处理器出现之前的公共工作站或服务器的规范结构。忽略操作系统代码的来源,这个模型直接从典型的20世纪80年代早期到中期的计算机科学系计算机,DEC VAX 11/780,具有10Mb以太网接口,具有单周期直接内存访问(DMA)能力,连接到一个相对较慢的16位总线(DEC Unibus)。
由于只有一个处理器,网络堆栈与机器上运行的其他所有东西争夺CPU的注意力,尽管可能需要借助软件优先级机制,使网络代码“比其他代码更平等”。
当数据包到达时,以太网接口验证以太网帧循环冗余检查(CRC),然后使用DMA将数据包传输到用于协议处理的网络代码使用的缓冲区中。DMA传输对于每个16位的单词只需要一个本地总线周期,在VAX 11/780上,Unibus的处理器控制器将16位的单词缓冲为一个32位的传输到主存中。
然后由网络代码计算TCP校验和,协议状态机执行其业务,TCP有效负载数据被复制到“套接字缓冲区”中,等待应用程序使用。当对有效负载数据进行读取时,它将从套接字缓冲区复制到应用程序进程内存中,以便根据需要进行消化。这样,在应用程序尝试使用该数据之前,单个数据包中的数据总共要传递四次。当网络与内存带宽和处理器速度相比速度较慢时,与工作的网络栈相比,数据复制效率低下被认为是微不足道的,因此它无法立即引起改进。
这个基本情况平台似乎是民间定理的起源,即“TCP每10兆/秒的网络性能需要1个(VAX-)MIPS”。10Mbps以太网可以提供大约1兆字节/秒的有效负载,因此这与另一个民间定理“每MIPS每兆字节I/ o提供1兆字节的内存”一致。这句话的出处很难确定,但通常认为是吉恩·阿姆达尔(Gene Amdahl)说的。
现在,让我们把这个模型移到PC硬件上。在很长一段时间里,个人电脑和小型计算机之间的主要区别之一是I/O性能。残酷的是,与它的小型计算机前辈相比,PC平台在诞生之初几乎没有I/O功能。在PC平台的生命周期中,这种明显的不足促使PC的I/O架构进行了重大的革新。在我们感兴趣的时期,它从16位ISA总线发展到32位PCI,现在是PCI Express。由于过于无聊的原因,这里无法探讨,在很长一段时间内,通过CPU执行的字节复制操作,数据包从PC以太网卡移动到协议处理缓冲区,将数据处理通过计数增加到5。
第一个显著的改进出现在将原始包复制操作和TCP校验和结合在一起时。一些网络代码试图在软件中做到这一点。随着PCI以太网卡开发出高效的DMA硬件,有些将TCP校验和生成与复制操作结合起来,将通过次数减少到3次。对于给定的TCP吞吐量,这明显减少了CPU的使用,并开始向网络接口执行的“协议辅助”服务迈进。(“如果少量的帮助是好的,那么大量的帮助应该更好!”)调整网络堆栈代码来利用这种新的校验和功能不是一件小事,但不祥之言清楚地表明,这种进化可能会继续下去。必须对网络代码进行重大的重新设计,以允许功能在将来更容易地在硬件和软件之间移动。这是真正的架构进步,尽管它不是一夜之间发生的。
随着Web的爆炸式发展,对网络服务器的性能要求直线上升。处理器和网络接口的速度越来越快,内存带宽的限制也得到了解决。千兆以太网很快在服务器主板(以及游戏玩家桌面主板)上变得普遍起来。到这个时候,所有这些数据副本的成本显然是不可接受的。对于许多Web工作负载来说,只要将副本数量减半,就接近可持续事务率的两倍。
这就产生了后来被称为圣杯的东西零拷贝TCP。其思想是,为利用这种新功能而编写的程序可以将数据直接交付到应用程序缓冲区中,而不需要任何中间副本(忽略来自硬件的一次有效DMA传输可能出现的异常)。显然,这需要以太网接口硬件设计者的一些合作(或至少减少对抗),但一个有效的解决方案将赢得许多人心。
从零拷贝的TCP网络堆栈到成熟的TCP卸载引擎的步骤在这一点上看起来非常明显。考虑到许多基于PC的平台在开发PC正在发展的多处理器能力方面进展缓慢,这似乎更有吸引力。(它是多芯片还是一个芯片上的多核基本上无关紧要。)添加一个可以完全应用于协议处理的快速处理器的能力当然是一个有吸引力的想法。然而,在现实生活中做到这一点比它最初出现在白板上要困难得多。
仅仅将数据直接从网络转移到应用程序缓冲区是不够的。数据包的传递必须与应用程序正在做的所有其他事情以及幕后所有其他操作系统机制相协调。
仅仅将数据直接从网络转移到应用程序缓冲区是不够的。数据包的传递必须与应用程序正在做的所有其他事情以及幕后所有其他操作系统机制相协调。因此,网络协议栈以非常微妙的方式与操作系统的其余部分进行交互。说实话,这种协调机制在大多数堆栈实现中占据了绝大部分的代码。实际的TCP状态机只需要半页,一旦分离了将其与系统环境的其余部分集成所需的所有粘合剂和脚手架。正是这种微妙而复杂的控制耦合使得将网络协议栈与它的主机操作系统完全隔离起来异常困难。为什么这种交互是产生实现bug的肥沃土壤,原因有很多,但其中一个主要原因是“抽象不匹配”。
因为通信协议本质上要处理多个通信实体,所以必须对这些实体的行为做一些假设。宿主系统和协议代码之间的这些假设的匹配程度决定了映射到现有语义的难度,以及需要多少新结构和机制。当网络第一次进入伯克利Unix系统时,双方的微妙之处需要付出相当大的努力来协调。人们迫切希望使网络连接看起来是现有Unix机制的自然扩展:文件描述符、管道和其他思想使Unix在概念上更紧凑。但是由于行为上的根本差异(特别是延迟),不可能完全掩饰从全球网络连接读取1000个字节,从而使其与从本地文件系统上的文件读取相同的1000个字节没有区别。网络有新的行为,这些行为需要新的接口来捕获和管理,但是这些新接口必须与现有接口一致。这是一项艰巨的工作,修改后的系统几乎没有部分未被改动;其中一些发生了深刻的变化。
网络协议栈提供的基本功能是数据传输、多路复用、流控制和错误管理。所有这些功能都是跨Internet在端点之间协调传递数据所必需的。实际上,包头中所有结构的目的是:携带控制协调信息以及有效负载数据。
关键的观察结果是,在单个系统内协调网络协议栈和主机操作系统的交互需要完全相同的操作。当所有代码都位于相同的位置(也就是说,运行在相同的处理器上)时,通过简单的过程调用就可以很容易地完成此信号传递。然而,如果网络协议栈在诸如TOE这样的远程处理器上执行,则该信号必须通过连接前端处理器和主机操作系统的显式协议来完成。该协议称为主机前端协议(HFEP)。
设计一个HFEP并非易事,特别是当它的目标是要比卸载到远程处理器上的协议更简单时。历史上,HFEP一直是NFE处理器的阿喀琉斯之踵。HFEP最终与被卸载的“主”协议渐近地一样复杂,因此卸载它几乎没有什么好处。此外,HFEP必须实现两次:一次在主机中,一次在前端处理器中,就HFEP而言,每一个都是不同的主机平台。两个实现,两个与主机操作系统的集成,这意味着微妙的竞争条件、死锁、缓冲区不足和其他讨厌的bug的来源增加了两倍。这一成本需要巨大的回报来弥补。
现在,一些读者可能急于为“没有说服力的挥手”抛出一个惩罚标志,因为即使在基本情况下,以太网接口和主机设备驱动程序之间也存在一个协议。“那不算吗?”你理所当然地问。是的,确实如此。
长期以来,外围芯片设计的接口都非常糟糕。众所周知,如果在黑暗的小巷里遇到芯片设计者,这种芯片会让设备驱动程序的作者考虑缓慢而痛苦的暴力。一家著名半导体公司的早期以太网芯片绝对是过分过度设计的杰作。它们不仅包含了许多实用价值可疑的复杂功能,而且真正需要的功能也受到了与那些无用的部件同样严重的bug侵扰。Tom Lyon在1985年写了一篇著名的Usenix论文“All the Chips that Fit”,对这个广泛的主题进行了史诗般的抨击。(它应该是任何考虑硬件设计的人的必读书目。)
如果目标是网络代码的效率和性能,那么必须仔细检查整个网络协议子系统中的所有“迷你协议”。内部复杂性和集成复杂性都可能成为严重的瓶颈。最终的问题是,把这个部件粘到它必须频繁交互的其他部件上有多难?如果它非常困难,它可能不会很快(在绝对意义上),从bug的角度来看也可能不健壮。
请记住,协议状态机通常不是复杂性或性能问题的主要来源。一个额外的数据拷贝可以在可达到的最大性能上产生巨大的差异。因此,实现必须专注于避免数据移动:在第一次触摸它时将它放在它要去的地方,然后让它保持原样。如果需要对数据包有效负载进行其他操作,例如校验和计算,则将其埋藏在不可避免的操作中,例如将单个传输到内存中。根据这些建议,简化操作系统接口以最大化并发性。一旦所有这些问题都得到了积极的解决,就没有太多的工作需要避免了。
很多时候(但不是每次),NFE可能是对问题错误部分的过于复杂的解决方案。这可能是一种权宜之计的短期措施(世界上肯定有这样的地方),但作为一种长期的架构方法,处理器核心的商品化使得专门的硬件非常难以证明其合理性。
缺少nfe,需要什么来最大化基于主机的网络性能?以下是一些指导方针:
nfe至少在四五个不同时期被重新发现。本着充分和公正的披露精神,我必须承认,我直接参与了其中两项努力,并购买和整合了另一项努力。那么,如果事实证明它比最初出现的时候要困难得多,为什么这个想法还会反复出现呢?
计算机系统的能力和经济发展并不顺利,各种部件的改进速度也不同步。由此产生的交互在随着时间发展的系统分区中产生了显著不同的权衡。今天正确的东西在下一次技术改进之后可能就不正确了。举个例子说明这一点。
曾几何时,磁盘存储非常昂贵——非常昂贵——但它也表现出显著的规模经济。当时,局域网连接和处理器性能足以使在多个工作站之间共享大型磁盘成为可取的,从而产生了无盘工作站。这种情况持续了数年,但随着磁盘在学习曲线上的下滑,每兆磁盘空间成本的下降压倒了无磁盘工作站的操作复杂性,因此它们变成了磁盘满的,直到最近才有所改变。如今,典型的大型企业平均每个员工拥有一台PC机,因此管理所有台式PC机的操作难度是巨大的。这种成本现在已经高到足以使无磁盘工作站重新被发现,这一次被命名瘦客户机。所有的储存都在别处;桌面设备上没有永久性的东西。历史正在不断地重演。为什么?因为各种成本曲线已经移动得足够多了,相对于彼此而言,到了中心化有意义的地步。
同样的事情也发生在nfe上。有时,系统没有足够的网络“快速运行”来提供所需的性能,因此只需在网络接口上添加一个专用处理器来弥补这一点。然而,这样做的经济效益顶多是短暂的。在芯片设计和系统集成的复杂性之间,NFE将需要在相当长的一段时间内成为具有经济吸引力的解决方案,以收回开发成本。不幸的是,基础PC平台在处理器、内存系统和系统互连方面的不断改进使得优势之窗越来越小,越来越快。还有人记得HiFN文件压缩处理器芯片吗?在很短的时间内,它被内置到PC系统中。处理器很快得到了改进,可以动态地进行压缩/解压,然而,在磁盘存储成本下降之前,HiFN的梦想就此终结。
任何质疑NFE有效性的努力都应该包括对一个特殊案例的警告,这个案例值得特别提及,因为它确实为NFE的特定风格提供了令人信服的案例。
微控制器在恒温器、电灯开关、烤面包机等设备中的普及,以及几乎所有超出简单开/关开关的设备,为nfe创造了真正的机会。几乎所有这些微控制器应用的典型特征是巨大的成本压力,这通常转化为可用计算资源的极端限制。在绝大多数这些系统中放置网络堆栈是不可能的,但是远程管理这些设备的需求与日俱增。
这就产生了一种新的NFE:网络通信适配器(NCA),它专门用于简化微控制器主机和fesial ASCII之间的协议。大多数微控制器都有一些串口功能,所以通过看起来像一个终端,NCA可以扮演转换器的角色,一边说串口,另一边说TCP/IP。NCA作为TCP网络上的主机出现,通常包含一个简单的Web服务器,它出售状态信息,并可能提供某些其他管理功能,这些功能被转换为与微控制器系统的简单ASCII交换。
NCA通常在功能更强大的微控制器中实现,这些微控制器被设计为提供以太网接口并支持足够的RAM和ROM来包含简化的网络堆栈。NCA现在是一个现成的模块,易于集成,并不比串口上的调制解调器困难。
在很多应用中,谁是尾巴,谁是狗的问题就会浮现在脑海中。从TCP网络的角度来看,NCA是主机,被管理的是微控制器。从照明控制器的角度来看,NCA看起来只是一个开关,尽管是一个聊天。这种区别通常是无关紧要的,只是把迂腐的分层图弄得乱七八糟。这让我很满足。
我没有讨论nfe的宗教礼仪,特别是TOE的种类,而是研究了导致其反复兴衰的建筑问题。toe风格的NFE最好被视为一种战术工具,具有有限的预期经济生存期,而不是一种持久的架构方法。这只是专业外设和系统CPU之间功能反复起起落落的另一个例子,因为经济与系统需求相互作用。NFE的优势有限的生命周期使得除了最高价值的应用程序之外,很难证明任何应用程序的显著开发成本是合理的。
也就是说,廉价的NCA可能是一种持久的方法。它实际上将网络通信转换为一种廉价的、可插拔的物理组件。通过这样做,它提供了一种处理微控制器应用程序固有的极端成本压力的途径,同时在客户愿意付费时提供了一个真正的网络公民的增量选项。
Q有关文章queue.acm.org
TCP卸载到救援
安迪·克里德
http://queue.acm.org/detail.cfm?id=1005069
网络虚拟化
斯科特Rixner
http://queue.acm.org/detail.cfm?id=1348592
DAFS:一种新型高性能网络文件系统
史蒂夫·克雷曼
http://queue.acm.org/detail.cfm?id=1388770
©2009 acm 0001-0782/09/0600 $10.00
允许为个人或课堂使用本作品的全部或部分制作数字或硬拷贝,但不得为盈利或商业利益而复制或分发,且副本在首页上附有本通知和完整的引用。以其他方式复制、重新发布、在服务器上发布或重新分发到列表,需要事先获得特定的许可和/或付费。
数字图书馆是由计算机协会出版的。版权所有©2009 ACM, Inc.
以下这封信发表在2009年12月出版的《致编辑的信》(//www.eqigeno.com/magazines/2009/12/52828)上。
——CACM管理员
在他的文章“网络前端处理器,再次”(2009年6月)中,Mike O’dell似乎在争论我用更简单的术语对同事说的,即,使用网络前端(NFE)处理器是(而且一直是)一个坏主意,因为一个基本的原因:它必须执行中等复杂的计算至少与计算机的“主”CPU一样快,但制造商坚持认为它是便宜的,因为当计算机包含许多网络链接时,成本“乘数”效应。为了证明解决这个问题是不可能的,考虑下面的反证法:
假设一个NFE处理器具有必要的属性,一般通用,快速,便宜,大多数计算机制造商使用它作为一个主处理器,而不是作为一个低级的NFE,因此需要更多的网络带宽。
正如O’dell所写的那样,许多计算机工程师早就明白,实现网络协议软件栈的最有效方法是使用一个或多个N-way SMP的cpu,但当用户发现他们花了大价钱购买的东西,从应用程序的角度来看,只是一个N-1-way计算机时,他们强烈反对这个想法;还要注意N= 2或4的流行“低端”情况。显然,Sun Microsystems(“网络就是计算机”)并没有给IT经理留下什么印象。结果是,NFE初创公司继续浪费工程人才,试图把一夸脱技术倒进这个特定的品脱罐子里。
斯科特Marovich
加利福尼亚州帕洛阿尔托
显示1评论