參考資料:
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_min
和qp_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的流程如下。
- 在應用層,爲每個qp設置一個Type-of-Service(ToS)。
- ToS的高6bit爲DSCP,低2bit無所謂。
- 根據上文的映射表將DSCP映射爲TC。
ToS在IP包頭中的含義在這裏:
假如我們想要對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
---------------------------------------------------------------------------------------
速度則不受限制。