RDMA 控制器

1. 概述

1-1. 什么是 RDMA 控制器?

RDMA 控制器允许用户限制给定进程集可以使用的 RDMA/IB 特定资源。这些进程使用 RDMA 控制器进行分组。

RDMA 控制器定义了两种可以限制 cgroup 进程的资源。

1-2. 为什么需要 RDMA 控制器?

目前,用户空间应用程序可以轻松占用所有 rdma 动词特定资源,例如 AH、CQ、QP、MR 等。因此,其他 cgroup 中的其他应用程序或内核空间 ULP 甚至可能没有机会分配任何 rdma 资源。这可能会导致服务不可用。

因此,需要 RDMA 控制器来限制进程的资源消耗。通过此控制器,可以对不同的 rdma 资源进行核算。

1-3. RDMA 控制器是如何实现的?

RDMA cgroup 允许限制资源的配置。Rdma cgroup 使用资源池结构维护每个 cgroup、每个设备的资源核算。rdma cgroup 将每个此类资源池的资源限制为 64 个,如果需要,以后可以扩展。

此资源池对象链接到 cgroup css。通常,在大多数用例中,每个 cgroup、每个设备有 0 到 4 个资源池实例。但是,没有什么限制可以拥有更多。目前,每个单个 cgroup 数百个 RDMA 设备可能无法得到最佳处理,但是也没有已知的使用案例或对此配置的要求。

由于 RDMA 资源可以从任何进程分配,并且可以由任何共享地址空间的子进程释放,因此 rdma 资源始终归创建者 cgroup css 所有。这允许进程从一个 cgroup 迁移到另一个 cgroup,而无需进行复杂的资源所有权转移;因为由于 rdma 资源的共享性质,实际上不存在这种所有权。围绕 css 链接资源还可以确保在进程迁移后可以删除 cgroup。即使这不是主要用例,这也允许使用活动资源进行迁移。

每当发生 RDMA 资源计费时,所有者 rdma cgroup 将返回给调用者。在取消资源计费时,应传递相同的 rdma cgroup。这也允许具有活动 RDMA 资源的进程向新资源的新所有者 cgroup 计费。它还允许从先前计费的 cgroup 中取消迁移到新 cgroup 的进程的资源,即使这不是主要用例。

在以下情况下创建资源池对象。(a) 用户设置了限制,并且该 cgroup 的相关设备不存在以前的资源池。(b) 没有配置资源限制,但 IB/RDMA 堆栈尝试计费资源。以便在应用程序在没有限制的情况下运行时正确地取消计费,然后在取消计费期间强制实施限制时,否则使用计数将降至负数。

如果所有资源限制都设置为最大值,并且它是最后一个被释放的资源,则会销毁资源池。

如果用户想要删除/取消配置特定设备的资源池,则应将所有限制设置为最大值。

IB 堆栈会遵守 rdma 控制器强制执行的限制。当应用程序查询 IB 设备的最大资源限制时,它会返回用户为给定 cgroup 配置的和 IB 设备支持的最小值。

以下资源可以由 rdma 控制器进行核算。

hca_handle

HCA 句柄的最大数量

hca_object

HCA 对象的最大数量

2. 用法示例

  1. 配置资源限制

    echo mlx4_0 hca_handle=2 hca_object=2000 > /sys/fs/cgroup/rdma/1/rdma.max
    echo ocrdma1 hca_handle=3 > /sys/fs/cgroup/rdma/2/rdma.max
    
  2. 查询资源限制

    cat /sys/fs/cgroup/rdma/2/rdma.max
    #Output:
    mlx4_0 hca_handle=2 hca_object=2000
    ocrdma1 hca_handle=3 hca_object=max
    
  3. 查询当前使用情况

    cat /sys/fs/cgroup/rdma/2/rdma.current
    #Output:
    mlx4_0 hca_handle=1 hca_object=20
    ocrdma1 hca_handle=1 hca_object=23
    
  4. 删除资源限制

    echo mlx4_0 hca_handle=max hca_object=max > /sys/fs/cgroup/rdma/1/rdma.max