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。git