SOSP 2023 Paper 论文阅读笔记整理
问题
数据序列化对于许多数据中心应用程序来说至关重要,序列化的主要开销在于数据移动,将应用程序数据移动到数据包中所需的内存拷贝成本高昂。最近的零拷贝API暴露了NIC分散收集功能,增加了将数据移动卸载到NIC的可能性。然而,由于分散收集所需的内存协调增加了记账开销,因此分散收集并不总是有用的。
挑战
目前还没有人为现代数据中心NIC上的微秒级应用程序设计完整的序列化库。
-
API:为了易于使用并合并到应用程序中,这样的库必须具有与现有的基于复制的方法类似的API。
-
内存安全:对于防止应用程序和NIC之间的数据竞争是必要的[48,58]。当NIC发送数据时,发送是异步的,如果应用程序在NIC访问数据时释放数据,则可能会发生竞争。零拷贝系统通过消息缓冲区的引用计数等技术来防止这些安全违规行为,而基于拷贝的方法则通过立即将数据返回应用程序来自动提供内存安全。
-
内存透明度:指无论数据在地址空间的任何位置,都能接受数据。通常,NIC只能从内核物理固定的页面进行DMA(因此它们不会交换)。因此,库只能在固定页(DMA安全内存)中零复制应用程序数据。分散收集序列化堆栈必须接受指向任意应用程序地址的指针的对象,自动确定哪些字段不在固定内存中,并复制这些字段。
-
延迟:内存安全性和透明性都有软件缺陷,这可能会抵消微秒环境中硬件卸载的好处。内存安全性和透明性要求堆栈在每次I/O上访问记账数据结构(例如,引用计数、固定内存地址范围)。这些访问可能会导致缓存未命中,从而增加数百纳秒的处理时间。例如,对于64字节对象,原始的分散聚集优于复制,但分散聚集路径中的缓存未命中会导致复制更快。
本文方法
本文提出了Cornflakes,一种混合序列化库堆栈,灵活选择分散聚集或内存副本进行序列化。
-
对现代Mellanox NIC进行的实验发现,分散聚集I/O可以提高512字节以上的缓冲区序列化性能,这一结果包含了内存安全性和透明度的开销。
-
提供了一个透明的混合序列化API,它保证了对零拷贝I/O使用无需保护,同时确保了拷贝和零拷贝的有效执行。
-
当字段至少有512字节时,在DMA安全内存中透明的使用零拷贝。
开源代码:GitHub - deeptir18/cornflakes: A zero-copy serialization library and networking stack.
本文在UDP和TCP网络堆栈中,在Mellanox和Intel NIC上实现了Cornflakes。在Twitter缓存跟踪中,Cornflakes在自定义键值存储中的吞吐量比以前的软件方法高15.4%,在Redis中比Redis序列化的吞吐量高8.8%。
实验
实验环境:2个24核AMD EPYC ROME 7402P 2.80GHz服务器(Cloudlab c6525-100g服务器[10])、关闭C状态、运行Linux 5.04和Ubuntu 20.0、具有大约134MB的L1、L2和L3高速缓存、服务器通过双端口Mellanox ConnectX-5Ex 100 Gb NIC和一个打开巨型帧(MTU=9000字节)的100 Gb Dell Z9264交换机连接。6.4节中使用2台32核AMD EPYC ROME 7452 2.35Ghz服务器(Cloudlab d6515服务器)、通过双端口Mellanox ConnectX-5 100 Gb NIC和2 x 100 Gbs Dell Z9264F-ON交换机连接。6.3节比较了AMD EPYC Milan 7313P 3.0Ghz服务器上的Intel e810-CQDA2 NIC和Mellanox Connect X-6 NIC。6.3节使用一个客户端(带有Mellanox或Intel NIC),该客户端直接连接到一台服务器(分别带有Mellanix或Intel NIC。
数据集:Google protobuf [23]、Twitter缓存跟踪 [56]、Tragen缓存跟踪生成器 [45]、YCSB
实验对比:吞吐量、尾延迟、延迟分布、峰值性能
实验参数:负载强度、数据集、NIC设备、字节大小
总结
针对数据序列化传输,如何为微秒级应用程序设计更高性能的序列化库。需要同时实现:类似API、内存安全、内存透明、低延迟。本文提出了Cornflakes,混合序列化库堆栈,灵活选择分散聚集或内存副本进行序列化。(1)对现代Mellanox NIC进行的实验发现,分散聚集I/O可以提高512字节以上的缓冲区序列化性能。(2)提供了一个透明的混合序列化API,它保证了对零拷贝I/O使用无需保护,同时确保了拷贝和零拷贝的有效执行。(3)当字段至少有512字节时,在DMA安全内存中透明的使用零拷贝,其他使用复制。