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 周围链接资源还确保了在进程迁移后可以删除 cgroups。这也允许在活动资源的情况下进行进程迁移,尽管这不是主要的使用情况。
每当发生 RDMA 资源计费时,所有者 rdma cgroup 将返回给调用者。在取消资源时应传递相同的 rdma cgroup。这也允许具有活动 RDMA 资源的进程向新所有者 cgroup 计费新资源。它还允许从先前计费的 cgroup 中取消迁移到新 cgroup 的进程的资源计费,尽管这不是主要的使用情况。
在以下情况下创建资源池对象:(a) 用户设置了限制,但对于感兴趣的设备,之前没有资源池存在。(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 # 输出: # mlx4_0 hca_handle=2 hca_object=2000 # ocrdma1 hca_handle=3 hca_object=max
查询当前使用情况:
cat /sys/fs/cgroup/rdma/2/rdma.current # 输出: # 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