[RoCE] 通過QoS對Mellanox網卡進行限速

參考資料:

Quality of Service (QoS) - NVIDIA Docs

【RDMA】RoCE網絡QoS|應用層設置PFC等級|Tos|Priority|TC_cma_roce_tos-CSDN博客

【RDMA】mellonx流控配置工具mlnx_qos|PFC-CSDN博客

前言

目標:我有一個Mellanox-5網卡,我想用RoCE,同時對某些qp進行限速。

然而,Mellanox-5網卡在RoCE模式下是無法對每個QP進行單獨限速的。

我試了很多方法,但都失敗了。最顯然的做法是使用 ibv_modify_qp時修改attr.ah_attr.static_rate參數(rdmamojo.com)。然而並沒有效果。我嘗試了其它一些可能和rate limit有關的API,比如ibv_modify_qp_rate_limit和修改attr.rate_limit,也都沒有用。我在官方的perftest(linux-rdma/perftest: Infiniband Verbs Performance Tests (github.com))裏設置static_rate參數,結果它告訴我:

The QP failed to accept HW rate limit

我查看網卡的配置,發現:

$ ibv_devinfo -v
hca_id: mlx5_1
		...
        packet_pacing_caps:
                qp_rate_limit_min:      0kbps
                qp_rate_limit_max:      0kbps

qp_rate_limit_minqp_rate_limit_max都是0,這明擺着是用不了rate limit。無奈只得另尋他法。

經過一番尋找,我找到了用QoS進行限速的方法。

使用QoS進行限速

具體的文檔可見Quality of Service (QoS) - NVIDIA Docs

1. 查看網卡的QoS信息

ifconfig裏,我的網卡名字是ens10f1np1

$ mlnx_qos -i ens10f1np1
DCBX mode: OS controlled
Priority trust state: pcp
default priority:
Receive buffer size (bytes): 0,262016,0,0,0,0,0,0,
Cable len: 7
PFC configuration:
        priority    0   1   2   3   4   5   6   7
        enabled     0   0   0   0   0   0   0   0   
        buffer      1   1   1   1   1   1   1   1   
tc: 1 ratelimit: unlimited, tsa: vendor
         priority:  0
tc: 0 ratelimit: unlimited, tsa: vendor
         priority:  1
tc: 2 ratelimit: unlimited, tsa: vendor
         priority:  2
tc: 3 ratelimit: unlimited, tsa: vendor
         priority:  3
tc: 4 ratelimit: unlimited, tsa: vendor
         priority:  4
tc: 5 ratelimit: unlimited, tsa: vendor
         priority:  5
tc: 6 ratelimit: unlimited, tsa: vendor
         priority:  6
tc: 7 ratelimit: unlimited, tsa: vendor
         priority:  7

QoS有兩種trust mode:PCP和DSCP。其中PCP是L2層的,使用vlan包頭的一部分。而DSCP是L3層的,使用IP包頭的一部分。由於我們想要使用RoCEv2,不包含vlan而包含IP,所以自然用DSCP是更合適的。

網卡默認的trust mode是PCP,這裏我們把它改成DSCP。

$ sudo mlnx_qos -i ens10f1np1 --trust dscp
DCBX mode: OS controlled
Priority trust state: dscp
dscp2prio mapping:
        prio:0 dscp:07,06,05,04,03,02,01,00,
        prio:1 dscp:15,14,13,12,11,10,09,08,
        prio:2 dscp:23,22,21,20,19,18,17,16,
        prio:3 dscp:31,30,29,28,27,26,25,24,
        prio:4 dscp:39,38,37,36,35,34,33,32,
        prio:5 dscp:47,46,45,44,43,42,41,40,
        prio:6 dscp:55,54,53,52,51,50,49,48,
        prio:7 dscp:63,62,61,60,59,58,57,56,
default priority:
Receive buffer size (bytes): 0,262016,0,0,0,0,0,0,
Cable len: 7
PFC configuration:
        priority    0   1   2   3   4   5   6   7
        enabled     0   0   0   0   0   0   0   0   
        buffer      1   1   1   1   1   1   1   1   
tc: 1 ratelimit: unlimited, tsa: vendor
         priority:  0
tc: 0 ratelimit: unlimited, tsa: vendor
         priority:  1
tc: 2 ratelimit: unlimited, tsa: vendor
         priority:  2
tc: 3 ratelimit: unlimited, tsa: vendor
         priority:  3
tc: 4 ratelimit: unlimited, tsa: vendor
         priority:  4
tc: 5 ratelimit: unlimited, tsa: vendor
         priority:  5
tc: 6 ratelimit: unlimited, tsa: vendor
         priority:  6
tc: 7 ratelimit: unlimited, tsa: vendor
         priority:  7

可以看到,上面一共包含8個Traffic Class(TC),8個priority,以及8個buffer。由於我們的目標只是限速,所以我們不去修改TC,priority,buffer之間的關係。

2. 設置ToS

在RoCEv2模式下,配置一個qp對應哪個Traffic TC的流程如下。

  1. 在應用層,爲每個qp設置一個Type-of-Service(ToS)。
  2. ToS的高6bit爲DSCP,低2bit無所謂。
  3. 根據上文的映射表將DSCP映射爲TC。

ToS在IP包頭中的含義在這裏:

image

假如我們想要對TC4進行限速。根據DSCP的映射表,我們可以選取DSCP=32(32到39都行)。因此對應的ToS就是128(128到159都行)。

然後,我們想要把TC4限速爲4Gbps。

$ sudo mlnx_qos -i ens10f1np1 --ratelimit=0,0,0,0,4,0,0,0
...
tc: 4 ratelimit: 4.0 Gbps, tsa: vendor
         priority:  4

配置成功。

3. 應用層設置ToS

對於ibverb API的使用者,在設置Address Vector的時候,將attr.ah_attr.grh.traffic_class這一項設置爲想要的ToS即可(注意雖然這個參數叫traffic_class,但它的值不是TC,而是ToS)。

對於RDMA CM的使用者,使用rdma_set_option(cma_id, RDMA_OPTION_ID, RDMA_OPTION_ID_TOS, &your_tos, sizeof(uint8_t))即可設置ToS。

測試

我們已經在機器A上配置好了限速,現在測一下從機器A到另一臺機器B進行RDMA WRITE的吞吐。

在B上運行(這裏mlx5_1是網卡的ib名字,使用ibdev2netdev可以查看)

$ ib_write_bw -d mlx5_1 -x 3

在A上運行

$ ib_write_bw <B_IP> -d mlx5_1 -x 3 --tclass=128

結果

---------------------------------------------------------------------------------------
 #bytes     #iterations    BW peak[MB/sec]    BW average[MB/sec]   MsgRate[Mpps]
 65536      5000             9205.89            450.24             0.007204
---------------------------------------------------------------------------------------

可以發現,確實將平均速度限制到了4Gbps以下。然而,峯值速度貌似是限制不住的(悲)。

而對於其它的ToS:

$ ib_write_bw <B_IP> -d mlx5_1 -x 3 --tclass=0
---------------------------------------------------------------------------------------
 #bytes     #iterations    BW peak[MB/sec]    BW average[MB/sec]   MsgRate[Mpps]
 65536      5000             8501.98            4726.36            0.075622
---------------------------------------------------------------------------------------

速度則不受限制。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章