前言

本博文主要是简单介绍RDMA的概念和与它相关的技术。实现RDMA需要许多其他技术的支持,包括硬件和软件。目前RDMA有多种实现方式,比如RoCE1、INFINIBAND2,不同的实现方式所考虑的东西有很大差别,所以它们的性能和成本相差很大。本片博文只是做一个简单的介绍,如果要深入学习的话不妨看一看最后的链接所指向的内容或者其他论文。

DMA和RDMA的定义:

Definition - wikipedia:

Direct Memory Access (DMA) is an ability of a device to access host memory directly, without the intervention of the CPU.

Remote Direct Memory Access (RDMA) is the ability of accessing (read, write) memory on a remote machine without interrupting the processing of the CPU(s) on that system.3

即是一种不需要CPU参与就能实现I/O的技术。

jdk7和RDMA

jdk7提供了对RDMA的支持,以Sockets Direct Protocol(SDP)的形式被引进jdk7。jdk中的SDP默认是关闭的,需要特定的操作系统和硬件的支持。开启SDP的支持之后,我们的代码不需要改变,不需要重新编译。4

IWARP和RDMA

iWARP (internet Wide Area RDMA Protocol)作为一种通过以太网做RDMA的解决方案,能够实现同Infiniband同样的RDMA特性,通过RDMA来跳过操作系统。WikiPedia是这样说的:iWARP is a computer networking protocol that implements remote direct memory access (RDMA) for efficient data transfer over Internet Protocol networks. 5

iWARP主要的部分是Direct Data Placement Protocol(DDP),DDP负责的不是数据传输,而是由底层的协议(TCP或者SCTP)负责。如果底层的协议是TCP,那么TCP不需要管理报文边界,它不要把要发送的数据当成“协议数据单元”protocol data units(PDU),只管不断地发送字节流。从这一点上看,SCTP,串流控制传输协议英语:Stream Control Transmission Protocol或SCTP)更适合做DDP的底层协议。

通常情况是用硬件来实现iWARP协议,而不是由操作系统内核来实现,因为前者效率高很多,而后者被认为是TCP协议栈的性能瓶颈。

SCTP和TCP

SCTP将资料传给应用层的方式,是将资料视为message(bytes的集合),SCTP的特征是message-oriented,意思就是说它传送的是一串message(每一个message是byte为单位的集合),相对于TCP是以byte为单位,传送的是破碎的串流。在SCTP发送端用一个动作送出讯息,接收端也是用一个动作取出讯息传给对应的应用程序。相较于TCP,是一个串流导向的协定,可靠地且有顺序地传送以bytes为单位的串流。然而TCP并不允许接收端知道发送端的应用程序呼叫送出bytes集合的次数。在发送端TCP只是简单的附加更多bytes在queue里等待着送到网络上,而SCTP是将要送出的outband message都保有自己独立的queue。

InfiniBand

InfiniBand是在高性能计算中点到点网络连接的一项技术标准,以高吞吐量和低延迟著称。可以在计算机内部或者计算机之间使用这项技术。如果是计算机之间使用,可以是计算机之间相连或者通过交换机相连。

和总线结构相比,它既可以在机箱内部使用,也可以在机箱外部,比如可以把计算和存储分别置于不同的机箱中;而后者只能在机箱内部使用,因为传输距离的限制。同时,IB比总线结构更加具有扩展性。后者是有外围设备连接数量的限制,而IB没有这个限制。6

RoCE

RoCE也就是基于以太网的RMDA。7



  1. (http://en.wikipedia.org/wiki/RDMA_over_Converged_Ethernet) ↩
  2. (http://www.mellanox.com/pdf/whitepapers/IB_Intro_WP_190.pdf) ↩
  3. https://en.wikipedia.org/wiki/Remote_direct_memory_access
  4. (https://docs.oracle.com/javase/tutorial/sdp/sockets/index.html) ↩
  5. (https://en.wikipedia.org/wiki/IWARP) ↩
  6. (http://www.mellanox.com/pdf/whitepapers/IB_Intro_WP_190.pdf) ↩
  7. (http://en.wikipedia.org/wiki/RDMA_over_Converged_Ethernet) ↩