RDMA通信4:MR(Memory Region, 内存区域)基本概念和作用

news2024/11/13 15:26:39

MR简介

RDMA通信中MR(Memory Region)指的是由RDMA软件层在内存中规划出的一片区域,用于存放收发的数据。IB协议中,用户在申请完用于存放数据的内存区域之后,都需要通过调用IB框架提供的API注册MR,才能让RDMA网卡访问这片内存区域。MR就是一块RDMA通信过程中申请使用的内存。一个系统中可以有多个MR。

 视频教程在这:

1.5 RDMA MR(Memory Region, 内存区域)基本概念和作用_哔哩哔哩_bilibili

MR主要有如下三个作用

1、虚拟地址到物理地址的转化

2、控制访问权限

3、避免换页

哈哈哈,下面就简单解释下。

一、虚拟地址到物理地址的转化

RDMA通信过程中,应用程序提供的缓存地址是虚拟地址,但网卡需要物理地址才能通过总线访问主机内存。

CPU的MMU模块可通过查询操作系统建立的系统页表得到物理地址。MMU是Memory Management Unit的缩写,内存管理单元,有时称作分页内存管理单元。

但是RDMA网卡难以利用MMU,原因是:

1、每种CPU体系结构的页表格式不完全相同

但更重要的原因是,没有权限:

2、页表是系统的核心功能,为保障系统安全,不能访问。

因此注册MR的过程中,RDMA网卡驱动创建并填写一个虚拟地址到物理地址的映射表,映射表被存储在RDMA网卡的Memory Translation Table(MTT)中,这样需要的时候就能通过查表把虚拟地址转换成物理地址了。

二、控制访问权限

网卡具有访问内存的能力,如果用户/恶意程序/Bug传入了一个非法的地址(比如系统内存或者其他进程使用的内存),网卡对其进行读写可能造成信息泄露或者内存覆盖。因此需要一种机制来确保网卡只能访问已被授权的、安全的内存地址。

注册MR的动作会产生两个密钥——L_Key(Local Key,本地密钥)和R_Key(Remote Key,远程密钥),说是钥匙,它们的实体其实就是一串序列而已。它们将分别用于保障对于本地和远端内存区域的访问权限。下面两张图分别是描述L_Key和R_Key的作用,通过L_Key可访问RDMA注册的MR,R_Key可访问远端RDMA注册的MR,其余区域都访问不了:

本地是如何知道对端节点的可用虚拟地址和对应的R_Key的?其实两端的节点在真正的RDMA通信之前,都会通过某些方式先建立一条链路(比如Socket连接)并通过这条链路交换一些RDMA通信所必须的信息(比如对端的数据缓存虚拟地址和长度,R_Key,QPN等)。

在访问对端MR时,需要把对端MR的R_Key填写到本地的WQE(工作队列元素)中。

三、避免换页

计算机物理内存是有限的,所以操作系统在操作系统内存不足时,通过换页机制来暂时把某个进程不用的内存内容保存到硬盘中,并在系统页表中删除相应的表项。当该进程需要使用时,再通过缺页中断把硬盘中的内容搬移回内存,并保证内存页的虚拟地址不变。

此时数据所在内存的虚拟地址没变,但物理地址变了。这会导致虚拟地址到物理地址的映射关系发生改变。但RDMA网卡经常会绕过CPU对用户提供的虚拟地址进行访问,如果虚拟地址到物理地址的映射关系发生改变,MR地址映射表就失去了意义,RDMA网卡将无法正确的找到物理地址。

为了防止换页所导致的虚拟地址到物理地址映射关系发生改变,注册MR时会调用Linux内核提供的pin_user_pages_fast函数"Pin"住这块内存(亦称“锁页”),即锁定虚拟地址到物理地址的映射关系。也就是说,MR这块内存区域会长期存在于物理内存中不被换页,直到完成通信之后,用户主动注销这片MR。

参考资料:

Linux高性能网络详解,从DPDP、RDMA到XDP

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

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

相关文章

Linux常用特殊符号

1、 > 和 >> 用法 这两个符号> 和 >> 主要区别如下: 符号>:覆盖现有文件,如果目录中不存在上述名称的文件,则创建一个文件。 符号>>:追加现有文件,如果目录中不存在上述名称的文…

Qt/C++音视频开发79-采集websocket视频流/打开ws开头的地址/音视频同步/保存到MP4文件/视频回放

一、前言 随着音视频的爆发式的增长,各种推拉流应用场景应运而生,基本上都要求各个端都能查看实时视频流,比如PC端、手机端、网页端,在网页端用websocket来接收并解码实时视频流显示,是一个非常常规的场景&#xff0c…

达梦数据库迁移DTS表对比

达梦数据库迁移DTS表对比 背景 达梦数据库迁移mysql2dm,使用dts迁移后的表数据精度不对,需要修正。网上很难搜到,特此记录。 DTS对比数据 1.创建对比 2.设置源库和目标库 3.选择对比选项 4.指定模式 5.指定对象 选择添加源确定 点击配置…

AI学习记录 -使用react开发一个网页,对接chatgpt接口,附带一些英语的学习prompt

实现了如下功能(使用react实现,原创) 实现功能: 1、对接gpt35模型问答,并实现了流式传输(在java端) 2、在实际使用中,我们的问答历史会经常分享给他人,所以下图的 copy …

OCC 扫掠

目录 一、概述 1、扫掠类型分类 2、扫掠方式分类 二、详细介绍 1. 直线扫掠(Linear Sweep) 2. 旋转扫掠(Revolution) 3. 一般路径扫掠(General Path Sweep) 三、总结 一、概述 OpenCASCADE (OCC) 中的扫掠(Sweeping)操作是一种常用的几何建模技术,用于通过沿着…

Java文件读取 jar包内文件读取

全文详见个人博客:https://www.coderli.com/jar-classloader/ Java文件读取 jar包内文件读取最近遇到一些Jar包内外配置文件读取的问题。索性自己测试总结一下,与大家分享。 主要是关于ClassLoader.getResource和Class.getResource方法路径区别的问题。…

python:切片

Python 中的切片(slicing)是一种强大的功能,它允许你获取序列(如列表、元组、字符串等)的一个子集。切片操作通过指定序列的起始索引、结束索引(可选)和步长(可选)来实现…

IOCTLance:一款针对x64 WDM驱动程序的漏洞检测工具

关于IOCTLance IOCTLance是一款针对x64 WDM驱动程序的漏洞检测工具,该工具来源于CODE BLUE 2023上展示的一个名为“使用符号执行和污点分析增强 WDM 驱动程序漏洞检测 ”的项目。该工具能够有效增强检测Windows驱动程序模型(WDM)驱动程序中各…

数模·插值和拟合算法

插值 将离散的点连成曲线或者线段的一种方法 题目中有"任意时刻任意的量"时使用插值,因为插值一定经过样本点 插值函数的概念 插值函数与样本离散的点一一重合 插值函数往往有多个区间,多个区间插值函数样态不完全一样,简单来说就…

动态住宅IP和静态住宅IP主要区别是什么?

在互联网连接的世界中,IP地址是我们识别和访问网络资源的关键。住宅IP地址,特别是动态住宅IP和静态住宅IP,是两种不同类型的IP分配方式,它们在使用和功能上存在显著差异。 1. IP地址的稳定性 动态住宅IP:这种IP地址是…

redis命令超详细

redis数据结构介绍 redis是一个key-value的数据库,key一般是String类型,但是value的类型有很多: 基本类型:String,Hash,List,Set,SortedSet(可排序的不能重复的集合) 特殊类型:GEO,BitMap,HyperLog等 文档官网&…

CSS3雷达扫描效果

CSS3雷达扫描效果https://www.bootstrapmb.com/item/14840 要创建一个CSS3的雷达扫描效果,我们可以使用CSS的动画(keyframes)和transform属性。以下是一个简单的示例,展示了如何创建一个类似雷达扫描的动画效果: HTM…

Python -numpy 基础-------1

NumPy(Numerical Python)是Python的一个开源数值计算扩展库。它支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。NumPy的数组(ndarray)对象是一个快速且灵活的多维数组对象,用于存储…

power bi-all 相关函数

power bi-all 相关函数 1. all 函数2. allselected 函数3. allexcept()函数4. allnoblankrow() 函数 1. all 函数 作用: 清除筛选返回:清除筛选后的表格或列总结 当all参数为表时,忽略所有的筛选条件,无论…

github连接不上的解决方案(持续更新)

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于大模型算法的研究与应用。曾担任百度千帆大模型比赛、BPAA算法大赛评委,编写微软OpenAI考试认证指导手册。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。授权多项发明专利。对机器学…

鸿蒙仓颉语言【模块module】

module 模块 模块配置文件,这里指项目的modules.json 文件,用于描述代码项目的基础元属性。 {"name": "file name", //当前项目的名称"description": "项目描述", //项目描述"version": "1.0…

十、Docker版Redis集群搭建

目录 一、3主3从Redis集群配置 1、新建6个docker容器实例 2、进入容器redis-node-1并为6台机器构建集群关系 3、以6381为切入点,查看集群状态 二、主从容错切换迁移案例 1、数据读写存储 2、假如6381宕机了,他的从库6386会不会切换 三、主从扩容案…

(C语言) 文件读写基础

文章目录 🗂️前言📄ref📄访问标记🗃️文件访问标记 🗂️Code📄demo📄分点讲解🗃️打开/关闭🗃️写🗃️读 🗂️END🌟关注我 &#x1f…

Linux-socket详解

前言 OSI七层模型和TCP/IP四层模型在这里就不说了。 套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将IO插入到网络中,并与网络…

Nest.js 实战 (四):利用 Pipe 管道实现数据验证和转换

什么是管道(Pipe)? 在 Nest.js 中,管道(Pipelines) 是一种强大的功能,用于预处理进入控制器方法的请求数据,如请求体、查询参数、路径参数等。管道允许开发者在数据到达控制器方法之…