RDMA原理剖析

DMA(直接内存访问 Direct Memory Access)

DMA模式可以同DMA Engine之间通过硬件将数据从Buffer 1移动到Buffer 2,允许计算机主板上的设备直接把数据发送到内存中去,而不需要CPU参与操作,大大降低了CPU Copy的开销。

传统TCP/IP技术在数据包处理过程中,要经过操作系统及其他软件层,需要占用大量的服务器资源和内存总线带宽,数据在系统内存、处理器缓存和网络控制器缓存之间来回进行复制移动,通过CPU进行数据Copy来移动数据,将Buffer 1中的数据移动到Buffer 2中,给服务器的CPU和内存造成了沉重负担。尤其是网络带宽、处理器速度与内存带宽的严重“不匹配性”,更加剧了网络延迟效应。

用户进程想要执行IO操作时(向磁盘读数据,写数据),由于用户进程工作在用户模式下,它没有执行这些操作的权限,只能通过发起对应的系统调用请求操作系统帮忙完成这些操作,这里因为系统调用产生中断将陷入到内核,进行一次上下文切换操作。
内核进程帮忙执行IO操作时,由于IO操作相比于CPU来说是极慢的操作,CPU不应该等待在这个过程中,而是切换到其他进程上去执行其他任务,又得上下文切换,从内核态回到用户态。

在以前,确实是操作系统进程掌控CPU来参与IO操作,但是现在都是使用DMA技术,也就是可以直接读,写内存,而不再需要操作系统做这样的操作。
DMA要求硬件支持,需要在硬件中集成一个小型的"CPU",比如现在的机械硬盘,固态硬盘,网卡等硬件都带有DMA功能,这样操作系统要执行IO操作时,直接将相关指令发送给这些DMA硬件,DMA处理器负责IO操作,而操作系统这时可以放弃CPU,让CPU去执行其他进程。
如:
对于读磁盘文件时,操作系统将相关指令以及数据应该写在哪个内存地址发送给DMA硬件后,由DMA硬件去读写数据到指定内存地址,当IO操作完成后,DMA硬件通过总线发送一个硬件中断给CPU,于是陷入到内核态(一次上下文切换),内核就知道了IO已经完成,于是将kernel Buffer数据拷贝到用户进程的IO Buffer,并准备调度用户进程(上下文切换)
使用DMA后,只有4次必要的上下文切换,且IO操作的过程中完全不需要消耗CPU资源。

RDMA:

前面介绍缓冲空间时提到过,一般情况下,每个用户进程要读、写数据,都会经过两个必要的缓冲层:内核空间的kernel Buffer、用户空间的IO Buffer,如:读文件数据时,先将数据拷贝到内核的缓冲空间(page cache),然后陷入内核,内核将该缓冲空间数据拷贝到用户空间的缓冲空间(IO Buffer),当调度到用户进程时,用户进程从自己的缓冲空间读取数据。

DMA机制并没有绕过这两个缓冲层,但使用RDMA机制,程序可以直接绕过kernel buffer,内核发现是RDMA操作后,直接告诉RDMA硬件将读取的数据,写入到用户空间的IO Buffer,而不需要先拷贝到Kernel Buffer,再拷贝到IO Buffer,虽然RDMA比DMA不会减少上下文切换的次数,但是是它减少了内存数据拷贝的过程,相当于是使用了O_DIRECT标记的直接IO技术。
RDMA一般实现在网卡上。
RDMA技术是内核旁路技术的一种

RDMA操作:
1 RDMA Send | RDMA发送(/接收)操作 (Send/Recv)

跟TCP/IP的send/recv是类似的,不同的是RDMA是基于消息的数据传输协议(而不是基于字节流的传输协议),所有数据包的组装都在RDMA硬件上完成的,也就是说OSI模型中的下面4层(传输层,网络层,数据链路层,物理层)都在RDMA硬件上完成。

2 RDMA Read | RDMA读操作 (Pull)

RDMA读操作本质上就是Pull操作, 把远程系统内存里的数据拉回到本地系统的内存里。

3 RDMA Write | RDMA写操作 (Push)

RDMA写操作本质上就是Push操作,把本地系统内存里的数据推送到远程系统的内存里。

4 RDMA Write with Immediate Data | 支持立即的RDMA写操作

支持立即的RDMA写操作本质上就是给远程系统Push(推送)带外(OOB)数据, 这跟TCP里的带外数据是类似的。

OOB数据特点:

1.OOB数据每次只能是一个字符
2.普通数据使用一般方式接收与发送,OOB数据使用MSG_OOB接收与发送
3.一个数据使用MSG_OOB,则最后一个字符是OOB数据,其他的是非OOB数据
4.OOB数据是优先数据。优先体现在什么地方?
在我看来OOB数据优先体现在同一次发送数据(包含普通数据和OOB数据)时,OOB数据会优先于普通数据到达目标端。下边有实例可以认证这一点。

带外数据发送过程:和普通数据发送过程一样,只是在数据字符串最后一个字符处设置一个标记,目标端接收到字符串,也是存放在一个描述符号中,但是会将指针指向最后一个字符上;接收进程发现字符上有带外数据标记,会发送信号SIGURG(紧急数据),即带外数据的优先级体现在信号的优先。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: RDMA(Remote Direct Memory Access)是一种数据传输技术,它允许在网络中直接访问远程主机的内存,而无需经过CPU的干预。RDMA原理和技术实现主要包括以下几个方面。 首先,RDMA利用物理网卡的功能来实现直接内存访问。传统的网络数据传输方式中,数据需要从发送端通过CPU拷贝到发送端网卡的发送缓冲区,然后发送到接收端,再通过接收端网卡进入接收缓冲区,最后再通过CPU从接收缓冲区拷贝到接收端的内存中。而RDMA技术通过使网卡可以直接访问主机内存,省去了CPU的拷贝过程,从而大大提高了数据传输的效率。 其次,RDMA还借助于信号量和排队机制来实现数据传输的效率和可靠性。每个发送和接收操作都有一个独立的发送或接收队列,通过引入排队机制,可以并行处理多个传输请求,减少了传输的延迟。而信号量机制则用于控制发送和接收操作的顺序和进度,保证数据传输的可靠性和正确性。 此外,RDMA还采用了零拷贝和数据仲裁技术,进一步提高了数据传输的效率。零拷贝技术指的是在数据传输中直接传递内存地址而不是数据本身,减少了数据的复制和移动,提高了传输速度。而数据仲裁技术则用于解决并发访问共享内存时的冲突问题,保证数据传输的正确性。 总结起来,RDMA通过直接访问远程主机内存、利用信号量和排队机制、采用零拷贝和数据仲裁技术等手段,实现了高效的数据传输。它在高性能计算、数据中心和云计算等领域具有广泛的应用前景。 ### 回答2: RDMA(Remote Direct Memory Access)是一种高性能的网络通信技术,其原理是通过绕过操作系统内核,直接在网络适配器和内存之间传输数据。传统的网络通信方式中,数据需要在发送和接收端之间经过多次从用户空间到内核空间的拷贝操作,增加了延迟和CPU开销。而RDMA技术的出现在一定程度上解决了这个问题。 RDMA的实现需要支持RDMA的网卡和适配器,以及RDMA协议栈。RDMA协议栈通常由三个主要组件组成:传输层、网络层和传输服务层。其中传输层主要负责数据的可靠传输,如RDMA传输协议DCTP(Datagram Congestion Control Protocol);网络层负责路由和寻址,包括IP、IB(InfiniBand)等;传输服务层则提供上层应用程序使用的API。而RDMA的核心操作则是RDMA read和RDMA write,用于实现对远程内存的直接读写访问。 在RDMA原理分析和技术实现的PDF中,通常会介绍RDMA的基本概念、工作原理和通信过程等内容。首先会讲解RDMA的基本原理和优势,解释RDMA如何绕过内核,直接访问内存。接着会详细介绍RDMA的传输层、网络层和传输服务层的组成和功能。同时也会介绍DCTP协议的工作原理和优化策略,如流控制、拥塞控制等。 此外,PDF中还会介绍如何使用RDMA技术实现高性能的应用程序通信。这部分会重点介绍RDMA的编程模型和API,如Verbs API等,以及如何利用RDMA技术优化数据传输的方法。此外,还会介绍RDMA技术在不同领域的应用案例,如分布式存储、机器学习等。 综上所述,RDMA原理分析和技术实现PDF会详细介绍RDMA的工作原理、协议栈和通信过程,以及如何使用RDMA技术实现高性能的应用程序通信。通过阅读该PDF,读者可以深入了解RDMA技术,并应用于实际的系统开发中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值