Introduction
远程直接内存访问(Remote Direct Memory Access,RDMA)通过提供对远程主机内存的低延迟、绕过CPU的访问,已被用于加速各种分布式系统。
问题:应用程序使用RDMA需要进行复杂且昂贵的修改。
这种复杂性来源于RDMA接口本身:很少有分布式应用程序能够用简单的远程内存读写操作来表达它们的逻辑。一部分RDMA应用程序被迫添加额外的操作,即额外的网络往返,牺牲了一些性能优势;另一部分RDMA应用要求CPU参与一些操作,抛弃了RDMA绕过CPU的优势。
因此,本文提出的观点是,现有的RDMA接口无法满足分布式系统的需求,要想实现构建低延迟网络加速的全部潜力,扩展RDMA接口是必要条件。
Background
RPC vs. 内存访问
RDMA提供两种类型的操作:单边操作(READ、WRITE)和双边操作(SEND、RECEIVE),分别对应内存访问模式和RPC模式。
- 单边操作:速度更快,CPU效率更高,但仅限于简单的读写操作。
- 双边操作:允许在两端进行处理,但是通信操作本身较慢。
考虑一个现有的基于RDMA的键值存储Pilaf的实现:它将指向键值对象的指针存储在哈希表中,实际数据存放在单独的区段结构中,这两种结构都是通过RDMA公开的,因此客户端可以通过两次单边操作依次读取指针和键值对象,这不需要CPU的参与,但是需要两次网络往返;而使用双边操作构建的传统键值存储实现只需要一次网络往返,但每个操作都涉及CPU。
trade-off:两次网络往返 or CPU参与?
早期的RDMA中,选择十分明确:RDMA操作比RPC快20倍,因此选择单边操作。而如今,后续工作极大地降低了RPC的成本,且RDMA已经部署在具有更高延迟的大规模网络中,因此使用哪一类的问题变得更加复杂。
本文使用两台40GB以太网连接的服务器测试了单边RDMA和双边eRPC的性能。单边读512B数据需要3.2us,双边RPC需要5.6us,这意味着使用两次单边读要比使用一次RPC慢0.8us。单边RDMA操作只有在不需要更复杂的协议时才会提供性能优势。
Motivation
作者思考了需要哪些新功能来支持在RDMA上运行的分布式系统,从而不需要CPU参与或额外的网络往返。
导航数据结构:大多数应用程序,使用复杂的数据结构来构建索引,存储变长对象。遍历这些结构需要多次RDMA读取。能够在指针上执行间接操作可以消除一些往返。
支持异地更新:为了避免远程数据修改的同时被读取的一致性问题,许多系统只允许服务器CPU执行写操作。为了构建能够使用RDMA操作同时处理读写的系统,本文提出将新数据写入到一个单独的缓冲区中,然后自动更新指针以从旧值交换到新值(类似并发编程中的Read-Copy Update)。要实现这一点,需要新的RDMA原语支持,将数据写入新的缓冲区,并自动更新指向其位置的指针。
乐观并发控制:对复杂数据结构的更新需要同步,使用RDMA实现锁的性能损失可能很大。扩展RDMA的CAS(Compare-and-Swap)功能将允许我们实现复杂的、基于版本的乐观并发控制,这种方法很适合异地更新方法。
链式操作:一个常见的场景是应用程序需要执行复合操作,其中后一个操作的参数取决于前一个操作的结果。这需要将中间结果返回给客户机,并执行一个新的操作以及另一个网络往返。如果有方法将操作链接起来,使一个操作依赖于另一个操作,但仍在一个往返行程中执行它们,就可以避免这种开销。
Design
针对上述挑战,本文提出了一个用于扩展RDMA网络接口的原语PRISM(Primitives for Remote Interaction with System Memory)。
它为现有RDMA接口增加了四个额外的特性,摘要如图。
PRISM原语一起实现了动机中的目标。Indirect操作减少了导航数据结构所需的往返次数。Allocation和Enhanced CAS原语结合Chaining,支持异地更新:一个应用程序可以分配一个新的缓冲区,写入数据到它,并使用CAS在另一个结构中安装一个指向它的指针,所有这些都在一个单一的往返行程中。最后,CAS操作的灵活性使得实现基于版本的并发控制机制成为可能。
Evaluation
论文设计了三个具有代表性的分布式应用来说明PRISM的优势,分别是:
- PRISM-KV:一个键值存储,在RDMA上实现读和写操作;
- PRISM-RS:实现ABD仲裁复制协议的复制存储系统;
- PRISM-TX:一个事务性存储系统,它使用PRISM的原语实现基于时间戳的乐观并发控制协议。
这里仅展示PRISM-KV的测试结果,依次是YCSB-C(100% Read)和YCSB-C(50% Read/50% Write)负载的实验结果。其他实验可见原文。
Thought
本文的工作在单边RDMA读写和双边RPC通信之间提供了一个中间地带,扩展了网络加速应用程序的设计空间。PRISM从原语扩展的角度出发,基于现有分布式系统的需求提出了RDMA应该具有的四种新的特性,使得单边RDMA操作可以完成更丰富的语义。
现有的分布式存储系统普遍使用多次单边操作来执行GET,使用RPC来执行PUT。PRISM的间接特性可以帮助很多这样的应用,减少所需的网络往返次数。
PRISM的劣势在于,它需要系统设计人员对应用进行相应的修改,可能会比较复杂。它相对于使用单边RDMA构建的协议,需要更多的CPU参与。而且在PRISM-KV和PRISM-TX方面,PRISM并没有体现出非常大的性能优势(10%-20%左右)。当传输涉及三个以上主机时,情况会变得更加复杂,此时可能基于PRISM的应用会很难设计。