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

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,其余区域都访问不了:

RDMA通信4:MR(Memory Region, 内存区域)基本概念和作用_第1张图片

RDMA通信4:MR(Memory Region, 内存区域)基本概念和作用_第2张图片

本地是如何知道对端节点的可用虚拟地址和对应的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

你可能感兴趣的:(RDMA,RDMA,信息与通信,网络)