加速网络应用:AccelTCP——利用状态化TCP卸载技术
作者、机构与发表信息
本研究由韩国科学技术院(KAIST)的Younggyoun Moon、Seungeon Lee、Kyoungsoo Park以及英特尔实验室(Intel Labs)的Muhammad Asim Jamshed共同完成。研究成果以论文“AccelTCP: Accelerating Network Applications with Stateful TCP Offloading”的形式,发表于2020年2月25日至27日在美国加利福尼亚州圣克拉拉市举行的第17届USENIX网络系统设计与实现研讨会(NSDI ‘20)的会议论文集。该会议论文集为开放获取,收录编号为978-1-939133-13-7。
学术背景与研究动机
本研究属于计算机网络系统与高性能计算交叉领域,特别是关注于网络协议栈优化和智能网卡(Smart NIC)应用。传输控制协议(TCP)作为互联网最核心的传输层协议,以其可靠性、流量控制和拥塞控制机制确保了广泛的适用性。然而,确保TCP协议这些理想特性的代价是高昂的性能开销。随着CPU处理能力与网络带宽差距的不断拉大,这种开销在两种现代网络应用场景中尤为突出:处理大量短时连接(short-lived connections)和执行第7层(L7)代理/负载均衡。
在短时连接场景(如数据中心内的键值存储查询),每个连接可能只交换几个数据包,但建立和关闭连接所需的TCP三次握手、四次挥手过程(即“协议一致性开销”)却消耗了大量的CPU周期。研究团队通过基于MTCP(一种用户态TCP协议栈)的量化分析发现,对于单次64字节数据交换的短连接,连接管理开销占用了总CPU周期的近60%。这使得非持久连接的性能远低于持久连接(在实验中相差2.6倍至3.2倍),迫使开发者为了性能而不得不采用更复杂、更易出错的持久连接设计。
在L7代理场景(如基于HTTP的负载均衡器),代理的核心功能是根据内容决定后端服务器,但其大部分CPU周期和内存带宽却消耗在机械性地转发两个独立连接之间的数据包上。即使使用splice()等零拷贝技术,数据在主机内存和网卡之间的直接内存访问(DMA)操作仍然不可避免,尤其对于小数据包而言,DMA开销巨大。实验表明,一个简单的L7代理(基于MTCP)的转发性能,相比底层的DPDK数据包转发,性能下降了3.2倍至6.3倍。
传统的TCP卸载方案,如TCP分段卸载(TSO)、大接收卸载(LRO)等,主要优化大数据传输,对短连接和小包处理帮助有限。而全栈TCP卸载引擎(TOE)方案则因需要接管整个TCP处理(包括复杂的拥塞控制、数据重传等),导致对主机栈的侵入性过强、灵活性和可维护性差,在实践中并未普及。
因此,本研究旨在解决一个核心矛盾:如何保留TCP协议广泛兼容性的同时,大幅削减其协议一致性开销对现代网络应用性能的负面影响? 具体目标包括:1)使短时连接的性能接近甚至达到持久连接的水平;2)显著提升L7代理/负载均衡的吞吐量;3)设计一个与现有部分卸载方案互补、对主机栈侵入性小、且在智能网卡上可实现的方案。AccelTCP应运而生,其核心理念是利用现代可编程智能网卡作为TCP协议加速器,选择性地将特定的、状态化的TCP操作(主要是连接管理和无内容修改的包转发)卸载到网卡上执行。
研究流程与技术方法
AccelTCP的研究与设计实现工作流程可以分为以下几个相互关联的步骤:
1. 问题量化与设计原则确立: 研究首先通过精密的实验对前述两种场景的开销进行了量化。他们搭建了实验环境,使用一台配备40GbE网卡的服务器(运行MTCP),以及多台客户端和后台服务器。通过设计微基准测试程序,精确测量了短时连接和持久连接处理小数据包(64字节)时的吞吐量差异,并利用性能剖析工具(如CPU周期分析)将开销分解为连接建立/拆除、TCP状态处理、数据包I/O等具体部分。对于L7代理,则比较了基于MTCP的代理、使用splice()的代理、纯DPDK L3转发以及网卡L3转发之间的性能差异。这些量化数据(如图1、表1、表2所示)不仅清晰地揭示了性能瓶颈所在,也为后续的卸载方案设计提供了关键的性能改进目标。
基于对问题和现有方案局限性的分析,研究团队确立了AccelTCP的双栈(Dual-Stack)设计原则:将TCP功能划分为核心TCP操作(与应用程序数据传输直接相关,如可靠传输、拥塞控制、流控等)和外围TCP操作(为协议一致性所需的机械性操作,如连接管理、无内容修改的包转发、校验和计算等)。核心操作仍由主机TCP栈(基于MTCP优化而来)全权负责,以保证灵活性和策略可变性;而外围操作则作为卸载的目标。同时,确立了三个关键设计准则:主机栈保持对卸载的完全控制权;一个TCP控制块(TCB)在任何时刻仅由单一实体(主机或网卡)独占所有权,以避免状态同步的复杂性;尽可能最小化网卡侧的实现复杂度。
2. AccelTCP网卡数据平面设计: 这是研究的核心创新部分,涉及在智能网卡(本研究采用Netronome Agilio LX)上实现三个具体的卸载任务。网卡数据平面需要高效、可靠地处理这些状态化操作。 * 连接建立卸载: 采用无状态握手机制。当SYN包到达网卡时,网卡利用SYN Cookie技术生成SYN-ACK包回应。Cookie中编码了连接四元组哈希、MSS等信息。客户端回复ACK后,网卡验证Cookie有效性。为确保TCP选项(如时间戳、窗口缩放因子)能被正确协商,研究设计将选项信息编码在SYN-ACK包的TCP时间戳选项中,客户端会在ACK包中回显该时间戳,网卡据此提取选项信息并随ACK包一并上报给主机栈。如果客户端不支持时间戳选项,则网卡将此连接的建立过程交还给主机栈处理。此方法将连接建立过程完全移出主机栈处理路径。 * 连接拆除卸载: 主机栈在特定条件下(如剩余待发数据量小于发送窗口、非阻塞式关闭等)可将连接的拆除(包括FIN包和少量剩余数据)卸载到网卡。主机栈移交TCB所有权后即从自身连接表中删除该流。网卡侧则需要维护每个卸载流的少量状态(约26字节),管理数据包的重传和FIN的可靠交付。为此,研究团队为网卡设计了一种高效的定时器位图轮(Timer Bitmap Wheel)数据结构来管理重传超时(RTO)和TIME_WAIT定时。该结构由N个位图组成,每个位图关联一个特定的超时值,通过指针旋转而非数据移动来实现定时器到期检查,极大减少了多核并发更新时的锁争用,适应了智能网卡流-核亲和性不确定的特点。网卡将待重传的数据包暂存于外部DRAM中,利用其硬件分段能力发送数据。 * 连接拼接卸载: 针对L7代理场景。当代理决定不再需要检查或修改某对连接(客户端-代理连接与代理-后端服务器连接)的流量内容时,可请求网卡将这两个连接“拼接”起来。主机栈移交两个连接的TCB所有权。网卡则安装两条L4转发规则,成为一个简单的数据包转发器,在转发时动态修改数据包的IP和TCP头部(包括四元组、序列号、确认号)。为了高效更新TCP校验和,研究采用了差分校验和更新(Differential Checksum Update)算法。该算法利用了1的补码加法满足结合律和分配律的特性,预先计算好因头部字段(四元组、序列号偏移量)变化而产生的校验和偏移量,转发每个包时只需将偏移量加到原校验和上,避免了扫描整个数据包载荷重新计算校验和的巨大开销。网卡还负责监控拼接连接的关闭状态,并在完全关闭后通知主机栈。
3. AccelTCP主机栈设计与优化: 主机栈基于MTCP进行了扩展和深度优化,以配合网卡卸载并提升整体性能。 * API扩展: 增加了套接字选项(如TCP_SETUP_OFFLOAD, TCP_TEARDOWN_OFFLOAD)和新的系统调用mtcp_nsplice(),允许应用程序灵活地按流启用或禁用各种卸载功能。 * 主机栈优化: 引入了三项关键优化以加速短消息处理,这些优化本身也带来了显著的性能提升:1) 惰性TCB创建:针对短时连接,先创建一个精简的“准TCB”(约40字节),只有当连接上观察到多次事务时,才创建完整的TCB,减少了内存分配开销。2) 机会零拷贝:在数据按序到达且应用缓冲区就绪时,直接将数据包内容拷贝到应用缓冲区;在发送缓冲区为空时,直接将应用数据写入主机发包缓冲区。这结合了零拷贝的性能优势和传统套接字缓冲区的安全性。3) 用户级线程协作:将MTCP原有的内核级线程模型改为协作式用户级线程,减少了上下文切换开销,并更好地与上述优化结合。
4. 系统实现与评估实验: 研究团队完整实现了AccelTCP原型系统,包括主机栈修改(约基于MTCP的代码)和网卡数据平面代码(1501行C代码和195行P4代码)。评估实验旨在全面验证其性能。 * 实验设置: 采用多台机器构成的测试床,关键服务器配备Netronome Agilio LX 40GbE智能网卡。对比系统包括MTCP和IX。通过多个微基准测试和真实应用测试进行性能评估。 * 短连接性能测试: 使用TCP回显服务器,测试不同数量CPU核心下,处理64字节数据包的持久连接与非持久连接的吞吐量。AccelTCP(启用连接建立和拆除卸载)的性能被拿来与非持久连接的MTCP、持久连接的MTCP和IX进行对比。 * L7代理性能测试: 使用一个简单的L7负载均衡器(epproxy),测试其在不同数据包大小下的线速吞吐量。对比了基于MTCP的多核代理与基于AccelTCP的单核代理(因为AccelTCP代理的瓶颈在网卡而非CPU)。 * 真实应用测试: 将流行的内存键值存储Redis(适配短时连接场景)和广泛使用的L7负载均衡器HAProxy移植到AccelTCP平台上,使用代表性工作负载(Facebook的usr workload, SPECWeb2009-like workload)测试其性能提升。 * 成本效益分析: 在考虑智能网卡(比普通网卡贵3-4倍)和CPU成本的基础上,计算并比较了AccelTCP系统与MTCP+普通网卡系统的“性能-美元”比值。
主要研究结果
1. 短连接性能大幅提升: 实验结果表明,AccelTCP在处理非持久短连接时,吞吐量比非持久连接的MTCP高出2.2倍至3.8倍(图10)。更重要的是,AccelTCP使得非持久连接的性能达到了与MTCP和IX上持久连接相当甚至更高的水平。例如,在4个CPU核心以内,AccelTCP的吞吐量超过了持久连接的MTCP和IX。这从根本上改变了为性能而必须使用持久连接的现状。性能提升的分解分析(表3)显示,连接建立和拆除卸载贡献了2.3倍的加速,而主机栈的惰性TCB创建和机会零拷贝等优化贡献了额外的1.5倍加速。
2. L7代理性能达到线速: AccelTCP在L7代理场景中表现惊人。当数据包大小达到512字节时,仅使用单个CPU核心的AccelTCP代理即达到了双端口40GbE网卡的满线速80 Gbps吞吐量(图12)。这比使用8个CPU核心的MTCP代理性能高出1.4倍至2.2倍。对于64字节小包,AccelTCP代理的实际事务处理速率是MTCP代理的2.8倍。这是因为AccelTCP的拼接卸载不仅消除了DMA和应用程序处理开销,还将两个连接合并,减少了网络上的ACK包数量。
3. 真实应用获得显著加速: Redis在AccelTCP上运行时,对于短时连接为主的负载,吞吐量提升了1.6倍至2.3倍(表4)。CPU使用率分析(图14)显示,TCP/IP处理所占的CPU周期从超过50%降至仅约25%,瓶颈转移到了Redis自身的会话管理内存分配上。HAProxy的测试结果更为突出,吞吐量从6.2 Gbps提升至73.1 Gbps,加速比高达11.9倍,同时平均响应时间降低了13.6倍(表5)。
4. 成本效益分析结果积极: 尽管智能网卡更昂贵,但考虑到其带来的巨大性能提升,AccelTCP系统的“性能-美元”比值(性价比)相比使用普通网卡和MTCP的系统,仍然高出1.6倍至1.9倍(表6)。这表明投资智能网卡用于此类加速是具有经济合理性的。
这些结果逻辑连贯:首先,微基准测试量化并确认了问题;其次,网卡数据平面的设计针对性地解决了这些问题;然后,主机栈优化进一步释放了性能;最终,在微基准和真实应用测试中,设计目标——大幅提升短连接和L7代理性能——得到了充分验证。各步骤的结果环环相扣,共同支撑了研究的结论。
研究结论与价值
本研究成功设计并实现了AccelTCP,一个利用可编程智能网卡对状态化TCP操作进行选择性卸载的双栈架构。其核心结论是:通过将连接管理和连接拼接这两类高开销的“外围”TCP操作卸载到智能网卡,可以在不牺牲TCP协议兼容性和主机栈控制灵活性的前提下,极大地减轻协议一致性开销,从而为现代关键网络应用(如键值存储、L7负载均衡器)带来数量级的性能提升。
研究的科学价值在于:1)重新定义并实践了TCP功能分割卸载的思想,将复杂的全栈卸载简化为针对特定高开销外围操作的精确定点卸载,降低了实现复杂性和部署门槛。2)为在资源受限的智能网卡数据平面上高效实现状态化操作(如定时器管理、状态同步)提供了创新的设计方案(如定时器位图轮、差分校验和更新)。3)通过详实的实验数据,量化并证实了短时连接和L7代理中TCP协议开销的具体构成,为后续研究提供了清晰的基准。
其应用价值则非常直接且显著:AccelTCP使得开发者无需在协议兼容性和极致性能之间艰难妥协。应用可以自然地使用短时连接而无需担心性能损失,简化了应用逻辑和资源管理;L7中间件可以突破CPU和内存带宽的限制,以接近硬件的速度进行数据转发。这为下一代高性能网络服务器、负载均衡器和网关的设计提供了新的系统架构思路。
研究亮点
其他有价值内容
论文在附录中简要描述了主机与网卡栈之间的通信接口设计,它们主要通过重用或定义特殊的以太网类型值,在普通数据包或控制包中携带卸载元数据,实现了一种低开销、高效的栈间通信机制。这体现了设计中对整体系统交互细节的考量。此外,论文也讨论了与现有内核旁路TCP栈(如IX)、NFV offload框架(如Metron)以及高性能RPC系统(如eRPC)的对比与互补关系,明确了AccelTCP在技术生态中的定位。