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