Mellanox SN2410交换机RoCE协议配置

摘要

本文将以Mellanox SN2410为例讲解如何在Mellanox交换机上配置RoCE协议

环境

Mellanox SN2410

Mellanox-SN2410 [standalone: master] # show version
Product name:      Onyx
Product release:   3.7.1102

ps. 交换机刚拿到的时候是3.6.4114,竟然有的功能是无法使用的,官方说了要3.6.5000之后的版本才支持

网卡

$ ofed_info
OFED-internal-4.4-2.0.7
$ mlxfwmanager
Querying Mellanox devices firmware ...

Device #1:
----------

  Device Type:      N/A
  Part Number:      N/A
  Description:
  PSID:             DEL2420110034
  PCI Device Name:  0000:06:00.0
  Port1 MAC:        N/A
  Port1 GUID:       N/A
  Port2 MAC:        N/A
  Port2 GUID:       N/A
  Versions:         Current        Available
     FW             14.23.1020     N/A

ps. Firmware和OFED也最好升级到最新,低版本的配置方法会有所不同
在我这里以太网卡的名称是eth4,如果要设置为其他,更改响应的名称即可

服务器配置

mlnx_qos -i eth4 --trust dscp
# 将qos切换到dscp模式,使用dscp来作为网络服务质量管理的依据。如果这里无法设置,很有可能是OFED或者Firmware版本问题

echo 106 > /sys/class/infiniband/mlx5_0/tc/1/traffic_class
cma_roce_tos -d mlx5_0 -t 106
# 将RoCE流量的标记设置为26,至于为什么26要填106,见细节原理1

sysctl -w net.ipv4.tcp_ecn=1
# 开启系统对TCP流量的ECN标记,对于RoCE好像没啥用,因为RoCE是封装在UDP中的,但官方教程有设置,还是写一下

mlnx_qos -i eth4 --pfc 0,0,0,1,0,0,0,0
# 3号优先级队列上开启PFC控制,这里为什么开3号,见细节原理2

交换机配置

interface ethernet 1/1-1/48 traffic-class 3 congestion-control ecn minimum-absolute 150 maximum-absolute 1500
# traffic class 3 对应的是3号输出队列,将所有端口3号输出队列的长度超过150时,开始以一定概率标记ECN,当长度超过1500的时候全部标记ECN。为什么是3号见细节原理2

traffic pool roce type lossless
# 创建名为roce的流量缓存池,并将其属性设置为无损流量

traffic pool roce memory percent 50.00
# 将名为roce的流量缓存池的最高内存占用设置为50?

traffic pool roce map switch-priority 3
# 将3号交换机有限队列的流量映射到这个流量缓存池

interface ethernet 1/1-1/48 traffic-class 6 dcb ets strict
# 将所有端口的6号输出队列设置为确保转发

interface ethernet 1/1-1/48 qos trust L3
# 将所有端口设置为使用三层通信模式(DSCP值)来管理网络服务质量

如何验证配置成功

进行一次多对一通信,保证网络中产生拥塞,然后通过以下两条命令前后对比验证

ethtool -S
# 检查 prio3和prio6中均有流量,并且pause中记录到了收到pause包数量,确保PFC生效
cd /sys/class/infiniband/mlx5_0/ports/1/hw_counters
ls | grep cnp
cat *cnp*
# 检查收到了CNP包,确保CNP包生效

细节原理

0. ECN原理

参考:Mellanox Understanding RoCEv2 Congestion Management
这是这篇的翻译:RoCE拥塞控制机制
在数据包的IP层(网路程)有一块TOS(Type Of Server)域,其中前8个位为DSCP值,后2位为ECN标记位,……

1. RoCE流量设置值

在数据包的IP层(网路程)有一块TOS(Type Of Server)域,其中前8个位为DSCP值,后2位为ECN标记位,我们需要把ECN标记位设置为10(二进制),而DSCP值为26,对应二进制值为11010,连一起就是1101010,对应十进制值就是106

2. 优先队列值设置

因为DSCP值的取值范围时0-63,而PFC队列和交换机的优先队列的取值范围都是0-7,所以要建立一种映射关系。幸运的是这两种映射的默认映射方式默认都是每8个连续的DSCP映射到一个队列

$ mlnx_qos -i eth4
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,

我们的RoCE流量标记的DSCP值为26,对应的是优先队列3,所以服务器和交换机设置的PFC队列编号都是3
由于ECN的反馈控制包(CNP包)的默认DSCP值是48,所以交换机上设置的确保转发的优先队列编号是6