两种以太网 RDMA 协议: iWARP 和 RoCE

本文是讲演 How Ethernet RDMA Protocols iWARP and RoCE Support NVMe over Fabrics【1】的摘要。

如果 NVMe 存储系统与主机是分离的,显然需要某种 fabric 把它们连接,这样主机才能使用存储系统。目前,支持远程连接的 fabric 包括:

  • RDMA 协议:底层可以是以太网( RoCE 或者 iWARP )或者 Infiniband
  • Fibre Channel 协议:底层可以是 FC 网络或者以太网(FCoE)

一、为什么需要 RDMA ?

RDMA (Remote Direct Memory Access) 是一种绕过主机 (host-offload/host-bypass) 技术:一个应用(包括存储)<--发送/接收数据-->另外一个(远程)应用的内存空间。

  • Source Application <-- (发送/接收、完成)队列 --> 带 RDMA 功能的网卡 <-- 可靠的网络连接 --> 带RDMA 功能的网卡 <-- (发送/接收、完成)队列 --> Target Application

 由上图可知,应用程序可以从一台(物理的或者虚拟的)机器直接传送数据到另外一台机器,这既提高了带宽又降低了延迟、抖动和 CPU 消耗。

各种操作系统支持 RDMA :

  • Windows Server: 从 Windows HPC Server 2008 开始支持 Network Direct userspace API ;从 Windows Server 2012 开始支持 Network Direct kernel API
  • Linux: 从2004年开始,由 OpenFabrics Alliance 提供 userspace/kernel API , RHEL 和 SLES 已经自带, Ubuntu 要自己安装?
  • FreeBSD 9.0+ 支持 OpenFabrics Alliance userspace/kernel API

具体来说, RDMA 技术特性带来的好处如下图所示:

  NVMe 设备延迟很低,这就要求网络延迟也必须很低, RDMA 正好满足这一点。

二、用 RDMA 发送 NVMe 写命令

 以一个 NVMe 写操作为例。 NVMe 主机驱动把写命令及数据(从 NVMe 提交队列取出一项)封装一个与底层传输无关的命令胶囊(capsule);胶囊被放到主机 RDMA 网卡的发送队列中,由 RDMA_SEND 发送出去;目标主机的 RDMA 网卡在接收队列中收到这个胶囊,解除封装,把 NVMe 命令及数据放到目标主机的内存中;目标主机处理 NVMe 命令及数据;完成后,目标主机封装一个 NVMe 命令完成项,由 RDMA 传输到源主机。

三、两种基于以太网的 RDMA 协议

第一种:以太网->IP->UDP->RoCE (RDMA over Converged Ethernet) v2

第二种:以太网->IP->TCP(去掉 TCP/IP 流量控制和管理)->iWARP

不同协议的网卡之间并不兼容,也就说支持 RoCE 协议的网卡不能与支持 iWARP 协议的网卡交换数据。

两种协议的供应商上台系统不一样,

 对底层网络基础设施的要求也不一样:

 了解更多细节,

【1】How Ethernet RDMA Protocols iWARP and RoCE Support NVMe over Fabrics https://www.brighttalk.com/webcast/663/185909

基于SoftRoCE 了解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。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RDMA(Remote Direct Memory Access)是一种数据传输技术,它允许主机之间直接访问彼此的内存,而无需通过操作系统的介入。RDMA可以显著提高数据传输效率和降低处理延迟,常用于高性能计算、存储网络和数据中心等领域。ROCE(RDMA over Converged Ethernet)和Iwarp都是基于RDMA技术的协议,但有一些区别: 1. ROCE(RDMA over Converged Ethernet):ROCE是一种在以太网上实现RDMA协议。它利用以太网的物理层和数据链路层,通过使用特殊的以太网帧格式和扩展头部来实现RDMA功能。ROCE可以在现有以太网基础设施上实现低延迟、高带宽的数据传输,并且与以太网交换机和路由器兼容。 2. Iwarp:Iwarp是一种在TCP/IP网络上实现RDMA协议。它通过在TCP/IP协议栈中添加额外的RDMA支持来实现数据直接存取。Iwarp协议需要在操作系统内核中进行实现,因此需要特定的驱动程序和软件支持。由于基于TCP/IP协议,Iwarp可以在现有的IP网络基础设施上使用。 在ROCE和Iwarp之间选择时,需要考虑以下因素: - 兼容性:ROCE和Iwarp在不同的网络基础设施上有不同的兼容性要求。ROCE需要支持特殊的以太网帧格式和扩展头部,而Iwarp需要特定的驱动程序和软件支持。 - 性能:ROCE和Iwarp在性能上可能有所不同。ROCE在以太网上实现RDMA,可以提供较低的延迟和较高的带宽。而Iwarp基于TCP/IP协议,可能受到TCP协议的限制,性能可能相对较低。 - 配置和管理:ROCE和Iwarp在配置和管理方面也有所不同。ROCE可以利用现有的以太网基础设施,配置相对简单。而Iwarp需要特定的驱动程序和软件支持,可能需要额外的配置和管理工作。 最终选择ROCE还是Iwarp取决于具体的应用需求、网络环境以及设备兼容性等因素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值