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. 使用示例¶
配置资源限制
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
查询资源限制
cat /sys/fs/cgroup/rdma/2/rdma.max #Output: mlx4_0 hca_handle=2 hca_object=2000 ocrdma1 hca_handle=3 hca_object=max
查询当前使用情况
cat /sys/fs/cgroup/rdma/2/rdma.current #Output: mlx4_0 hca_handle=1 hca_object=20 ocrdma1 hca_handle=1 hca_object=23
删除资源限制
echo mlx4_0 hca_handle=max hca_object=max > /sys/fs/cgroup/rdma/1/rdma.max