Featured image of post RDMA 之 Protection Domain

RDMA 之 Protection Domain

本文转载于知乎专栏:7. RDMA 之 Protection Domain,作者:Savir。为了隔离各种 RDMA 资源,协议提出了 PD 的概念。PD 意为保护域,将相关的软件资源“圈”到一起,各个保护域之间的资源无法相互访问。

# RDMA 之 Protection Domain

本文欢迎非商业转载,转载请注明出处。

声明:仅用于收藏,便于阅读

Savir, 知乎专栏:7. RDMA 之 Protection Domain

前文我们简单介绍了 RDMA 中最常见的一些资源,包括各种 Queue,以及 MR 的概念等等。MR 用于控制和管理 HCA 对于本端和远端内存的访问权限,确保 HCA 只有拿到正确 Key 之后才能读写用户已经注册了的内存区域。为了更好的保障安全性,IB 协议又提出了 Protection Domain(PD)的概念,用于保证 RDMA 资源间的相互隔离,本文就介绍一下 PD 的概念。

# PD 是什么

PD 全称是 Protection Domain,意为"保护域"。域的概念我们经常见到,从数学上的“实数域”、“复数域”,到地理上的“空域”、“海域”等等,表示一个空间/范围。在 RDMA 中,PD 像是一个容纳了各种资源(QP、MR 等)的“容器”,将这些资源纳入自己的保护范围内,避免他们被未经授权的访问。一个节点中可以定义多个保护域,各个 PD 所容纳的资源彼此隔离,无法一起使用。

概念还是有些抽象,下面我们来看一下 PD 有什么作用,具体解决了什么问题。

# PD 的作用

一个用户可能创建多个 QP 和多个 MR,每个 QP 可能和不同的远端 QP 建立了连接,比如下图这样(灰色箭头表示 QP 间的连接关系):

7_1-2024-04-19

图 1:没有 PD 概念时的 RDMA 资源

由于 MR 和 QP 之间并没有绑定关系,这就意味着一旦某个远端的 QP 与本端的一个 QP 建立了连接,具备了通信的条件,那么理论上远端节点只要知道 VA 和 R_key(甚至可以靠不断的猜测直到得到一对有效的值),就可以访问本端节点某个 MR 的内容。

其实一般情况下,MR 的虚拟地址 VA 和秘钥 R_Key 是很难猜到的,已经可以保证一定的安全性了。但是为了更好的保护内存中的数据,把各种资源的权限做进一步的隔离和划分,我们在又在每个节点中定义了 PD,如下图所示

7_2-2024-04-19

图 2:加入 PD 概念时的 RDMA 资源

图中 Node 0 上有两个 PD,将 3 个 QP 和 2 个 MR 分为了两组,此外 Node 1 和 Node 2 中各有一个 PD 包含了所有 QP 和 MR。Node 0 上的两个 PD 中的资源不可以一起使用,也就是说 QP3 和 QP9 不能访问 MR1 的数据,QP6 也不可以访问 MR0 的数据。如果我们在数据收发时,指定硬件使用 QP3 和 MR1,那么硬件校验他们不属于同一个 PD 后,会返回错误。

对于远端节点来说,Node1 只能通过 QP8 相连的 QP3 来访问 Node0 的内存,但是因为 Node 0 的 QP3 被“圈”到了 PD0 这个保护域中,所以 Node 1 的 QP8 也只能访问 MR0 对应的内存,无论如何都无法访问 MR1 中的数据,这是从两个方面限制的:

  1. Node 1 的 QP8 只跟 Node 0 的 QP3 有连接关系,无法通过 Node 0 的 QP6 进行内存访问。
  2. Node 0 的 MR1 和 QP3 属于不同的 PD,就算 Node 1 的 QP8 拿到了 MR1 的 VA 和 R_key,硬件也会因为 PD 不同而拒绝提供服务。

所以就如本文一开始所说的,PD 就像是一个容器,将一些 RDMA 资源保护起来,彼此隔离,以提高安全性。其实 RDMA 中不止有 QP、MR 这些资源,后文即将介绍的 Address Handle,Memory Window 等也是由 PD 进行隔离保护的。

# 如何使用 PD

还是看上面的图,我们注意到 Node 0 为了隔离资源,存在两个 PD;而 Node 1 和 Node 2 只有一个 PD 包含了所有资源。

我之所以这样画,是为了说明一个节点上划分多少个 PD 完全是由用户决定的,如果想提高安全性,那么对每个连接到远端节点的 QP 和供远端访问的 MR 都应该尽量通过划分 PD 做到隔离;如果不追求更高的安全性,那么创建一个 PD,囊括所有的资源也是可以的

IB 协议中规定:每个节点都至少要有一个 PD,每个 QP 都必须属于一个 PD,每个 MR 也必须属于一个 PD

那么 PD 的包含关系在软件上是如何体现的呢?它本身是有一个软件实体的(结构体),记录了这个保护域的一些信息。用户在创建 QP 和 MR 等资源之前,必须先通过 IB 框架的接口创建一个 PD,拿到它的指针/句柄。接下来在创建 QP 和 MR 的时候,需要传入这个 PD 的指针/句柄,PD 信息就会包含在 QP 和 MR 中。硬件收发包时,会对 QP 和 MR 的 PD 进行校验。更多的软件协议栈的内容,我会在后面的文章中介绍。

另外需要强调的是,PD 是本地概念,仅存在于节点内部,对其他节点是不可见的;而 MR 是对本端和对端都可见的。

为了方便大家查阅和学习,以后我会列出文章涉及的协议章节,前面的内容有时间的时候我也会补充一下。

# PD 相关协议章节

  • 3.5.5 PD 的基本概念和作用
  • 10.2.3 介绍了 PD 和其他一些 RDMA 资源的关系,以及 PD 相关的软件接口。
  • 10.6.3.5 再次强调 PD 和 MR 及 QP 的关系。
  • 11.2.1.5 详细介绍 PD 的 Verbs 接口,包括作用、入参、出参和返回值等。

好了,关于 PD 的介绍就到这里。下文我会介绍用于 UD 服务类型的 Address Handle 的概念。

本博客已稳定运行
总访客数: Loading
总访问量: Loading
发表了 73 篇文章 · 总计 323.75k

使用 Hugo 构建
主题 StackJimmy 设计
基于 v3.27.0 分支版本修改