本文是讲演 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。

两种以太网 RDMA 协议: iWARP 和 RoCE相关推荐

  1. IPsec协议的两种工作方式 协议三大部分 简介

    IPsec协议的两种工作方式: 隧道(tunnel)模式:用户的整个IP数据报被用来计算AH或ESP头,AH或ESP头以及ESP加密的用户数据被封装在一个新的IP数据包中.通常,隧道模式应用在两个安全 ...

  2. SOAP和HTTP 两种基本传输协议

    1.SOAP:Simple Object Access Protocol ^{Symbolic Optimal Assembly Program}. 2.1.HTTP-GET  2.2.HTTP-PO ...

  3. rsync文件同步的两种方式——ssh协议和守护进程(端口873)

    http://rickie622.blog.163.com/blog/static/2123881120131280153540/ 转载于:https://blog.51cto.com/zhukeqi ...

  4. 在Java中实现SFTP协议文件传输的两种解决方案

    在Java中实现SFTP协议文件传输的两种解决方案 1.1 背景 1.2 关于 FTP /FTPS 1.3 关于SFTP 解决方案一:使用 JSch 库 解决方案二:使用sshj 库 这篇博文来聊聊在 ...

  5. 4种DNS安全协议对比:DNSSEC,DNSCrypt,DNS over TLS,DNS over HTTPS

    DNS域名系统(Domain Name System的缩写),是一个将域名和IP地址相互映射的分布式数据库,能够使人通过便于记忆的域名地址访问互联网,而无需记住长串毫无关联性的IP地址.DNS可以理解 ...

  6. 一文读懂工业设备的两种通讯方式:现场总线和工业以太网

    随着传统制造企业正在加快智能制造转型的进程,工业互联网迅速在全世界范围内兴起.在工业互联网的技术构架中,通过各类通讯方式接入不同设备.系统和产品,来采集海量数据是其重要的一环.本文将重点介绍工业底层设 ...

  7. ipv6单播地址包括哪两种类型_IPV6中为啥没有ARP了呢?一文带你搞懂NDP邻居发现协议...

    前言 前面我们介绍了ICMPv6协议 除了提供ICMPv4常用的基本功能之外,还有邻居发现(ND)的功能.一文带你看懂ICMPv6和ICMPv4的区别 那么究竟什么是邻居发现协议(ND)呢? 邻居发现 ...

  8. 路由选择协议在哪一层_米家智能插座背后的两种无线协议——Wi-Fi与ZigBee区别体现在哪?...

    随着科技的发展,智能家居的概念深入人心,人们利用智慧不断开创新的生活.比尔盖茨是第一个智能家居的使用者,也许很多人会认为智能家居的高端性符合像比尔盖茨那样有"钱"的人,其实不然,随 ...

  9. 融合了距离矢量和链路状态两种路由选择协议的优点

    个人电脑开始进入千家万户.与之伴随产生的是电脑的利用问题.越来越多的电脑处于闲置状态,即使在开机状态下中央处理器的潜力也远远不能被完全利用. EIGRP是最典型的平衡混合路由选择协议,它融合了距离矢量 ...

最新文章

  1. [bzoj1042][HAOI2008]硬币购物
  2. 选错导师误终身?Nature大调查显示 :全球1/4博士生想换导师
  3. 听李宏毅点评GPT-3:来自猎人暗黑大陆的模型
  4. 网络推广外包——网络推广外包公司为每个线下商城实现“线上梦”!
  5. python转行it好学吗-我研一想转行it,建议Java还是Python呢?
  6. apache和PHP配置文件
  7. 2021-01-07 matlab数值分析 线性方程组的迭代解法 高斯-赛德尔迭代法
  8. 故障转移集群仲裁盘_windows 2012 标准版 集群 仲裁盘和共享盘无法转移
  9. 元器件大一点好,还是小一点好?
  10. 水晶报表的统计功能-Crystal Report Sub total Per Page
  11. Android自定义控件系列--Path综述
  12. npm i和npm install命令
  13. 10.性能测试软技能
  14. Linux 简单架设防火墙路由器
  15. 天行健,君子以自强不息;地势坤,君子以厚德载物的权威解释
  16. 开源资产管理系统SNIPE-IT搭建
  17. 【php基础入门】小白整理PHP常用的字符串函数使用总结分析(推荐)
  18. 记一次摸不着头脑的FullGC问题 (Thumbnails压缩图片占用巨大内存)
  19. 压力变送器和差压变送器的区别
  20. 竹笋炒肉转载 -- 读《Effective java 中文版》(2)

热门文章

  1. 含BD的vivado版本的升级和降级的tcl方法以及若干掉进去的坑
  2. Windows 11: 登录电脑不需要用 pin code 或者密码password
  3. 最小编辑距离算法及python实现
  4. 台达DVP16ES2接线
  5. IBM的三种异地容灾方案
  6. 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别。
  7. c语言 截止频率6低通滤波器,如何用c语言实现截止频率为200hz的巴特沃斯低通滤波器...
  8. Win11系统恢复经典的右键菜单方法
  9. python 埋点 库_测试~python库介绍(一) opencv
  10. 将新的驱动源文件添加进android内核进行编译