基于Java的RDMA高性能通信库(二):JSOR
JSOR为现有的Java™ Socket应用程序提供了一种机制,可以利用InfiniBand等高性能网络基础架构。通过减少网络延迟并改善Java服务器和客户端配置之间的网络带宽,可以提高应用程序性能。
通过指定运行时配置文件来启用远程直接内存访问(RDMA), 这种方式与Sockets Direct Protocol(SDP)配置文件具有类似格式的。启用RDMA后,传统的TCP套接字会透明地切换到RDMA套接字。与传统以太网连接相比,此连接允许客户端和服务器端点通过InfiniBand交换结构以更高的数据传输速率进行通信。JSOR仍然使用Java Socket接口,使用JSOR,应用程序开发者不必更改现有的代码,因为它仍然使用相同的Java Socket套接字接口。JSOR是IBM公司开发的一种基于RDMA的高性能通信库,现在已经放入到IBM SDK, Java Technology Edition 8.0.0 作为IBM Java基础通信库。
1.Comparing JSOR with Java TCP communications
TCP协议依赖于操作系统内核,而RDMA协议绕过操作系统内核,从而实现不同支持RDMA的主机系统上的Java™应用程序之间的直接通信。因此,RDMA网络操作需要较少的处理器资源并提高网络吞吐量。
在传统的Java TCP套接字处理模型中,主机操作系统内核起着关键作用。所有常见网络操作都需要操作系统调用,例如:
- 创建套接字Socket
- 绑定到端口port
- 监听一个知道的地址
- 连接到远程主机
- 接受传入的连接请求
- 在连接的端口之间传输数据
当Java客户端和服务器应用程序存在于不同的主机系统上时,在不同主机系统之间传输数据涉及在网络接口之间与缓冲区之间的多个复制操作。 每个主机系统在此过程中涉及以下缓冲区:
- Java应用缓冲区到Java套接字缓冲区
- Java socket缓冲区到操作系统套接字缓冲区
- 操作系统套接字缓冲区到网络接口驱动程序
在主机系统之间传输数据之前,这些复制操作使用CPU进行数据复制和移动。
与TCP协议不同,RDMA协议是在高速交换结构之上定义的,如InfiniBand,它独立于操作系统内核。相反,网络处理被卸载到专用的RDMA网络接口适配器。RDMA协议允许一个主机上的Java应用程序直接访问不同主机上的Java应用程序的内存。此功能支持在Java应用程序之间直接传输数据。
下图说明了Java客户端和服务器应用程序之间用于TCP / IP通信和RDMA通信所需的连接:
与TCP处理相比,RDMA使用更少的处理器资源,并且可以利用高性能交换结构来最大化支持RDMA的系统之间的数据吞吐量。
2.Comparing JSOR to Java Sockets Direct Protocol (SDP) communications
JSOR在本机级别使用R-Sockets协议API,允许Java™TCP套接字应用程序利用支持RDMA的硬件,而无需对应用程序代码进行任何更改。虽然SDP提供类似的功能,但在Java应用程序可以使用RDMA基础架构之前,需要特定的操作系统才能支持。
套接字直接协议(SDP)是一种标准协议,定义为加速支持RDMA的硬件上的TCP流套接字。但是,此协议依赖于操作系统内核,必须由底层主机操作系统支持。
作为SDP的替代方案,IBM®SDK实现了基于R-Sockets协议的解决方案。R-Sockets在Native Level级别提供RDMA套接字API。此API行为、建立连接、和流数据传输都和之前Scoket传输实现相似。测试表明,与SDP和纯RDMA本机实现相比,此R-Sockets解决方案表现良好。
JSOR使用R-Sockets作为透明地将Java TCP套接字切换到端口之间的RDMA通信的基础。RDMA通信基于运行时配置详细信息。基于Java套接字的应用程序可以在启用RDMA的基础架构上运行时不需要任何代码更改,从而提高网络性能。
3.JSOR features and design
The following JSOR features are available with this release:
- RMDA-enabled Java plain stream sockets
- Support for IPv6
- TCP/IP fall back support for RDMA server sockets
- Extensive call tracing at the JSOR native level
3.1 JSOR Desgin
JSOR库使用两个路由与RDMA网络接口适配器交互,如下图所示:
Fast data path: JSOR库使用OpenFabrics软件(OFS)用户空间谓词模块直接与RDMA网络接口适配器通信。此路由通常用于发送数据。
Slow control path: JSOR库与依赖于设备的内核动词模块交互,以控制和管理RDMA资源对象。该路径主要用于建立连接。
3.2 JSOR Zero copy function
默认情况下,JSOR数据传输涉及使用中间缓冲区复制操作。对于大型数据传输,您可以通过启用零复制功能来提高性能。此函数将数据直接从一台主机上的Java™应用程序内存复制到另一台主机上的Java应用程序内存,而无需在任一主机上使用处理器。
如下图所示,缓冲区复制过程始终使用主机操作系统,从而在用户空间和内核空间之间产生多个中间副本和计算上昂贵的上下文切换。仅当注册缓冲区以用于直接复制操作时,零复制过程才使用主机CPU。注册缓冲区后,数据传输将直接进行。
当应用程序2在图中具有可用于接收数据的缓冲区时,应用程序通过注册缓冲区来直接数据放置来通告该可用性。当应用程序1有要发送的数据时,它会将数据直接写入已注册的缓冲区。当写操作完成时,应用程序1将写完成消息发送到另一侧。当应用程序2收到此消息时,它可以处理传输的数据。数据传输完成后,应用程序2可以取消注册接收缓冲区。
由于缓冲区注册开销,仅当数据传输大小很大时才能实现CPU周期的预期减少。例如,对于单个连接,在数据传输大小超过256 KB之前,您可能看不到减少。如果多个并行连接共享相同的缓冲区以进行直接数据放置,则可以减少此数据阈值。
由于仅在大数据大小时才能实现性能提升,因此默认情况下不启用零复制功能。要启用该功能,请使用 -Dcom.ibm.net.rdma.zeroCopy = true 属性。
4. JSOR limitions
4.1两个RDMA端口之间长时间运行的并行客户端数量有限
此行为与较旧的Mellanox卡及其驱动程序相关联。限制是由底层接口驱动程序分配和重新分配队列对(链接的发送和接收队列)的方式引起的。队列对是在RDMA端点之间发布发送或接收请求的基础。
例如,第一代Mellanox卡MT25208将同时打开的连接数限制为大约300,而第二代Mellanox卡MT26428将该数量限制为大约30。
4.2 启用RDMA的Java应用程序在运行后不会立即关闭
RDMA运行时环境分配和管理许多资源对象,作为每个连接建立的一部分。关闭连接时,将释放这些资源。RDMA运行时环境等待大约1秒,以便在释放资源之前完成并发连接线程。此等待时间反映在启用RDMA的Java应用程序的关闭中
4.3 RDMA连接比TCP连接花费更多时间
连接建立过程在RDMA中比在TCP内更复杂。RDMA连接建立涉及RDMA特定资源对象的创建和管理以及双向事件控制。这种时间增加是使用RDMA的众所周知的副作用。
4.4RDMA连接比TCP连接花费更多时间
JSOR实现不支持临时端口。因此,必须事先修复服务端点并在配置文件中指定。
4.5 当RDMA服务器上未启用TCP回退选项时,RDMA客户端使用TCP进行连接
在这种不寻常的情况下,在未启用TCP回退的情况下运行的启用RDMA的服务器的规则中列出的RDMA客户端尝试使用TCP进行连接。
除非您设置了接受超时,否则RDMA服务器会等待无限期的时间尝试使用RDMA接受连接。默认情况下,每个RDMA端点都有两个部分,一个用于TCP,另一个用于RDMA。在RDMA服务器和RDMA客户端之间建立连接时,它会在后台隐式打开TCP连接。TCP部分用于侦听传入的连接请求。