RDMA (Remote Direct Memory Access) 全称为 远程直接内存访问

其出现的目的:为了解决网络传输中服务端数据处理的延迟而产生的。其将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。这允许高吞吐、低延迟的网络通信,尤其适合在大规模并行计算机集群中使用。RDMA通过网络把资料直接传入计算机的存储区,将数据从一个系统快速移动到远程系统存储器中,而不对操作系统造成任何影响,这样就不需要用到多少计算机的处理能力。它消除了外部存储器复制和上下文切换的开销,因而能解放内存带宽和CPU周期用于改进应用系统性能。

RDMA三大特性:CPU offload 、kernel bypass、zero-copy。

RDMA提供了基于消息队列的点对点通信,每个应用都可以直接获取自己的消息,无需OS和协议栈的介入。

调用栈:

传统tcp/ip数据流动方式:

进程 buffer (用户空间)-> socket buffer(内核空间) -> 添加包头(内核空间)-> NIC buffer (网卡设备)-> 网络->接收端反向解析<--

特点:各层次分工完善,但是数据在传输过程中出现多次拷贝;产生延迟较高,也一定程度上浪费了内存和计算资源;

网络测试的五项指标:

  • 可用性(availability):可使用ping 命令测试网络是否通畅;
  • 响应时间(response time):ping 命令echo request/reply 一次往返所花费的时间;
  • 网络利用率(network utilization):指的是网络使用时间和空闲时间的比例;
  • 网络吞吐量(network throughput):在网络中两个节点之间,提供给网络应用的剩余带宽,测试网络吞吐的时候,需要在一天的不同时刻来进行测量;
  • 网络带宽容量(network bandwidth capacity):与吞吐不同,网络带宽容量指的是在网络两个节点之间的最大可用带宽。该值是由网络设备本身的能力决定的。

其中两个最重要的指标是高带宽和低延迟。

通信延迟 =传输延迟 + 处理延迟;

处理延迟:发生在消息的发送端和消息的接收端; 传输延迟:发生在消息在发送方和接收方之间网络上;

通信过程中处理开销主要指:buffer 管理,不同空间的消息复制,消息发送和接收过程中系统的中断;

网络中传播的消息的种类:

Large Messages: 此类消息可以理解为:传输大块文件数据;此类模式中,网络传输延迟占整个通信中的主导地位;

Small Messages: 此类消息可以理解为:传输文件元数据信息;此类模式中,处理延迟在整个通信过程中的主导地位;

传统TCP/IP存在的问题:

传统的TCP/IP的问题,主要是IO瓶颈,在高速网络条件下与网络I/O相关的主机处理的高开销限制了可以在机器之间发送的带宽。由上面的数据流动方式,我们可以看到,这里的高开销主要是数据移动和复制操作;主要是传统的TCP/IP网络通信是通过内核发送消息。Messaging passing through kernel这种方式会导致很低的性能和很低的灵活性。性能低下的原因主要是由于网络通信通过内核传递,这种通信方式存在的很高的数据移动和数据复制的开销。并且现如今内存带宽性相较如CPU带宽和网络带宽有着很大的差异。很低的灵活性的原因主要是所有网络通信协议通过内核传递,这种方式很难去支持新的网络协议和新的消息通信协议和发送、接收接口。

高性能网络通信相关研究:

  • TCP Offloading Engine(TOE):将加解包的工作下移到网卡上,需要特定网卡支持;
  • User-Net Networking(U-Net):将整个协议栈移动到用户空间中,从数据通信路径中,彻底删除内核,带来高性能和高灵活性的提升;

内核接口只涉及到连接步骤,在传输过程中,减少了数据在用户空间和内核空间的复制;

  • Virtual interface Architecture(VIA):VIA 通过为每个应用进程提供受保护的,对网络硬件进行存取的接口-Virtual Interface,从而消除了传统模式下的系统处理开销;
  • Remote Direct Memroy Access(RDMA)

RDMA 通过网络,把数据资料,直接传入计算机的存储区,消除了存储器件的赋值和上下文切换开销;其有低延迟,低CPU负载和高带宽三种特性;

RDMA 操作:

应用和RNIC之间的传输接口层(software transport interface)被称为Verbs

Memory verbs: RDMA read、write 和 atomic 操作。这些操作指定远程地址进行操作并绕过接收者的CPU; (单边操作,应用无感知)

Messaging verbs: 包括RDMA send、receive 操作。动作涉及到响应者的CPU,发送的数据被写入到由响应者CPU先前发布的接收所指定的地址;(双边操作,需应用感知)

send/receive 多用于连接控制类报文,而数据报文多是通过READ/WRITE 来完成的。双边操作与传统网络的底层Buffer Pool 类似,双方参与的过程并无差别。主要区别在于RDMA的零拷贝和Kernel Bypass。对于RDMA 这是一种负载的消息传输模式,多用于传输短的控制消息;

RC 表示可靠连接;UC 表示不可靠连接;UD 表示不可靠的数据报,不支持memory verbs;

RDMA 实现:

RDMA 目前有三种不同实现:InfiniBand,iWarp(internet Wide Area RDMA Protocol),RoCE(RDMA over Converged Ethernet);

Infiniband是一种专为RDMA设计的网络,从硬件级别保证可靠传输 , 而RoCE 和 iWARP都是基于以太网的RDMA技术,支持相应的verbs接口。从图中不难发现,RoCE协议存在RoCEv1和RoCEv2两个版本,主要区别RoCEv1是基于以太网链路层实现的RDMA协议(交换机需要支持PFC等流控技术,在物理层保证可靠传输),而RoCEv2是以太网TCP/IP协议中UDP层实现。从性能上,很明显Infiniband网络最好,但网卡和交换机是价格也很高,然而RoCEv2和iWARP仅需使用特殊的网卡就可以了,价格也相对便宜很多。

Infiniband:支持RDMA的新一代网络协议。 由于这是一种新的网络技术,因此需要支持该技术的NIC和交换机。
RoCE:允许在以太网上执行RDMA的网络协议。 其较低的网络标头是以太网标头,其较高的网络标头(包括数据)是InfiniBand标头。 这支持在标准以太网基础设施(交换机)上使用RDMA。 只有网卡应该是特殊的,支持RoCE。
iWARP:一个允许在TCP上执行RDMA的网络协议。 IB和RoCE中存在的功能在iWARP中不受支持。 这支持在标准以太网基础设施(交换机)上使用RDMA。 只有网卡应该是特殊的,并且支持iWARP(如果使用CPU卸载),否则所有iWARP堆栈都可以在SW中实现,并且丧失了大部分RDMA性能优势。

RDMA 结构图:

RDMA工作过程:

  • 应用执行RDMA读写请求的时候,不需要内核内存参与,RDMA 请求直接从用户空间的应用发送到本地NIC(网卡);
  • NIC 读取缓冲区内容,并通过网络传送到远程NIC;
  • 在网络上传输的RDMA信息,包含目标虚拟地址,内存钥匙和数据本身;请求既可以完全在用户空间中处理(使用主动轮询机制),又可以在应用一直睡眠到请求完成时的情况下,通过系统中断处理。RDMA操作使得应用可以从一个远程应用的内存中(远程应用的虚拟内存)读取数据或者向这个内存中写数据;
  • 目标NIC确认内存钥匙(key),直接将数据写入应用缓存中。用于操作的远程虚拟内存地址包含在RDMA信息中;

RMDA 中专有名词和对应缩写:

Channel-IO:RDMA 在本端应用和远端应用间创建的一个消息通道;

Queue Pairs(QP):每个消息通道两端是两对QP;

Send Queue(SQ): 发送队列,队列中的内容为WQE;

Receive Queue(RQ):接收队列,队列中的内容为WQE;

Work Queue Element(WQE):工作队列元素,WQE指向一块用于存储数据的Buffer;

Work Queue(WQ): 工作队列,在发送过程中 WQ =  SQ; 在接收过程中WQ = WQ;

Complete Queue(CQ): 完成队列,CQ用于告诉用户WQ上的消息已经被处理完成;

Work Request(WR):传输请求,WR描述了应用希望传输到Channel对端的消息内容,在WQ中转化为 WQE 格式的信息;

参考链接:

https://blog.csdn.net/qq_21125183/article/details/80563463

保持更新,资源来源于对网上资料总结,如果对您有帮助,请关注 cnblogs.com/xuyaowen .

RDMA 相关 简要摘录的更多相关文章

  1. GPU 编程相关 简要摘录

    GPU 编程可以称为异构编程,最近由于机器学习的火热,很多模型越来越依赖于GPU来进行加速运算,所以异构计算的位置越来越重要:异构编程,主要是指CPU+GPU或者CPU+其他设备(FPGA等)协同计算 ...

  2. web.xml相关知识摘录整理

    web.xml 中的listener. filter.servlet 加载顺序及其详解 在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人 ...

  3. fuse3 编译相关简要记录 与 fuse3 系统调优;

    下面是在使用fuse3 编译bbfs 过程中一些参数,用于备忘: FUSE_CFLAGS="-I/usr/local/include/fuse3" FUSE_LIBS=" ...

  4. RDMA相关的技术网站

    https://www.cnblogs.com/vlhn/p/7909893.html https://www.cnblogs.com/vlhn/ 这个家伙的博客写的还不错,可以参考.

  5. linux 磁盘IO测试工具:FIO (同时简要介绍dd工具测试)

    FIO是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证.磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类. 目前主流的第三方IO测试工具有fio.iomete ...

  6. SSH agent 的使用 - 资料摘录

    下面是一些ssh agent的资料简要摘录,网路上的相关的文章已经很多了: ssh 推荐的登录方式是使用私钥登录.但是如果生成私钥的时候,设置了口令(passphrase),每次登录时需要输入口令也很 ...

  7. RDMA调研报告&一点随笔

    计算所科研实践随笔 被淹没在论文海里的两个星期. 早上7:10分起床,草草洗漱,7:30出发,开始漫长的1小时通勤.从地铁站的安检口起,队便排的极长,让人看得头皮发麻.下到了轨道旁稍好,但每趟呼啸而来 ...

  8. [转帖]深入浅出全面解析RDMA

    深入浅出全面解析RDMA 置顶 2018年06月04日 11:36:54 MasterT-J 阅读数 17193更多 所属专栏: RDMA   RDMA(RemoteDirect Memory Acc ...

  9. nomasp 博客导读:Android、UWP、Algorithm、Lisp(找工作中……

    Profile Introduction to Blog 您能看到这篇博客导读是我的荣幸.本博客会持续更新.感谢您的支持.欢迎您的关注与留言.博客有多个专栏,各自是关于 Android应用开发 .Wi ...

随机推荐

  1. Linux Zookeeper 安装, 带视频

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 面试必备+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 疯狂创客圈 高并发 ...

  2. 从无到有通过IDEA搭建SpringBoot项目

    本人第一次写博客希望记录当下,努力成为IT界中的清流,写的不好多多包涵. SpringBoot是由Pivotal团队在2013年开始研发.2014年4月发布第一个版本的全新开源的轻量级框架.它基于Sp ...

  3. IT兄弟连 HTML5教程 CSS3属性特效 弹性盒模型

    CSS3引入了新的盒模型——弹性盒模型,该模型决定一个盒子在其他盒子中的分布方式以及如何处理可用的空间.使用该模型,可以很轻松的创建自适应浏览器窗口的流动布局或自适应字体大小的弹性布局.弹性盒模型看起 ...

  4. Python Exception处理

    Python中的错误处理分为两类:语法错误和异常处理.语法错误一般是指由于python语句.表达式.函数等存在书写格式活语法规则上的错误抛出的异常,如python常见的缩进控制,若同层次的执行语句存在 ...

  5. urllib模块使用笔记

    文中所有python代码均使用的是python2.7实现,与python3并不兼容. UrlLib模块 urllib模块是适用于一个简单的网络数据获取和处理(不能处理有关验证和cookie等功能),官 ...

  6. Virtual Box复制虚拟机

    用惯了VM换BOX还是有点不大一样的,比如复制 我用了2个网卡,所以看起来麻烦了一次 注释了UUID 应该有更好的办法来操作,下面的看起来有点啰嗦,先凑合着这样弄... 1.关机 2.复制 3.改名称 ...

  7. python serial模块使用,是pyserial而非serial

    import serial from serial.tools.list_ports import comports 运行这两句时分别遇到错误 第一个先提示 no module name of ser ...

  8. 你真的理解Java 注解吗?

    你真的理解Java 注解吗? 1.什么是注解? 官方解释: Java 注解用于为 Java 代码提供元数据.作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的.Java ...

  9. CF#603 Div2

    差不多半年没打cf,还是一样的菜:不过也没什么,当时是激情,现在已是兴趣了,开心就好. A Sweet Problem 思维,公式推一下过了 B PIN Codes 队友字符串取余过了,结果今天早上一 ...

  10. win 10 命令行导出注册表

    命令如下: reg  export  注册表中的key  保存路径 reg export HKLM\Software\MyCo\MyApp AppBkUp.reg 如果需要直接覆盖原来的文件,可以加上 ...