Java RDMA 上的套接字 (JSOR) 与 Infiniband 中的 jVerbs 性能

Java Sockets on RDMA (JSOR) vs jVerbs performance in Infiniband

我对 JSOR 和 jVerbs 都有基本的了解。

两者都处理 JNI 的限制并使用快速路径来减少延迟。它们都使用用户 Verbs RDMA 接口来避免上下文切换并提供快速路径访问。两者都具有零拷贝传输选项。

不同的是,JSOR 仍然使用Java Socket 接口。 jVerbs 提供了一个新的接口。 jVerbs 还有一种叫做 Stateful Verbs Call 的东西,可以避免 RDMA 请求的重复序列化,他们说这可以减少延迟。 jVerbs 提供了更原生的接口,应用程序可以直接使用它们。我阅读了 jVerbs SoCC 2013 论文,他们在 jVerbs 之上构建了 jverbsRPC,并表明它显着减少了 zookeeper 和 memcache 操作的延迟。

两者的文档显示它们的性能优于基于 TCP/IP、SDP 和 IPoIB 的常规 Java 套接字。

我没有对 JSOR 和 jVerbs 进行任何性能比较。 我认为 jVerbs 可能比 JSOR 表现更好。但是,使用 JSOR,我不必更改现有代码,因为它仍然使用相同的 java 套接字接口。我的问题是使用 jVerbs 相对于 JSOR 的性能增益是多少。有没有人知道或有处理这两者的经验?如果您有任何比较数据,那将是很棒的。我找不到。

比较 jVerbs 与 JSOR 的性能有点困难。第一个是面向消息的 API,而第二个将 RDMA 隐藏在 Java 个基于流的 API 套接字之后。

这是一些统计数据。我使用一对旧的 ConnectX-2 卡和 Dell PowerEdge 2970 服务器进行测试。 CentOS 7.1 和 Mellanox OFED 版本 3.1.

我只对延迟测试感兴趣。

jVerbs

测试是 RPing 样本的变体(如果有人感兴趣,可以在 github 上 post)。通过可靠连接测试以下调用序列的 5000000 个周期的测量延迟。邮件大小为 256 字节。

PostSendMethod.execute()
PollCQMethod.execute()
CompletionChannel.ackCQEvents()

结果(微秒):

  • 中位数:10.885
  • 99.0% 百分位数:11.663
  • 99.9% 百分位数:17.471
  • 99.99% 百分位数:27.791

JSOR

对 JSOR 套接字进行类似测试。测试是教科书 client/server 套接字示例。消息大小也是 256 字节。

结果(微秒):

  • 中位数:43
  • 99.0% 百分位数:55
  • 99.9% 百分位数:61
  • 99.99% 百分位数:217

这些结果与 OFED 延迟测试相去甚远。在相同的 hardware/OS 标准 ib_send_lat 基准测试中,中值延迟为 2.77 微秒,最大延迟为 23.25 微秒。

这里有一些数字使用 DiSNI -- the newly open sourced successor of IBM's jVerbs -- and DaRPC,使用 DiSNI 的低延迟 RPC 库。

  • 64 字节的 DiSNI RDMA 读取延迟低于 2 微秒
  • DaRPC RDMA send/recv 64 字节(请求和响应)的延迟约为 5 微秒
  • Java/DiSNI和C原生RDMA之间的差异对于单边操作来说可以忽略不计

这些基准测试是在使用 Mellanox ConnectX-3 网络接口连接的两台主机上执行的。

以下是执行基准测试的命令:

(1) 阅读基准

服务器:

java -cp disni-1.0-jar-with-dependencies.jar:disni-1.0-tests.jar com.ibm.disni.examples.benchmarks.AppLauncher -t java-rdma-server -a <address> -o read -s 64 -k 100000 -p

客户:

java -cp disni-1.0-jar-with-dependencies.jar:disni-1.0-tests.jar com.ibm.disni.examples.benchmarks.AppLauncher -t java-rdma-client -a <address> -o read -s 64 -k 100000 -p

(2) Send/recv 基准测试

服务器:

java -cp darpc-1.0-jar-with-dependencies.jar:darpc-1.0-tests.jar com.ibm.darpc.examples.server.DaRPCServer -a <address> -d -l 64 -r 64 

客户:

java -cp darpc-1.0-jar-with-dependencies.jar:darpc-1.0-tests.jar com.ibm.darpc.examples.client.DaRPCClient -a <address> -k 1000000 -l 64 -r 64 -b 1