RDMA技术(解决主从数据库数据不一致问题)

news2024/11/24 22:32:30

优质博文:IT-BLOG-CN

一、简介

RDMA(remote direct memory access)远端直接内存访问,是一种高性能网络通信技术,具有高带宽、低延迟、无CPU消耗等优点。 主要解决网络传输中服务器端数据处理的延迟问题。

Remote:数据通过网络与远程机器间进行数据传输;
Direct:没有内核的参数,有关发送传输的所有内容都卸载到网卡上;
Memory:在用户空间虚拟内存与RNIC网卡直接进行数据传输不涉及到系统内核,没有额外的数据移动和复制;
Accesssend/recevie/read/write/atomic操作;

二、传统通信模式

使用TCP/IP协议的应用程序通常采用应用编程接口:UNIX BSD的套接字socket,来实现网络进程之间的通信。就目前而言,几乎所有的应用程序都是采用socket。无论编写客户端程序还是服务端程序,系统都要为每个TCP连接都要创建一个socket句柄。这样导致了每次传输通信,都要经过OS和协议栈的管理,因此不管是Socket同步通信还是异步通信,都会存在CPU占用过高的现象,并且需要额外的数据处理,已经无法满足更快,更高效和可扩展性的网络需求。

传统网络通信模式的流程:

【1】数据发送方需要讲数据从用户应用空间Buffer复制到内核空间的Socket Buffer中;
【2】然后Kernel空间中添加数据包头,进行数据封装。通过一系列多层网络协议的数据包处理工作;
【3】数据被PushNIC网卡中的Buffer进行网络传输;
【4】消息接受方接受从远程机器发送的数据包后,要将数据包从NIC buffer中复制数据到Socket Buffer
【5】然后经过一些列的多层网络协议进行数据包的解析工作;
【6】解析后的数据被复制到相应位置的用户应用空间Buffer
【7】这个时候再进行系统上下文切换,用户应用程序才被调用;

三、RDMA

RDMA就是为了解决网络传输中服务器端数据处理的延迟而产生的,无需使用CPU,就可以从一个主机或服务器的内存直接访问另一个主机或服务器内存。这样既提高了宽带又降低了延迟、抖动和CPU消耗。RDMA可以简单理解为利用相关的硬件和网络技术,服务器A的网卡可以直接读服务器B的内存。如下图应用程序不需要参与数据传输过程,只需要指定内存读写地址,开启传输并等待传输完成即可。

使用RDMA的优势如下:
【1】零拷贝Zero-copy 应用程序能够直接执行数据传输,在不涉及到网络软件栈的情况下。数据能够被直接发送到缓冲区或者能够直接从缓冲区里接收,而不需要被复制到网络层。
【2】内核旁路Kernel bypass 应用程序可以直接在用户态执行数据传输,不需要在内核态与用户态之间做上下文切换。
【3】不需要CPU干预No CPU involvement 应用程序可以访问远程主机内存而不消耗远程主机中的任何CPU。远程主机内存能够被读取而不需要远程主机上的进程或CPU参与。远程主机的CPU的缓存cache不会被访问的内存内容所填充。
【4】消息基于事务Message based transactions 数据被处理为离散消息而不是流,消除了应用程序将流切割为不同消息/事务的需求。
【5】支持分散/聚合条目Scatter/gather entries support RDMA原生态支持分散/聚合。也就是说,读取多个内存缓冲区然后作为一个流发出去或者接收一个流然后写入到多个内存缓冲区里去。

四、RDMA网络

目前,大致有三类RDMA网络,分别是Infiniband/RoCE/iWARP。其中,Infiniband是一种专为RDMA设计的网络,从硬件级别保证可靠传输,而RoCEiWARP都是基于以太网的RDMA技术,支持相应的verbs接口。

InfiniBand: 采用Cut-Through转发模式,减少转发时延;基于Credit的流控机制,保证无丢包;硬件卸载;Buffer尽可能小,减少报文被缓冲的时延。

iWARP(RDMA over TCP/IP): 利用成熟的IP网络,继承RDMA的优点,TCP/IP硬件实现成本高,但如果采用传统IP网络的丢包策略对性能影响大。

RoCE: InfiniBand Trade Association(IBTA)标准中定义的网络协议,允许通过以太网络使用RDMA。可以看作是RDMA技术在数据中心、云、存储和虚拟环境中的应用。RoCE协议存在RoCEv1RoCEv2两个版本,这取决于所使用的网络适配器和网卡。RoCE v1是基于以太网链路层实现的RDMA协议(交换机需要支持PFC等流控技术,在物理层保证可靠传输),允许在同一个VLAN中的两台主机进行通信。RoCE v1协议在以太层的typeID0x8915RoCE v2克服了RoCE v1绑定到单个VLAN的限制。通过改变数据包封装,包括IPUDP标头,RoCE v2现在可以跨L2L3网络使用。

RDMA API(Verbs)主要有两种: 一个名为OpenFabric Alliance的组织提供了RDMA传输的一系列Verbs API,开发了OFED(Open Fabric Enterprise Distribution)协议栈,支持多种RDMA传输层协议。RDMA应用和RNIC(RDMA-aware Network Interface Controller)之间的传输接口层Software Transport Interface被称为VerbsRDMA API
【1】内存Verbs也叫One-SidedRDMA。包括RDMA Reads/RDMA Atomic这种模式下的RDMA访问完全不需要远端机的任何确认。
【2】消息Verbs也叫Two-SidedRDMA。包括RDMA Send/RDMA Receive这种模式下的RDMA访问需要远端机CPU的参与。

在实际中,SEND/RECEIVE多用于连接控制类报文,而数据报文多是通过READ/WRITE来完成的。

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

五、RDMA 工作流程

Memory Registration(MR)内存注册:创建两个key (localremote)指向需要操作的内存区域,注册的keys是数据传输请求的一部分。同时,RDMA硬件对用来做数据传输的内存是有特殊要求的。
【1】在数据传输过程中,应用程序不能修改数据所在的内存。
【2】操作系统不能对数据所在的内存进行page out操作,物理地址和虚拟地址的映射必须是固定不变的。

Queues队列:RDMA一共支持三种队列,发送队列SQ和接收队列RQ,完成队列CQ。其中,SQRQ通常成对创建,被称为Queue Pairs(QP)RDMA是基于消息的传输协议,数据传输都是异步操作。RDMA操作其实很简单,可以理解为:
【1】Host提交工作请求WR到工作队列WQ: 工作队列包括发送队列SQ和接收队列CQ。工作队列的每一个元素叫做WQE, 也就是WR
【2】Host从完成队列CQ中获取工作完成WC: 完成队列里的每一个叫做CQE,也就是WC
【3】具有RDMA引擎的硬件hardware就是一个队列元素处理器。RDMA硬件不断地从工作队列WQ中去取工作请求WR来执行,执行完了就给完成队列CQ中放置工作完成WC

从生产者-消费者的角度理解:
【1】Host生产WR, 把WR放到WQ中;
【2】RDMA硬件消费WR
【3】RDMA硬件生产WC, 把WC放到CQ中去;
【4】Host消费WC

Send/Recv操作: SEND/RECEIVE是双边操作,即需要通信双方的参与,并且RECEIVE要先于SEND执行,这样对方才能发送数据,当然如果对方不需要发送数据,可以不执行RECEIVE操作,因此该过程和传统通信相似,区别在于RDMA的零拷贝网络技术和内核旁路,延迟低,多用于传输短的控制消息。

read/write操作:
【1】RDMA读操作本质上就是Pull操作, 把远程系统内存里的数据拉回到本地系统的内存里。接收方必须提供虚拟地址和目标存储内存的remote_key。接收方需要初始和接受提醒通知,发送方是完全被动的,并且不会接受任何通知。
【2】RDMA写操作本质上就是Push操作,把本地系统内存里的数据推送到远程系统的内存里。发送方必须提供虚拟地址和目标读取内存的remote_key。发送方需要初始和接受提醒通知,接受方是完全被动的,并且不会接受任何通知。

RDMA工作流程: 要使用RDMA首先要建立从RDMA到应用程序内存的数据路径 ,可以通过RDMA专有的verbs interface接口来建立这些数据路径,一旦数据路径建立后,就可以直接访问用户空间buffer
【1】初始化context注册内存域;
【2】建立RDMA连接;
【3】通过SEND/RECEIVE操作,C/S交换包含RDMA memory region keyMSG_MR消息(一般是客户端先发送);
【4】通过WRITE/READ操作,进行数据传输(单边操作);
【5】发送MSG_DONE消息,关闭连接;

消息服务建立在通信双方本端和远端应用之间创建的Channel-IO连接之上。当应用需要通信时,就会创建一条Channel连接,每条Channel的首尾端点是两对Queue Pairs(QP)
每对QPSend Queue(SQ)Receive Queue(RQ)构成,这些队列中管理着各种类型的消息。QP会被映射到应用的虚拟地址空间,使得应用直接通过它访问RNIC网卡。
除了QP描述的两种基本队列之外,RDMA还提供一种队列Complete Queue(CQ)CQ用来知会用户WQ上的消息已经被处理完。
RDMA提供了一套软件传输接口,方便用户创建传输请求Work Request(WR),WR中描述了应用希望传输到Channel对端的消息内容,WR通知QP中的某个队列Work Queue(WQ)
WQ中,用户的WR被转化为Work Queue Element(WQE)的格式,等待RNIC的异步调度解析,并从WQE指向的Buffer中拿到真正的消息发送到Channel对端。

RDMA双边操作(send/receive): 对于双边操作为例,A向B发送数据的流程如下:
【1】首先,A和B都要创建并初始化好各自的QPCQ
【2】A和B分别向自己的WQ中注册WQE,对于A,WQ=SQWQE描述指向一个等到被发送的数据;对于B,WQ=RQWQE描述指向一块用于存储数据的buffer
【3】A的RNIC异步调度轮到A的WQE,解析到这是一个SEND消息,从buffer中直接向B发出数据。数据流到达B的RNIC后,B的WQE被消耗,并把数据直接存储到WQE指向的存储位置;
【4】AB通信完成后,A的CQ中会产生一个完成消息CQE表示发送完成。与此同时,B的CQ中也会产生一个完成消息表示接收完成。每个WQWQE的处理完成都会产生一个CQE
【5】双边操作与传统网络的底层buffer pool类似,收发双方的参与过程并无差别,区别在零拷贝、kernel bypass,实际上传统网络中一些高级的网络SOC已经实现类似功能。对于RDMA,这是一种复杂的消息传输模式,多用于传输短的控制消息;

RDAM单边操作(read): READWRITE是单边操作,只需要本端明确信息的源和目的地址,远端应用不必感知此次通信。对于操作发起端,数据的读或写都通过在RNIC与应用Buffer之间完成,再由远端RNIC封装成消息返回到本端。对于单边操作,以B对A的read操作为例,数据的流程如下:
【1】首先A、B建立连接,QP已经创建并且初始化。
【2】数据被存档在A的buffer地址VA,注意VA应该提前注册到A的RNIC,并拿到返回的local key,相当于RDMA操作这块buffer的权限。
【3】A把数据地址VAkey封装到专用的报文传送到B,这相当于A把数据buffer的操作权交给了B。同时A在它的WQ中注册进一个WR,以用于接收数据传输的B返回的状态。
【4】B在收到A的送过来的数据VAR_key后,RNIC会把它们连同存储地址VB到封装RDMA READ,这个过程A、B两端不需要任何软件参与,就可以将A的数据存储到B的VB虚拟地址。
【5】B在存储完成后,会向A返回整个数据传输的状态信息。

单边操作传输方式是RDMA与传统网络传输的最大不同,只需提供直接访问远程的虚拟地址,无须远程应用的参与其中,这种方式适用于批量数据传输。

六、如何实现RoCE

通常,为了实现RoCE,可以安装支持RoCE的网卡或卡驱动程序。所有以太网NIC都需要RoCE网络适配器卡。RoCE驱动程序在Red HatLinuxMicrosoft Windows和其他常见操作系统中使用。RoCE有两种可用方式:对于网络交换机,可以选择使用支持PFC(优先流控制)操作系统的交换机;对于机架服务器或主机,需要使用网卡。

RoCE 的好处:
【1】CPU占用率: 访问远程交换机或服务器的内存,无需消耗远程服务器上的CPU周期,从而可以充分利用可用带宽和更高的可伸缩性。
【2】零复制: 向远程缓冲区发送数据和接收数据。
【3】高效: 由于RoCE改善了延迟和吞吐量,网络性能得到了很大提高。
【4】节省成本: 借助RoCE,无需购买新设备或更换以太网基础设施即可处理大量数据,从而大大节省了公司的资本支出。

七、RoCE与iWARP/InfiniBand的区别

RDMA最早在Infiniband传输网络上实现,技术先进,但是价格高昂,后来业界厂家把RDMA移植到传统Ethernet以太网上,降低了RDMA的使用成本,推动了RDMA技术普及。在Ethernet以太网上,根据协议栈融合度的差异,分为iWARPRoCE两种技术,而RoCE又包括RoCEv1RoCEv2两个版本(RoCEv2的最大改进是支持IP路由),各RDMA网络协议栈的对比如下图所示。

Infiniband支持RDMA的新一代网络协议。由于这是一种新的网络技术,因此需要支持该技术的NIC和交换机。

RoCE一个允许在以太网上执行RDMA的网络协议。其较低的网络标头是以太网标头,其较高的网络标头(包括数据)是InfiniBand标头。这支持在标准以太网基础设施(交换机)上使用RDMA。只有网卡应该是特殊的,支持RoCE

iWARP一个允许在TCP上执行RDMA的网络协议。IBRoCE中存在的功能在iWARP中不受支持。这支持在标准以太网基础设施(交换机)上使用RDMA。只有网卡应该是特殊的,并且支持iWARP(如果使用CPU卸载),否则所有iWARP堆栈都可以在软件中实现,并且丧失了大部分RDMA性能优势。

InfiniBandiWARPRoCE
标准组织IBTAIETFIBTA
性能最好稍差(受TCP影响)与IB相当
成本
网卡厂商Mellanox 40GbpsChelsio 10GbpsMellanox-40Gbps Emulex-10/40Gbps

RoCEiWARP,一个是基于无连接协议UDP,一个是基于面向连接的协议(如TCP)。RoCEv1只能局限在一个二层广播域内,而RoCEv2iWARP都能够支持三层路由。相比RoCE,在大型组网的情况下,iWARP的大量TCP连接会占用大量的额内存资源,对系统规格要求更高。另外,RoCE支持组播,而iWARP还没有相关的标准定义。

RoCE适配器只能与其他RoCE适配器通信,如果混合适配器类型配置的话,例如RoCE适配器与iWARP适配器组合,都可能会恢复为传统的TCP/IP连接。

在数据中心中运行RDMA,可以减轻数据移动的负担,并为应用程序提供更高的CPU资源可用性。RoCE协议可以从RDMA的功能中受益,而无需更改其网络基础架构。通过减少以太网延迟和CPU开销,RoCE可以提高搜索、存储、数据库和高事务处理率应用程序的性能。通过提高CPU效率和应用程序性能,RoCE可以减少所需的服务器数量,从而节省能源,并减少基于以太网的数据中心的占用空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1050865.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.centos7 安装显卡驱动、cuda、cudnn

安装conda 参考 python包 2.安装conda python库-CSDN博客3.Cenots Swin-Transformer-Object-Detection环境配置-CSDN博客 1.安装显卡驱动 步骤1:安装依赖 yum -y install kernel-devel yum -y install epel-release yum -y install gcc 步骤2:查询显…

Windows中实现将bat或exe文件作为服务_且实现命令行安装、配置、启动、删除服务

一、背景描述 在Windows环境下进行日常的项目开发过程中,有时候需要将bat文件或exe文件程序注册为Windows的服务实现开机自己运行(没有用户登陆,服务在开机后也可以照常运行)、且对于那些没有用户交互界面的exe程序来说只要在后台…

华秋DFM从2.1.6升级到3.x版本出现的问题

以前一直使用CAM350检查最终的gerber,后来无意中接触到了华秋DFM,使用起来简单许多,将可制造性排查的相当完整。 但是前不久因为一块板卡刚出炉,需要检查DFM,于是开启了华秋,刚打开,说可以更新…

华为云云耀云服务器L实例评测 | 实例评测使用之体验评测:华为云云耀云服务器安全加固/防范黑客攻击

华为云云耀云服务器L实例评测 | 实例评测使用之体验评测:华为云云耀云服务器安全加固/防范黑客攻击 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为云云…

SpringCloud之NamedContextFactory

NamedContextFactory 可以创建一个子容器&#xff08;或者说子上下文&#xff09;&#xff0c;每个子容器可以通过 Specification 定义 Bean。 public abstract class NamedContextFactory<C extends NamedContextFactory.Specification>implements DisposableBean, App…

Opengl之多光源

GLSL中的函数和C函数很相似&#xff0c;它有一个函数名、一个返回值类型&#xff0c;如果函数不是在main函数之前声明的&#xff0c;我们还必须在代码文件顶部声明一个原型。我们对每个光照类型都创建一个不同的函数&#xff1a;定向光、点光源和聚光。 当我们在场景中使用多个…

413 Request Entity Too Large问题

问题背景 在某系统中上传文件时&#xff0c;如果文件大小超过了一定范围就会爆 413 Request Entity Too Large 问题。 原因 在使用 nginx 反向代理后台服务时&#xff0c;如果请求体中过大&#xff0c;超过了默认的 1M 则会爆该错误。 解决方案 在 nginx 中&#xff0c;指…

Linux 创建 终止线程(thread)

进程线程区别 创建线程 #include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); -功能&#xff1a;创建一个子线程&#xff0c;一般情况下main函数所在的线程称为主线程&#xff0c;…

C++标准模板(STL)- 输入/输出操纵符-(std::setprecision,std::setw)

操纵符是令代码能以 operator<< 或 operator>> 控制输入/输出流的帮助函数。 不以参数调用的操纵符&#xff08;例如 std::cout << std::boolalpha; 或 std::cin >> std::hex; &#xff09;实现为接受到流的引用为其唯一参数的函数。 basic_ostream::…

微信、支付宝、百度、抖音开放平台第三方代小程序开发总结

大家好&#xff0c;我是小悟 小伙伴们都开启小长假了吧&#xff0c;值此中秋国庆双节之际&#xff0c;小悟祝所有的小伙伴们节日快乐。 支付宝社区很用心&#xff0c;还特意给寄了袋月饼&#xff0c;愿中秋节的圆月带给你身体健康&#xff0c;幸福团圆&#xff0c;国庆节的旗帜…

【AI视野·今日CV 计算机视觉论文速览 第257期】Fri, 29 Sep 2023

AI视野今日CS.CV 计算机视觉论文速览 Fri, 29 Sep 2023 Totally 99 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Learning to Transform for Generalizable Instance-wise Invariance Authors Utkarsh Singhal, Carlos Esteves, Ameesh M…

json对象中嵌套一个json字符串,python如何生成带有转义字符的json的字符串?

前言 不想用java去弄&#xff0c;一顿操作json.dumps也没用&#xff0c;后面才知道需要这么操作 目的生成&#xff1a; data {"json": "{\"key1\": \"value1\", \"key2\": \"value2\"}" }但是直接用 import …

Scala第七章节

Scala第七章节 scala总目录 章节目标 掌握继承和抽象类相关知识点掌握匿名内部类的用法了解类型转换的内容掌握动物类案例 1. 继承 1.1 概述 实际开发中, 我们发现好多类中的内容是相似的(例如: 相似的属性和行为), 每次写很麻烦. 于是我们可以把这些相似的内容提取出来单…

探索社会工程的深度:从定义到高级攻击策略

在广阔的网络安全领域&#xff0c;社会工程作为一种微妙的威胁而出现&#xff0c;它利用人类的漏洞来访问敏感信息或实施欺诈。网络安全背景下的社会工程的定义很明确&#xff1a;它包括使用欺骗手段操纵个人泄露机密或个人信息&#xff0c;然后将这些信息用于欺诈目的。 此类…

树与二叉树的概念 性质及其存储结构

&#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;数据结构 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &#x1f339;&#x1f339;&#x1f339;关注我带你学习编程知识 树与二叉树 树的概念与结构&#xff1a;树的概…

ROS2 从头开始​​:第6部分 - ROS2 中的 DDS,用于可靠的机器人通信

一、说明 在这篇文章中,我们将重点关注 ROS 2的通信栈DDS,其中这是介于管理节点通信与控制节点通信环节,是上位机决策体系与下位机的控制体系实现指令-执行-反馈的关键实现机制。 二、ROS工程的概念框架 现代机器人系统非常复杂,因为需要集成各种类型的传感器、执行器和其…

pygame - 贪吃蛇小游戏

蛇每吃掉一个身体块&#xff0c;蛇身就增加一个长度。为了统一计算&#xff0c;界面的尺寸和游戏元素的位置都是身体块长度的倍数 1. 上下左右方向键&#xff08;或者ASDW键&#xff09;控制蛇的移动方向 2. 空格键暂停和继续图片文件&#xff0c;复制到项目的asset\img目录下i…

每天只需这样做,轻松提升你的演讲口才

锻炼自己的演讲口才需要长期的练习。以下几点方法可以帮助你提高&#xff1a; 1. 多观看优秀演讲视频。观看他人优秀的演讲&#xff0c;可以学习到他人的语调、节奏、动作表情等技巧&#xff0c;这对我们提高自己的很有帮助。例如可以观看TED演讲、企业年会等形式的演讲视频。…

从零开始的C++(二)

1.为什么C有函数重载但是C没有函数重载&#xff1f; 这涉及了C、C的函数命名习惯&#xff0c;在C语言编译阶段&#xff0c;函数的命名不会受其参数列表的影响&#xff0c;即只要函数名相同编译出的函数名就相同。但在C中&#xff0c;函数命名受影响&#xff0c;如下图所示&…

uboot启动流程-uboot链接接脚本

一. uboot 启动流程 本文我们来详细的分析一下 uboot 的启动流程&#xff0c;理清 uboot 是如何启动的。通过对 uboot 启动流程的梳理。 我们就可以掌握一些外设是在哪里被初始化的&#xff0c;这样当我们需要修改这些外设驱动的时候就会心里有数。另外&#xff0c;通过分析 …