跳转至

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