`
steeven
  • 浏览: 306845 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于SoftRoCE 了解RDMA

    博客分类:
  • RDMA
阅读更多
RDMA是基于IB技术的内存直接传送,无需内核参与,硬件网卡搞定。IB需要HPC领域的专用硬件,ROCE则是RDMA协议在普通以太网卡的实现,RoCEv1是在MAC上的二层封装,局域网内可以,要通过路由器则需要RoCEv2, 基于UDP的版本。

那么RDMA为什么快呢?普通网卡要接收完整报文,支持RoCE网卡直接读写内存,不用去内核绕圈子。就像我们有1G内存要复制到对方,这是个大快递,一般我们用socket编程要通过kernel这个邮局,有很多限制,比如它有报文大小限制,你要自己拆分多次发送,邮局是国企,内部流程也比较复杂,发个快递又费劲又慢,而且他们还消耗很多资源. RoCE就是民营快递,不用等你去邮局,告诉他你的内存在哪,要送到对方哪个地址,再大的内存他们都老鼠搬家一样在后台默默搞定,你的CPU就可以干点别的。同样,读远程内存也是。还可以选择要不要回执签收。

和DPDK不大一样的是DPDK只是跳过了邮局,自己封装报文给网卡,而RoCE则打包的事情都不需要管,比快递公司还勤快。所以RDMA可以看做网卡上封装的消息机制,层次高一些。说了这么多好处,大家是不是迫不及待要体验一下呢?支持RoCE的网卡在淘宝上也要几百块还是拆机的,貌似还是10G的,还好有SoftRoCE,基于普通网卡用软件实现了硬件要做的事情,在虚拟机上就能体验一下到底有多神奇,重在体验,实测效率不高。。。。其实这技术出来好多年了,只是一直。。。

SoftRoCE安装步骤参见 https://github.com/SoftRoCE/rxe-dev/wiki/rxe-dev:-Home 其他readme什么的都不够新。

rxe-dev其实就是完整的内核,在里面增加了rxe驱动和一个头文件,master下面的代码不要用,不够新。用v18分支,编译出来的内核是4.7版本。注意这个克隆+编译过程都很慢。。。
在centos7下面需要安装bc, ncurses-devel, openssl-devel. 编译安装完后grub下面会多出4.7的内核启动菜单,进入后用rxe-cfg start, 然后rxe-cfg add <eth>, 可以运行的测试命令主要在ib-utils和rdma-utils里面, rping, rdma_server/client, qperf, ibv_rc_pingpong都可以玩玩看。

RDMA主要有recv/send, 这个机制是俩边要握手的,这边send,那边要有人recv。IB的verb,也就是这些send/recv是顺序执行的,如果那边没人收,你后面就废了。。 同理,你要收的时候,对方要有人发,否则你就挂在那傻等。。 recv这个命令必须等,send命令可选不用等,也就是un-signaled,类似寄信没回执,但是有个特例,就是你send一堆不用等的消息,以为扔bomb一样没事了,网卡没发,为什么呢?因为需要有个signaled来触发批量发送(看到有人提到这个问题, 没验证),这个设计比较傻,虽然提高了效率。。。 根据我编程测试un-signaled很容易,init_attr.sq_sig_all = 0,send_attr里面不要带IBV_SEND_SIGNALED。这个signaled就一直失败...

再说说read/write, 这两个是不需要对方参与的直接存取远端内存。首先这两个send flags里面必须IBV_SEND_SIGNALED,不带server那边就不响应。测试1M内存大概0.5S读写个来回。 建议大家对每个rdma_xxx命令都打印出跟上个命令之间的耗时,这样很容易知道哪边没响应,或者响应慢。同时再抓包看看每个方向的udp大概对不对。read/write貌似比较傻,不能对远端同一地址r/w, 只能是两个不同地址。而且不能对地址加上偏移部分存取。。。不知道我的测试是不是哪里不对。。。 r/w还必须知道远程内存的address和key, 用前面的send/recv要回来,然后就可以r/w.

这里有个小小疑问send/recv机制貌似是主从方式的,比如只有客户端向服务端发送请求,服务端一直在recv, 客户端有请求就send. 如果双方是对等的,是不是只能再开一个通道来传递消息呢?这个rdma_get_recv_comp()可是阻塞方式的,那不是要两个线程?

rdma_accept之前必须有个rdma_recv, 这个逻辑不科学,一般建立连接再去收发。。没有的话服务器也能工作,只不过第一个请求会被delay 0.5Sec.

基本代码参照rdma_server.c 和rdma_client.c。
推荐两个文档,不能google的Yahoo也能找到:
   RDMA Read and Write with IB Verbs
   Introduction to RDMA Programming
  
理论上RDMA封装层次高一些,而且硬件加送,节省CPU, 延时小。但是编程模型上跟以前不同,还要跟各种诡异的现象做斗争。。 从性能看,如果有网卡成本不高,几乎以前所有的socket通信都可以porting到这种高效率的传输方式上。

RDMA还支持组播,不稳定传输方式(音频,视频)。。。

从管理上看,ROCE用在VM上要有对应的监管方式,调试上也会比较挑战,比如怎么去抓包。

Anyway如果你的系统需要提高网络传输效率,解放CPU, 应该看看ROCE。
分享到:
评论
6 楼 steeven 2016-09-23  
steeven 写道
关于为什么要post-receive先于acceept和list, 可以这样理解: 一般编程是try{...} catch{...}, 因为IB是异步的,对方可能在catch之前就发出消息,如果没有缓存会导致逻辑错误,所以就变成了一个比较难看的样子:catch{try{....}....}

Send/Recv应该都是这样,待验证。

验证结果非常正确,以前经常流量一大起来就中断,现在连续发上一个小时都没问题

在SoftRoce下测试经过1G网卡大概200Mbps的吞吐量

用Roce网卡测试20Gbps
5 楼 steeven 2016-09-15  
关于为什么要post-receive先于acceept和list, 可以这样理解: 一般编程是try{...} catch{...}, 因为IB是异步的,对方可能在catch之前就发出消息,如果没有缓存会导致逻辑错误,所以就变成了一个比较难看的样子:catch{try{....}....}

Send/Recv应该都是这样,待验证。
4 楼 steeven 2016-09-13  
这个讲的很详细:
http://www.mellanox.com/related-docs/prod_software/RDMA_Aware_Programming_user_manual.pdf

注册内存由多种小块组合成,也可以把内存划分为多个window来访问,比较灵活。
还讲了多播方式。
3 楼 steeven 2016-09-13  
RoCE网卡
NVMe支持了ROCE变成了NVMf (fabric),这也是一种网卡
SWAP支持ROCE变成SWAPf
每家数据库都变成XXDBf
这要衍生出多少专用新硬件?
2 楼 steeven 2016-09-13  
steeven 写道
这里能看到PDF更多教程,包括上面三部曲作者的三篇大作,IB world里面最容易看懂的文章

http://www.hpcadvisorycouncil.com/network_training.php
1 楼 steeven 2016-09-12  
好文章要骑墙:

很通俗的一个教程:
https://zcopy.wordpress.com/2010/10/08/quick-concepts-part-1-%E2%80%93-introduction-to-rdma/

三部曲:
https://thegeekinthecorner.wordpress.com/2010/08/13/building-an-rdma-capable-application-with-ib-verbs-part-1-basics/

https://thegeekinthecorner.wordpress.com/2010/08/14/building-an-rdma-capable-application-with-ib-verbs-part-2-the-server/

https://thegeekinthecorner.wordpress.com/2010/08/14/building-an-rdma-capable-application-with-ib-verbs-part-3-the-client/

其中提到:Receives have to be posted before sends.
Hardware won’t buffer incoming messages — if a receive request has not been posted to the work queue, the incoming message is rejected and the peer will receive a receiver-not-ready (RNR) error. 就是说连接建立之前要提前接收,硬件不缓存。实测结果就是不这么做你的第一个send请求会超时0.6Sec

这里还有两篇关于Flow Control 和 Read/Write教程:
   https://thegeekinthecorner.wordpress.com/page/2/

相关推荐

Global site tag (gtag.js) - Google Analytics