问题
将持久存储器(PM)与RDMA相结合,是实现高性能复制分布式密钥值存储(KVS)的一种方法。然而,现有的复制方法在应用于PM KVS时效果不佳。
现有方法局限性
现有的复制方法在应用于PM KVS时效果不佳:
-
使用RPC会导致软件在备份时排队和执行,增加请求延迟。利用单边RDMA WRITE在DRAM中复制数据,可以在关键路径上消除备份的软件排队/执行,与启用RPC的复制相比显著缩短了复制延迟。
-
在PM KVS上使用单边RDMA WRITE的复制方法效果不佳,会在PM上引发严重的设备级写入放大(DLWA)。KVS每个服务器都充当许多分片的备份,从许多远程线程接收大量并发复制写入;而且这些复制写入通常很小(~100B)[24,52]。当PM KVS采用单边RDMA WRITE的复制时,这些备份日志会生成大量PM写入流,其中包含大量小型写入。由于PM具有介质级别的块访问粒度(例如,Optane DIMM中的256B),并且其硬件组合容量有限,因此这些大量写入流会导致严重的DLWA。
本文方法
本文提出了Rowan,一种有效的RDMA抽象来处理PM KVS中的复制写入。聚合来自不同服务器的并发远程写入,并以顺序(因此低DLWA)和单向(因此低延迟)的方式将这些写入降落到PM。
-
让接收器端的控制线程以递增的地址顺序将PM驻留缓冲区推入接收队列。发送方只需要为远程PM写入发出SEND,并等待接收方RNIC生成的ACK。
-
利用两个RNIC硬件功能,共享接收队列(SRQ)[11]和多包接收队列(MP RQ)[7,9],分别合并来自不同连接的写入并支持可变大小的写入。
-
通过最小化控制线程的任务来简化Rowan的控制路径。
通过现成的RDMA NIC实现了Rowan,并构建了Rowan KV。采用日志结构的方法来管理本地PM写入和远程PM写入。每个服务器在PM上维护每个线程的主日志和单个备份日志。对于PUT请求,服务器中的工作线程生成包含目标对象的日志条目,通过CPU指令将日志条目持久化到其本地主日志中,并通过单侧Rowan将每个备份的备份日志持久化。对于GET请求,线程搜索指向日志中对象的DRAM驻留索引。通过这种方式,Rowan KV具有高性能和低DLWA:(1)复制绕过备份的CPU,确保低延迟并节省前台操作的CPU周期;(2) PM写入流的数量很小(即,n个主日志+1个备份日志,其中n是本地线程数),实现了PM硬件中的高效写入组合,从而在很大程度上消除了DLWA。Rowan KV还引入了用于容错的故障转移机制和用于负载平衡的动态重新调度机制。
评估显示,在写密集型工作负载下,与使用RPC和RDMA write进行复制的PM KVS相比,Rowan KV的吞吐量分别提高了1.22倍和1.39倍,平均PUT延迟分别降低了1.77倍和2.11倍,同时大大消除了DLWA。
实验
实验环境:6台机器作为服务器,8台机器作为客户端。每台机器都配备了Intel Xeon Gold 6240M CPU(18个物理/36个逻辑核)、96GB DRAM、一个100Gbps Mellanox ConnectX-5 RNIC。所有机器都连接到100Gbps Mellanox IB交换机。每台服务器机器拥有三个256GB Optane DIMM(ADR模式)。
数据集:YCSB [26]、三种Facebook工作负载 [24]:ZippyDB(用于通用数据存储);UP2X(用于AI/ML服务);UDB(用于社交图)
实验对比:吞吐量、PUT延迟、尾延迟、设备级写方放大(DLWA)、写带宽、故障恢复
实验参数:线程数、日志条目大小、复制因子、
总结
针对使用RDMA优化PM KVS的复制,现有方法存在排队延迟和设备级写放大(DLWA)。本文提出了Rowan,通过RDMA单边动词处理PM KVS的复制写入。聚合来自不同服务器的并发远程写入,并以顺序(因此低DLWA)和单向(因此低延迟)的方式将这些写入降落到PM。(1)让接收器端的控制线程以递增的地址顺序将PM驻留缓冲区推入接收队列。发送方只需要为远程PM写入发出SEND,并等待接收方RNIC生成的ACK。(2)利用两个RNIC硬件功能,共享接收队列(SRQ)和多包接收队列(MP RQ),分别合并来自不同连接的写入并支持可变大小的写入。(3)最小化控制线程的任务来简化Rowan的控制路径。