RDMA 控制器

1. 概述

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

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

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

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

目前,用户空间应用程序可以轻易地占用所有 RDMA 动词特定资源,例如 AH、CQ、QP、MR 等。这可能导致其他 cgroup 或内核空间 ULPs 中的其他应用程序甚至无法分配任何 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