【Mellanox命令系列之mlnx_qos设置DSCP】如何绑定流量类型DSCP与网卡硬件队列,为什么设置,如何生效?(--trust=dscp; --dscp2prio set,63,0)

快速回忆

mlnx_qos -i enp65s0f0np0 #查询当前配置
mlnx_qos -i enp65s0f0np0 --trust=dscp  #将网卡的qos模式设置为dscp,默认是pcp
mlnx_qos -i enp65s0f0np0 --dscp2prio set,63,0 #添加:告诉硬件网卡,将dscp为63的报文映射到硬件优先级队列0
mlnx_qos -i enp65s0f0np0 --dscp2prio del,63,0 #删除

mlnx_qos -i enp65s0f0np0 --prio2buffer 1,0,2,3,4,5,6,7   #将表示优先级0,配置buf1; 优先1配置buf0。参数是priid,设置到buffer的存储寄存器上,配置的是prio的值。如命令所示是从prio到buf。buf顺序省略依次来
mlnx_qos -i enp65s0f0np0 --prio_tc 1,0,2,3,4,5,6,7 #将tc0设置prio1.设置到tc的寄存器上,指定的prio值。使用的时候用某个tc0,从这里读取对应的prio值。然后查询prio对应的buf是哪个。如命令所示是prio到tc。tc顺序省略依次来

仲裁的核心是优先级。运行时候用dscp得到优先级,用优先级得到buf决定存哪儿,用优先级得到tc决定有什么pipline处理。
关键图:
在这里插入图片描述

1. 背景要点

RDMA的ROCeV2报文基于IP报文。
IP报文通过IP头部的TOS(Type of service)字段(也叫DS:Differentiated Services,参考下图报文)对包流量分类,提供报文的差异化质量服务QOS。TOS字段总的一个Byte 8个bits,前6bits是DSCP字段(差异化服务代码点Differentiated Services Code Point是3层IP网络进行网络流量分类和流量控制)。后2个bit是ECN(显式拥塞通知Explicit Congestion Notification,是用来进行拥塞管理的,数据包从端-交换机-端流程中,流经交换机如果出现交换机拥塞(准确讲是超过交换机配置的认为拥塞的水位线)后,会将该IP报文的ECN字段标记为11,表示数据传输中出现了拥塞,当端侧收到被标记ECN的报文后,接收端会发送一个CNP报文给发送端,以控制发送端进行拥塞控制,进行降速。 ECN字段00表示不支持,01或者10表示支持并未发生拥塞,11表示出现拥塞。如果出现11既表示链路有拥塞,也表示这个报文被正常报文传输慢些到达)
在这里插入图片描述

为什么要提供差异化质量服务?是针对不同的业务流量,比如会议中的语音和视频,语音更需要保障实时性,那么语音和视频就需要使用不同的优先级传输。优先级传输在网卡、交换机等流量传输主体中都是通过假设是走IP报文,那么就可以用IP报文中的TOS字段来标记。假设语音TOS字段是10,视频是20。然后全链路交换机配置10字段的优先级更高,就算交换机数据包巨大,TOS=10的报文也将高优先级传输,从而保证服务质量。
Mellanox中IP的TOS字段有两种模式,一种是基于IP的DSCP+ECN模式,一种是基于VLAN的PCP(Priority Code Point)模式。DSCP是软件实现,PCP在交换机上支持硬件加速)
他们的历史参考:

时期1:RFC791 3bit优先级
时期2:IP层支持RFC1394 ToS(服务类型)
时期3:DSCP(区分服务代码点)在RFC2474 引入,支持更广泛和通用以及更多(64分类)
时期4:支持加急转发的RFC2598,让线路租用成为可能
时期5:再到 RFC2697,将DSCP增强进行进一步分类,支持白金、金银铜服务级别的转发

2. Mellanox网卡如何设置dscp对应的硬件队列

所谓设置dscp对应的硬件队列,实际上是告诉网卡收发等模块,不同的dscp的报文在什么硬件队列中处理进行流量分类,也会根据这个dscp来定义流量控制。
DSCP总的6个bits,支持2^6=64种,也就是可以将报文classify到64种。这些DSCP分类,业界又分为白金、金牌、银牌铜牌服务(参考801.1p)

2.1 将dscp绑定到网卡的硬件队列

2.1.1 命令用法

2.1.1.1 查询当前网卡中dscp对应的硬件优先级队列
mlnx_qos -i enp65s0f0np0

效果:(dscp模式的)
在这里插入图片描述

2.1.1.2 设置mellanox网卡使用dscp模式
mlnx_qos -i enp65s0f0np0 --trust=dscp  #将网卡的qos模式设置为dscp,默认是pcp

在这里插入图片描述

如果要设置为pcp模式:

mlnx_qos -i enp65s0f0np0 --trust=pcp  #将网卡的qos模式设置为dscp,默认是pcp

在这里插入图片描述
注意:当从pcp修改为dscp后,之前配置的dscp对应的优先级配置会丢失,网卡会变成默认配置。也就是从0-63被线性平均到8个队列。

2.1.1.3 设置dscp到某个优先级队列的命令使用方法
mlnx_qos -i enp65s0f0np0 --dscp2prio set,63,0 #将dscp为63的报文映射到硬件优先级队列0

这里是将dscp是63的报文,设置到0上。参数说明:mlnx_qos -i enp65s0f0np0 --dscp2prio [set],[dscp],[priority]
–dscp2prio选项中的

  • set表示设置,还支持del(删除),flush(删除所有)
  • dscp字段指定对相应的dscp进行操作
  • priority表示指定的优先级,优先级总的8个,0到7
    注意[set],[dscp],[priority]中间不能有空格,否则会报错:
Bad arguments
Usage: mlnx_qos -i <interface> [options]

比如删除命令:

mlnx_qos -i enp65s0f0np0 --dscp2prio del,63,0

需要注意的是删除以后,不会恢复到默认的优先级。具体行为可能与网卡相关,暂且当做不可预期分析。
比如默认情况不配置的dscp和priority的关系是64个dscp流量类型,均匀分布到8个队列。
在这里插入图片描述

2.2 绑定dscp分类的流量到硬件优先级队列

如果要设置每一个dscp到某个队列,需要使用上面相同的方式进行处理。
比如下面是将所有的dscp都映射到优先级0:

mlnx_qos -i enp65s0f0np0 --dscp2prio set,0,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,1,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,2,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,3,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,4,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,5,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,6,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,7,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,8,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,9,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,10,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,11,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,12,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,13,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,14,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,15,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,16,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,17,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,18,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,19,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,20,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,21,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,22,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,23,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,24,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,25,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,26,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,27,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,28,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,29,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,30,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,31,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,32,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,33,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,34,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,35,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,36,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,37,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,38,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,39,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,40,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,41,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,42,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,43,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,44,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,45,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,46,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,47,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,48,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,49,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,50,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,51,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,52,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,53,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,54,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,55,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,56,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,57,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,58,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,59,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,60,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,61,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,62,0
mlnx_qos -i enp65s0f0np0 --dscp2prio set,63,0

实操:

全部配置到0队列:

生成mlnx_qos命令:

for i in {0..63}; do echo "mlnx_qos -i enp65s0f0np0 --dscp2prio set,$i,0"; done > 0.sh
sh 0.sh
mlnx_qos -i enp65s0f0np0 

全部设置到硬件优先级队列0后,可以看到所有dscp都在prio0的硬件队列:
在这里插入图片描述

均匀配置到队列

生成mlnx_qos命令:

for i in {0..63}; do echo "mlnx_qos -i enp65s0f0np0 --dscp2prio set,$i,"$(expr $i / 8); done  > dft.sh
sh dft.sh
mlnx_qos -i enp65s0f0np0 

#如果不考虑其他影响,仅仅是吧dscp都恢复到默认,可以先切换到pcp然后切换回dscp

配置后效果:
在这里插入图片描述

其他

  • 使用–defltprio=DEFLTPRIO参数设置默认的优先级。(set/del default priority. Example ‘set,2’ sets default priority to 2. ‘del,2’ deletes this setting.)
  • 这里通过mlnx_qos配置dscp绑定到优先级丢列,影响的只是网卡上对不同dscp的处理策略。作用对象是网卡。网卡上的硬件实现,应该是有64个dscp,有8个队列。每个dscp会有一个可配置项(比如通过提供dscp操作的寄存器),寄存器配置对应的优先级队列。然后网卡收发包单元收到某个报文后在port buf里面取出IP等头部,读取dscp,然后指定该报文进入哪个硬件队列。可能有一个dscp的子模块,模块对外提供配置priority队列,对外提供服务查询获取队列。
  • 如果想要Traffic Class 0、1、2、3、4、5、6、7与Priority 1、0、2、3、4、5、6、7的对应关系。使用 mlnx_qos -i enp65s0f0np0 -p 1,0,2,3,4,5,6,7。mlnx_qos -i enp65s0f0np0 --prio2buffer 1,0,2,3,4,5,6,7。这里的参数比如0-7之间表示prio。如果超过会报错。配置后效果:
    在这里插入图片描述
    超过报错:
    在这里插入图片描述
  • 如果想设置每个硬件接收队列buffer对应的prio,mlnx_qos -i enp65s0f0np0 --prio2buffer 1,0,2,3,4,5,6,7:设置后效果:看到pfc配置中把优先级0,对应到buf1。也就是硬件队列1。而且图中的buffer中的数量最大是7。
    在这里插入图片描述

参数只能是0-7,表示prio,如果超过会报错
在这里插入图片描述
将所有的优先级都映射到buf0:mlnx_qos -i enp65s0f0np0 --prio2buffer 0,0,0,0,0,0,0,0
在这里插入图片描述

  • 本文将优先级和网卡的优先级队列当做一个来描述,实际网卡行为可能是一个映射关系,然后将硬件队列对应到优先级。优先级 与硬件队列(叫做缓冲区)可以映射,是通过–prio2buffer参数设置(但是一般不设置该参数)。 优先级 与 TC也可以映射。构建起 TC(8)-优先级(8)-队列缓冲区(8个)-DSCP(64个)的关系。策略核心还是围绕抽象概念优先级(优先级决定映射到什么队列buffer,优先级决定映射到什么tc。dscp决定用什么优先级)。报文核心是DSCP(64个)。**仲裁的核心是优先级。运行时候用dscp得到优先级,用优先级得到buf决定存哪儿,用优先级得到tc决定有什么pipline处理。**具体关系部分参考下图:
  • 在这里插入图片描述

参考:
https://blog.csdn.net/Mr_zhangtf/article/details/107925938 《802.1P优先级、IP优先级、TOS优先级及DSCP优先级的分类和对应》
http://help.sonicwall.com/help/sw/chi/8600/26/2/4/content/Firewall_Managing_QoS.088.3.html
https://www.cisco.com/c/zh_cn/support/docs/wireless-mobility/voice-over-wireless-lan-vowlan/116056-technote-qos-00.pdf
https://www.cisco.com/c/zh_cn/support/docs/wireless-mobility/voice-over-wireless-lan-vowlan/217942-cisco-unified-wireless-qos-tech-note.html

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值