跳转至

RDMA 就是快

问题描述

TCP/IP 协议基于软件协议栈传输的这种方式已经无法适应高速数据传输的需求,成为网络性能进一步增长的瓶颈,特别是应用数据在用户态和内核态之间的拷贝带来 ms 级的延时,协议栈对数据包的解析、寻址、校验等操作需要消耗大量 CPU 资源。为此,RDMA 技术替代了传统的 TCP/IP 软件协议栈的设计。RDMA 的全称是远程直接内存访问(remote direct memory access),它在硬件上实现了 kernel bypass 技术,数据不需要经过软件协议栈,并且不需要 CPU 参与寻址、解析等操作,从而提供低延时、高带宽、低 CPU 使用的性能优势。

然而,想要充分挖掘 RDMA 的性能优势并不是一个容易的任务。我们这里假设一个最简单的场景:有一个数据生产者 producer 与一个数据消费者 consumer,生产者不断给 consumer 发送数据。我们在附件提供了一个样例程序。该样例程序包含了 producerconsumer 的实现。作为参赛者,你需要进一步优化该样例程序,以达到更大的传输性能。注意,参赛者的最终提交不能修改其中的 farm_cons.cppfarm_prod.cpp(改了也没用),其余文件都可以自由改动.。

你可以做的事情包括但不限于: 对原有的 ringbuffer 进行常数优化;调整原有 ringbuffer 的参数;调整 RDMA 的传输参数与设置以适应应用场景;利用 RDMA 原语自由设计新的数据结构。

(你也可以到 https://github.com/N2-Sys/rdma-ringbuffer-demo 去看未经比赛工作组修改的程序)

你主要需要关注的文件是 farm.hfarm.cppcommon.cpp 包含一些 rdma 与 ringbuffer 的通用接口,你也可以复用或改动其中的代码。注意,如果需要深入改动代码,你最好对 RDMA 编程有一些基本的了解,我们提供了一些参考资料。

提示:

大包已经快接近物理极限了,主要是小包优化。

评测环境 ib 卡的 max_mtu 是 4096KB

测试方法

测试分为若干轮。每一轮都会传输多个 message,message 大小随着轮数逐渐增大,是以 64B 为首项,8 为公比直至 1MB 的等比数列。每一轮传输的数据总量为 25GB,每个点时间越少,分数越高。

具体来说:你的得分由你程序的加速比确定,可以参考下表:

Size ZeroScoreSpeed(MiB/s) FullScoreSpeed(MiB/s) Score
64 104 1044 40
512 860 4304 40
4096 5746 8650 40
32768 10222 11500 10
262144 9730 11000 10
1048576 7015 10500 10

另有 10 分的满分奖励

提交方法

你需要保留初始工作区的架构,修改其中文件。

将你的答案打包成 zip 后提交,请注意:所有文件必须放在压缩文件的根下。我们将编译你的程序,进行测试。

具体解释:什么叫所有文件必须放在压缩文件的根下

压缩文件不包括子目录,直接解压就得到文件,目录结构举例:

- include/
- farm_prod.cpp
- farm_cons.cpp
- farm.cpp
- common.cpp
- cmake/
- CMakeLists.txt

而不是:

- rdma
  - include/
  - farm_prod.cpp
  - farm_cons.cpp
  - farm.cpp
  - common.cpp
  - cmake/
  - CMakeLists.txt

附件

初始工作区

下载rdma.zip