服务质量
本节介绍所有内部 QoS 功能的帧。除非另有明确说明,否则这些操作独立于 2 层帧或 3 层数据包。
Cumulus Linux 支持多种不同的 QoS 功能和标准,包括
- COS 和 DSCP 标记和重新标记
- 流量整形和监管
- 出口流量调度(802.1Qaz,增强传输选择 (ETS))
- 使用 IEEE 链路暂停和 PFC 的流控制,以及使用 ECN 的拥塞控制
- 无损和有损 RoCE
Cumulus Linux 使用两个配置文件进行 QoS
/etc/cumulus/datapath/qos/qos_features.conf
包括所有标准 QoS 配置,例如标记、流量整形和流控制。/etc/mlx/datapath/qos/qos_infra.conf
包括所有平台特定配置,例如缓冲区分配和 Alpha 值。
Cumulus Linux 5.0 及更高版本不使用 traffic.conf
和 datapath.conf
文件,而是使用 qos_features.conf
和 qos_infra.conf
文件。在升级 Cumulus Linux 之前,请查看您现有的 QoS 配置以确定您需要进行的更改。
switchd 和 QoS
当您运行Linux 命令来配置 QoS 时,您必须使用以下命令将 QoS 更改应用于 ASIC
cumulus@switch:~$ sudo systemctl reload switchd.service
与 restart
命令不同,reload switchd.service
命令不会影响流量转发,除非 qos_infra.conf
文件发生更改,或者当交换机暂停帧或控制优先级流时,这需要修改 ASIC 缓冲区,并可能导致瞬间数据包丢失。
NVUE 会自动重新加载 switchd
服务。当使用 NVUE 命令配置 QoS 时,您无需运行 reload switchd.service
命令来应用更改。
分类
当帧或数据包到达交换机时,Cumulus Linux 会将其映射到内部 COS(交换机优先级)值。此值永远不会写入帧或数据包,而是在交换机内部对流量进行分类和调度。
您可以定义哪些值是 trusted
:802.1p、DSCP 或两者都受信任。
下表描述了各种帧和交换机优先级配置的默认分类
设置 | VLAN 标记? | IP 或非 IP | 结果 |
---|---|---|---|
PCP (802.1p) | 是 | IP | 接受传入的 802.1p 标记。 |
PCP (802.1p) | 是 | 非 IP | 接受传入的 802.1p 标记。 |
PCP (802.1p) | 否 | IP | 使用默认优先级设置。 |
PCP (802.1p) | 否 | 非 IP | 使用默认优先级设置。 |
DSCP | 是 | IP | 接受传入的 DSCP IP 标头标记。 |
DSCP | 是 | 非 IP | 使用默认优先级设置。 |
DSCP | 否 | IP | 接受传入的 DSCP IP 标头标记。 |
DSCP | 否 | 非 IP | 使用默认优先级设置。 |
PCP (802.1p) 和 DSCP | 是 | IP | 接受传入的 DSCP IP 标头标记。 |
PCP (802.1p) 和 DSCP | 是 | 非 IP | 接受传入的 802.1p 标记。 |
PCP (802.1p) 和 DSCP | 否 | IP | 接受传入的 DSCP IP 标头标记。 |
PCP (802.1p) 和 DSCP | 否 | 非 IP | 使用默认优先级设置。 |
端口 | 任意 | 任意 | 忽略任何现有标记并使用默认优先级设置。 |
- 如果您使用 NVUE 配置 QoS,则可以使用
nv set qos mapping <profile> trust l2
命令 (802.1p) 或nv set qos mapping <profile> trust l3
命令 (DSCP) 定义哪些值是trusted
。 - 如果您使用 Linux 命令配置 QoS,则可以通过将
traffic.packet_priority_source_set
设置配置为802.1p
或dscp
,在/etc/cumulus/datapath/qos/qos_features.conf
文件中定义哪些值是trusted
。
信任 802.1p 标记
要信任 802.1p 标记
当 802.1p (l2
) 受信任时,Cumulus Linux 会将这些入口 802.1p 值分类为交换机优先级值
交换机优先级 | 802.1p (PCP) |
---|---|
0 | 0 |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 6 |
7 | 7 |
PCP 编号是传入的 802.1p 标记;例如,PCP 0 映射到交换机优先级 0。
要更改默认配置文件以将 PCP 0 映射到交换机优先级 4
cumulus@switch:~$ nv set qos mapping default-global trust l2
cumulus@switch:~$ nv set qos mapping default-global pcp 0 switch-priority 4
cumulus@switch:~$ nv config apply
您可以将多个 PCP 值映射到同一个交换机优先级值。例如,要将 PCP 值 2、3 和 4 映射到交换机优先级 0
cumulus@switch:~$ nv set qos mapping default-global trust l2
cumulus@switch:~$ nv set qos mapping default-global pcp 2,3,4 switch-priority 0
cumulus@switch:~$ nv config apply
如果您将信任配置为 l2
但未指定任何 PCP 到交换机优先级的映射,则 Cumulus Linux 使用默认值。
要显示默认配置文件的入口 802.1p 映射,请运行 nv show qos mapping default-global pcp
命令。要显示默认配置文件中特定交换机优先级的 PCP 映射,请运行 nv show qos mapping default-global pcp <value>
命令。以下示例显示 PCP 0 映射到交换机优先级 4
cumulus@switch:~$ nv show qos mapping default-global pcp 0
operational applied description
--------------- ----------- ------- ------------------------
switch-priority 4 4 Internal Switch Priority
在 /etc/cumulus/datapath/qos/qos_features.conf
文件中,设置 traffic.packet_priority_source_set = [802.1p]
。
当 802.1p 标记 trusted
时,以下行会将入口 802.1p 值分类为交换机优先级(内部 COS)值
traffic.cos_0.priority_source.8021p = [0]
traffic.cos_1.priority_source.8021p = [1]
traffic.cos_2.priority_source.8021p = [2]
traffic.cos_3.priority_source.8021p = [3]
traffic.cos_4.priority_source.8021p = [4]
traffic.cos_5.priority_source.8021p = [5]
traffic.cos_6.priority_source.8021p = [6]
traffic.cos_7.priority_source.8021p = [7]
traffic.cos_
编号是交换机优先级值;例如,802.1p 0 映射到交换机优先级 0。
要将 802.1p 4 映射到交换机优先级 0,请将 traffic.cos_0.priority_source.8021p
设置配置为 4。
traffic.cos_0.priority_source.8021p = [4]
您可以将多个值映射到同一个交换机优先级值。例如,要将 802.1p 值 0、1 和 2 映射到交换机优先级 0
traffic.cos_0.priority_source.8021p = [0, 1, 2]
您也可以选择不使用交换机优先级值。此示例不使用交换机优先级值 3 和 4。
traffic.cos_0.priority_source.8021p = [0]
traffic.cos_1.priority_source.8021p = [1]
traffic.cos_2.priority_source.8021p = [2,3,4]
traffic.cos_3.priority_source.8021p = []
traffic.cos_4.priority_source.8021p = []
traffic.cos_5.priority_source.8021p = [5]
traffic.cos_6.priority_source.8021p = [6]
traffic.cos_7.priority_source.8021p = [7]
要将自定义配置文件应用于特定接口,请参阅端口组。
信任 DSCP
要信任入口 DSCP 标记
如果 DSCP (l3
) trusted
,则 Cumulus Linux 会将这些入口 DSCP 值分类为交换机优先级值
交换机优先级 | 入口 DSCP |
---|---|
0 | [0,1,2,3,4,5,6,7] |
1 | [8,9,10,11,12,13,14,15] |
2 | [16,17,18,19,20,21,22,23] |
3 | [24,25,26,27,28,29,30,31] |
4 | [32,33,34,35,36,37,38,39] |
5 | [40,41,42,43,44,45,46,47] |
6 | [48,49,50,51,52,53,54,55] |
7 | [56,57,58,59,60,61,62,63] |
DSCP 编号是入口 DSCP 值;例如,DSCP 0 到 7 映射到交换机优先级 0。
要更改默认配置文件以将入口 DSCP 22 映射到交换机优先级 4
cumulus@switch:~$ nv set qos mapping default-global trust l3
cumulus@switch:~$ nv set qos mapping default-global dscp 22 switch-priority 4
cumulus@switch:~$ nv config apply
您可以将多个入口 DSCP 值映射到同一个交换机优先级值。例如,要更改默认配置文件以将入口 DSCP 值 10、21 和 36 映射到交换机优先级 0
cumulus@switch:~$ nv set qos mapping default-global trust l3
cumulus@switch:~$ nv set qos mapping default-global dscp 10,21,36 switch-priority 0
cumulus@switch:~$ nv config apply
如果您将信任配置为 l3
但未指定任何 DSCP 到交换机优先级的映射,则 Cumulus Linux 使用默认值。
要显示默认配置文件中的 DSCP 映射,请运行 nv show qos mapping default-global dscp
命令。要显示默认配置文件中特定交换机优先级的 DSCP 映射,请运行 nv show qos mapping default-global dscp <value>
命令。以下示例显示 DSCP 22 映射到交换机优先级 4
cumulus@switch:~$ nv show qos mapping default-global dscp 22
operational applied description
--------------- ----------- ------- ------------------------
switch-priority 4 4 Internal Switch Priority
在 /etc/cumulus/datapath/qos/qos_features.conf
文件中,配置 traffic.packet_priority_source_set = [dscp]
。
如果 DSCP trusted
,则以下行会将入口 DSCP 值分类为交换机优先级(内部 COS)值
traffic.cos_0.priority_source.dscp = [0,1,2,3,4,5,6,7]
traffic.cos_1.priority_source.dscp = [8,9,10,11,12,13,14,15]
traffic.cos_2.priority_source.dscp = [16,17,18,19,20,21,22,23]
traffic.cos_3.priority_source.dscp = [24,25,26,27,28,29,30,31]
traffic.cos_4.priority_source.dscp = [32,33,34,35,36,37,38,39]
traffic.cos_5.priority_source.dscp = [40,41,42,43,44,45,46,47]
traffic.cos_6.priority_source.dscp = [48,49,50,51,52,53,54,55]
traffic.cos_7.priority_source.dscp = [56,57,58,59,60,61,62,63]
配置文件中的 #
是注释。默认情况下,该文件注释掉 traffic.cos_*.priority_source.dscp
行。
您必须取消注释它们才能使它们生效。
traffic.cos_
编号是交换机优先级值;例如,DSCP 值 0 到 7 映射到交换机优先级 0。要将入口 DSCP 22 映射到交换机优先级 4,请配置 traffic.cos_4.priority_source.dscp
设置。
traffic.cos_4.priority_source.dscp = [22]
您可以将多个入口 DSCP 值映射到同一个交换机优先级值。例如,要将入口 DSCP 值 10、21 和 36 映射到交换机优先级 0
traffic.cos_0.priority_source.dscp = [10,21,36]
您也可以选择不使用交换机优先级值。此示例不使用交换机优先级值 3 和 4
traffic.cos_0.priority_source.dscp = [0,1,2,3,4,5,6,7]
traffic.cos_1.priority_source.dscp = [8,9,10,11,12,13,14,15]
traffic.cos_2.priority_source.dscp = [16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
traffic.cos_3.priority_source.dscp = []
traffic.cos_4.priority_source.dscp = []
traffic.cos_5.priority_source.dscp = [40,41,42,43,44,45,46,47,32,33,34,35,36,37,38,39]
traffic.cos_6.priority_source.dscp = [48,49,50,51,52,53,54,55]
traffic.cos_7.priority_source.dscp = [56,57,58,59,60,61,62,63]
要将自定义 DSCP 配置文件应用于特定接口,请参阅端口组。
信任端口
无论入口标记如何,您都可以将所有流量分配给一个交换机优先级。
以下命令将所有流量分配给交换机优先级 3,而不管入口标记如何。
cumulus@switch:~$ nv set qos mapping default-global trust port
cumulus@switch:~$ nv set qos mapping default-global port-default-sp 3
cumulus@switch:~$ nv config apply
要显示默认配置文件中所有流量的交换机优先级设置(无论入口标记如何),请运行 nv show qos mapping default-global
命令
cumulus@switch:~$ nv show qos mapping default-global
operational applied description
--------------- ----------- ------- ----------------------------
port-default-sp 3 3 Port Default Switch Priority
trust port port Port Trust configuration
在 /etc/cumulus/datapath/qos/qos_features.conf
文件中,配置 traffic.packet_priority_source_set = [port]
。
traffic.port_default_priority
设置定义了所有流量使用的交换机优先级。
要将自定义配置文件应用于特定接口,请参阅端口组。
标记和重新标记流量
您可以通过两种方式标记或重新标记流量
- 使用入口 COS 或 DSCP 将现有的 802.1p COS 或 DSCP 值重新标记为新值。
- 使用 iptables 匹配数据包并设置 802.1p COS 或 DSCP 值(基于策略的标记)。
用于标记的 802.1p 或 DSCP
要启用 802.1p、DSCP 或 802.1p 和 DSCP 值的全局重新标记
要将交换机优先级 0 重新标记为出口 802.1p 4
cumulus@switch:~$ nv set qos remark default-global rewrite l2
cumulus@switch:~$ nv set qos remark default-global switch-priority 0 pcp 4
cumulus@switch:~$ nv config apply
要将交换机优先级 0 重新标记为出口 DSCP 22
cumulus@switch:~$ nv set qos remark default-global rewrite l3
cumulus@switch:~$ nv set qos remark default-global switch-priority 0 dscp 22
cumulus@switch:~$ nv config apply
您可以将多个交换机优先级值重新映射到同一个外部 802.1p 或 DSCP 值。例如,要将交换机优先级 1 和 2 映射到 802.1p 3
cumulus@switch:~$ nv set qos remark default-global rewrite l2
cumulus@switch:~$ nv set qos remark default-global switch-priority 1 pcp 3
cumulus@switch:~$ nv set qos remark default-global switch-priority 2 pcp 3
cumulus@switch:~$ nv config apply
要将交换机优先级 1 和 2 映射到 DSCP 40
cumulus@switch:~$ nv set qos remark default-global rewrite l3
cumulus@switch:~$ nv set qos remark default-global switch-priority 1 dscp 40
cumulus@switch:~$ nv set qos remark default-global switch-priority 2 dscp 40
cumulus@switch:~$ nv config apply
在 /etc/cumulus/datapath/qos/qos_features.conf
文件中,将 traffic.packet_priority_remark_set
值修改为 [802.1p]
、[dscp]
或 [802.1p,dscp]
。例如,要仅启用 802.1p 值的重新标记
traffic.packet_priority_remark_set = [802.1p]
您可以使用 priority_remark.8021p
或 priority_remark.dscp
设置重新标记 802.1p 或 DSCP。交换机优先级(内部 cos_
)值确定出口 802.1p 或 DSCP 重新标记。例如,要将交换机优先级 0 重新标记为出口 802.1p 4
traffic.cos_0.priority_remark.8021p = [4]
要将交换机优先级 0 重新标记为出口 DSCP 22
traffic.cos_0.priority_remark.dscp = [22]
配置文件中的 #
是注释。默认情况下,该文件注释掉 traffic.cos_*.priority_remark.8021p
和 traffic.cos_*.priority_remark.dscp
行。您必须取消注释它们才能设置配置。
您可以将多个交换机优先级值重新映射到同一个外部 802.1p 或 DSCP 值。例如,要将交换机优先级 1 和 2 映射到 802.1p 3
traffic.cos_1.priority_remark.8021p = [3]
traffic.cos_2.priority_remark.8021p = [3]
要将交换机优先级 1 和 2 映射到 DSCP 40
traffic.cos_1.priority_remark.dscp = [40]
traffic.cos_2.priority_remark.dscp = [40]
要将自定义配置文件应用于特定接口,请参阅端口组。
基于策略的标记
Cumulus Linux 通过 ebtables
、iptables
或 ip6tables
支持 ACL,用于出口数据包标记和重新标记。
Cumulus Linux 使用 ebtables
标记 2 层 802.1p COS 值。Cumulus Linux 使用 iptables
匹配 IPv4 流量,并使用 ip6tables
匹配 IPv6 流量以进行 DSCP 标记。
有关配置和应用 ACL 的更多信息,请参阅访问控制列表配置。
标记 2 层 COS
您必须使用 ebtables
匹配和标记 2 层桥接流量。您可以使用任何受支持的 ebtables
规则匹配流量。
要在流量匹配时设置新的 802.1p COS 值,请使用 -A FORWARD -o <interface> -j setqos --set-cos <value>
。
您只能在每个出口接口的基础上设置 COS。Cumulus Linux 不支持基于 ebtables
的入口匹配。
配置的操作始终具有以下条件
- 规则始终是
FORWARD
链的一部分。 - 接口 (
<interface>
) 是物理 swp 端口。 jump
操作始终为setqos
(小写)。--set-cos
值是 0 到 7 之间的 802.1p COS 值。
例如,要将离开接口 swp5
的流量设置为 802.1p COS 值 4
-A FORWARD -o swp5 -j setqos --set-cos 4
标记 3 层 DSCP
您必须使用 iptables
(用于 IPv4 流量)或 ip6tables
(用于 IPv6 流量)来匹配和标记 3 层流量。
您可以使用任何受支持的 iptable 或 ip6tables 规则匹配流量。要在流量匹配时设置新的 COS 或 DSCP 值,请使用 -A FORWARD -o <interface> -j SETQOS [--set-dscp <value> | --set-cos <value> | --set-dscp-class <name>]
。
配置的操作始终具有以下条件
- 规则始终配置为
FORWARD
链的一部分。 - 接口 (
<interface>
) 是物理 swp 端口。 jump
操作始终为SETQOS
(大写)。
您可以使用 --set-cos
和介于 0 到 7(含 0 和 7)之间的值配置 COS 标记。
您只能使用 --set-dscp
或 --set-dscp-class
中的一个。--set-dscp
支持 0 到 77 之间的十进制或十六进制 DSCP 值。--set-dscp-class
支持标准 DSCP 命名,如 RFC3260 中所述,包括 ef
、be
、CS 和 AF 类。
您可以指定 --set-dscp
或 --set-dscp-class
,但不能同时指定两者。
例如,要将离开接口 swp5 的流量设置为 DSCP 值 32
-A FORWARD -o swp5 -j SETQOS --set-dscp 32
要将离开接口 swp11 的流量设置为 DSCP 类值 CS6
-A FORWARD -o swp11 -j SETQOS --set-dscp-class cs6
流控制
流控制影响数据传输,以管理网络路径上的拥塞。
Cumulus Linux 支持以下流控制机制
- 链路暂停 (IEEE 802.3x),在拥塞期间向相邻的 2 层交换机发送专门的以太网帧以停止或暂停链路上的所有流量。
- 优先级流控制 (PFC) 是 IEEE 802.1bb 定义的链路暂停的升级版,它扩展了暂停帧的概念,使其能够基于每个交换机优先级值而不是整个链路进行操作。PFC 暂停帧向对等方指示要暂停的特定交换机优先级值,而其他交换机优先级值或队列继续传输。
您不能在同一端口上配置链路暂停和 PFC。
流控制缓冲区
在配置链路暂停或 PFC 之前,请配置为无损和有损流分配的缓冲区池内存。以下示例将它们都设置为百分之五十
cumulus@switch:~$ nv set qos traffic-pool default-lossless memory-percent 50
cumulus@switch:~$ nv set qos traffic-pool default-lossy memory-percent 50
cumulus@switch:~$ nv config apply
默认情况下,Cumulus Linux 将 100% 的缓冲区内存分配给默认有损流量池。跨池的总内存分配不得超过 100%。
编辑 /etc/mlx/datapath/qos/qos_infra.conf
文件中的以下行
修改现有的
ingress_service_pool.0.percent
和egress_service_pool.0.percent
缓冲区分配。将现有的入口设置更改为ingress_service_pool.0.percent = 50
。将现有的出口设置更改为egress_service_pool.0.percent = 50
。添加以下行以创建新的
service_pool
,将flow_control
设置为服务池,并定义缓冲区预留
ingress_service_pool.1.percent = 50.0
ingress_service_pool.1.mode = 1
egress_service_pool.1.percent = 50.0
egress_service_pool.1.mode = 1
egress_service_pool.1.infinite_flag = TRUE
#
flow_control.ingress_service_pool = 1
flow_control.egress_service_pool = 1
#
port.service_pool.1.ingress_buffer.reserved = 0
port.service_pool.1.ingress_buffer.dynamic_quota = ALPHA_1
port.service_pool.1.egress_buffer.uc.reserved = 0
port.service_pool.1.egress_buffer.uc.dynamic_quota = ALPHA_INFINITY
#
flow_control.ingress_buffer.dynamic_quota = ALPHA_1
flow_control.egress_buffer.reserved = 0
flow_control.egress_buffer.dynamic_quota = ALPHA_INFINITY
链路暂停
链路暂停是一种较旧的流控制机制,它会导致两个交换机之间或主机和交换机之间的链路上的所有流量在拥塞期间停止传输。链路暂停根据缓冲区拥塞情况启动和停止。您可以在每个方向、每个接口的基础上配置链路暂停。您可以接收暂停帧以在请求时停止交换机传输,发送暂停帧以请求相邻设备停止传输,或者两者兼有之。
- NVIDIA 建议您使用优先级流控制 (PFC) 而不是链路暂停。
- 在配置链路暂停之前,您必须首先修改交换机缓冲区分配。请参阅流控制缓冲区。
链路暂停缓冲区计算是一个复杂的主题,IEEE 802.1Q-2012 对其进行了定义。这试图将信号拥塞和相邻设备接收信号之间的延迟纳入考虑。此计算包括 PHY 和 MAC 层(接口延迟)引入的延迟以及端点之间的距离(电缆长度)。
不正确的电缆长度设置可能会导致缓冲区空间浪费(过早触发拥塞)或数据包丢失(拥塞发生在流控制激活之前)。
以下示例配置
- 创建一个名为
my_pause_ports
的配置文件(端口组)。 - 启用发送暂停帧并禁用接收暂停帧。
- 将电缆长度设置为 50 米。
- 在 swp1 到 swp4 以及 swp6 上设置链路暂停。
Cumulus Linux 还包括帧传输启动和停止阈值以及端口缓冲区设置。NVIDIA 建议您不要更改这些设置,而是让 Cumulus Linux 动态配置这些设置。只有当您是了解无损流量无缝工作所需的缓冲区配置要求的高级用户时,才更改阈值和缓冲区设置。
cumulus@switch:~$ nv set qos link-pause my_pause_ports tx enable
cumulus@switch:~$ nv set qos link-pause my_pause_ports rx disable
cumulus@switch:~$ nv set qos link-pause my_pause_ports cable-length 50
cumulus@switch:~$ nv set interface swp1-4,swp6 qos link-pause profile my_pause_ports
cumulus@switch:~$ nv config apply
要显示配置文件的链路暂停设置,请运行 nv show qos link-pause <profile>
命令
取消注释并编辑 /etc/cumulus/datapath/qos/qos_features.conf
文件的 link_pause
部分。
link_pause.port_group_list = [my_pause_ports]
link_pause.my_pause_ports.port_set = swp1-swp4,swp6
link_pause.my_pause_ports.port_buffer_bytes = 25000
link_pause.my_pause_ports.xoff_size = 10000
link_pause.my_pause_ports.xon_delta = 2000
link_pause.my_pause_ports.rx_enable = false
link_pause.my_pause_ports.tx_enable = true
link_pause.my_pause_ports.cable_length = 10
要处理暂停帧,您必须在特定接口上启用链路暂停。
优先级流控制 (PFC)
优先级流控制通过特定 802.1p 值的帧扩展了链路暂停的功能,而不是停止链路上的所有流量。如果交换机支持 PFC 并接收到给定 802.1p 值的 PFC 暂停帧,则交换机停止从该队列传输帧,但继续传输其他队列的帧。
您将 PFC 与融合以太网上的 RDMA - RoCE一起使用。RoCE 部分提供了有关专门为 RoCE 环境部署 PFC 和 ECN 的信息。
在配置 PFC 之前,首先根据流控制缓冲区修改交换机缓冲区分配。
PFC 缓冲区计算是一个复杂的主题,在 IEEE 802.1Q-2012 中定义,它试图将信号拥塞和相邻设备接收信号之间的延迟纳入考虑。此计算包括 PHY 和 MAC 层(称为接口延迟)引入的延迟以及端点之间的距离(电缆长度)。
不正确的电缆长度设置会导致缓冲区空间浪费(过早触发拥塞)或数据包丢失(拥塞发生在流控制激活之前)。
要在所有端口上应用 PFC 设置,请修改默认 PFC 配置文件 (default-global
)。
以下示例修改默认配置文件并配置
- 出口队列 0 上的 PFC。
- 启用发送暂停帧并禁用接收暂停帧。
- 电缆长度为 50 米。
Cumulus Linux 还包括帧传输启动和停止阈值以及端口缓冲区设置。NVIDIA 建议您不要更改这些设置,而是让 Cumulus Linux 动态配置这些设置。只有当您是了解无损流量无缝工作所需的缓冲区配置要求的高级用户时,才更改阈值和缓冲区设置。
cumulus@switch:~$ nv set qos pfc default-global switch-priority 0
cumulus@switch:~$ nv set qos pfc default-global tx enable
cumulus@switch:~$ nv set qos pfc default-global rx disable
cumulus@switch:~$ nv set qos pfc default-global cable-length 50
cumulus@switch:~$ nv config apply
要显示默认配置文件的 PFC 设置,请运行 nv show qos pfc default-global
命令
cumulus@switch:~$ nv show qos pfc default-global
operational applied description
----------------- ----------- ------- --------------------------------
cable-length 50 50 Cable Length (in meters)
port-buffer 25000 B 25000 B Port Buffer (in bytes)
rx disable disable PFC Rx State
tx enable enable PFC Tx State
xoff-threshold 10000 B 10000 B Xoff Threshold (in bytes)
xon-threshold 2000 B 2000 B Xon Threshold (in bytes)
[switch-priority] 0 0 Collection of switch priorities.
编辑 /etc/cumulus/datapath/qos/qos_features.conf
文件的 priority flow control
部分。
pfc.port_group_list = [default-global]
pfc.default-global.port_set = allports
pfc.default-global.cos_list = [0]
pfc.default-global.port_buffer_bytes = 25000
pfc.default-global.xoff_size = 10000
pfc.default-global.xon_delta = 2000
pfc.default-global.tx_enable = true
pfc.default-global.rx_enable = false
pfc.default-global.cable_length = 50
要将自定义配置文件应用于特定接口,请参阅端口组。
PFC 监视器
PFC 监视器检测并缓解启用 PFC 的端口上的暂停风暴。
在无损以太网中,交换机发送 PFC PAUSE 帧来指示链路伙伴暂停在特定流量类别上发送数据包。这种反压可能会在网络中传播,如果持续存在,可能会导致网络停止转发流量。PFC 监控器检测到因接收过多暂停帧而导致的异常反压,并临时禁用 PFC。
当无损队列从其链路伙伴收到暂停风暴,并且队列处于暂停状态一段时间后,PFC 监控器会缓解暂停风暴。监控器会停止处理与检测到风暴的流量类别相对应的每个交换机优先级上收到的暂停帧,并丢弃发送到此出口队列的新入站数据包。
监控器会继续计数端口上收到的暂停帧。如果在任何轮询间隔期间未收到暂停帧,它将恢复端口上的 PFC 配置并停止丢弃数据包。
PFC 监控器还检测和缓解启用链路暂停端口上的暂停风暴。启用链路暂停端口的监控器配置与启用 PFC 端口的配置相同。对于启用链路暂停的端口,监控器会停止处理出口端口上收到的暂停帧,该出口端口检测到风暴并丢弃发送到端口上所有出口队列的新入站数据包,直到拥塞减轻。
- PFC 监控器仅适用于无损流量队列。
- 您只能在配置了 PFC(或链路暂停)的端口上配置 PFC 监控器。
- 您只能在物理接口 (swp) 上启用 PFC 监控器。
- 您不能在 bond 上启用监控器(例如,bond0),但可以在作为 bond 成员的端口上启用监控器(例如,swp1)。
要启用 PFC 监控器
在启用 PFC 的接口上启用 PFC 监控器
cumulus@switch:~$ nv set interface swp1 qos pfc-watchdog
cumulus@switch:~$ nv set interface swp3 qos pfc-watchdog
cumulus@switch:~$ nv config apply
要禁用 PFC 监控器,请运行 nv unset interface <interface> qos pfc-watchdog
命令或 nv set interface <interface> qos pfc-watchdog state disable
命令。
编辑 /etc/cumulus/datapath/qos/qos_features.conf
文件的 PFC Watchdog Configuration
部分,然后重新加载 switchd
。
...
# PFC Watchdog Configuration
# Add the port to the port_group_list where you want to enable PFC Watchdog
# It will enable PFC Watchdog on all the traffic-class corresponding to
# the lossless switch-priority configured on the port.
pfc_watchdog.port_group_list = [pfc_wd_port_group]
pfc_watchdog.pfc_wd_port_group.port_set = swp1,swp2
...
cumulus@switch:~$ sudo systemctl reload switchd
您可以控制 PFC 监控器轮询间隔以及 PFC 监控器必须等待多少个轮询间隔才能缓解风暴状况。默认轮询间隔为 100 毫秒。默认轮询间隔数为 3。
以下示例将 PFC 监控器轮询间隔设置为 200 毫秒,轮询间隔数设置为 5
cumulus@switch:~$ nv set qos pfc-watchdog polling-interval 200
cumulus@switch:~$ nv set qos pfc-watchdog robustness 5
cumulus@switch:~$ nv config apply
编辑 /etc/cumulus/switchd.conf
文件以设置 pfc_wd.poll_interval
参数和 pfc_wd.robustness
参数。
...
# PFC Watchdog poll interval (in msec)
#pfc_wd.poll_interval = 200
# PFC Watchdog robustness (# of iterations)
#pfc_wd.robustness = 5
...
运行以下命令以应用配置
cumulus@switch:~$ echo 5 > /cumulus/switchd/config/pfc_wd/robustness
cumulus@switch:~$ echo 200 > /cumulus/switchd/config/pfc_wd/poll_interval
要显示 PFC 监控器是否已开启以及显示每个流量类别的状态,请运行 nv show interface <interface> qos pfc-watchdog
命令
cumulus@switch:~$ nv show interface swp1 qos pfc-watchdog
operational applied
--------------- ----------- -------
state enabled enabled
PFC WD Status
===========================
traffic-class status deadlock-count
------------- -------- --------------
0 OK 0
1 OK 3
2 DEADLOCK 2
3 OK 0
4 OK 0
5 OK 0
6 OK 0
7 DEADLOCK 3
要显示特定流量类别的 PFC 监控器数据,请运行 nv show interface <interface> qos pfc-watchdog status <traffic-class>
命令。
要清除接口上的 PFC 监控器 deadlock-count
,请运行 nv action clear interface <interface> qos pfc-watchdog deadlock-count
命令。
拥塞控制 (ECN)
显式拥塞通知 (ECN) 是一种端到端第 3 层拥塞控制协议。ECN 由 RFC 3168 定义,依赖于 IPv4 标头流量类别中的位来指示拥塞状况。ECN 需要一个或两个服务器端点支持 ECN 才能生效。
ECN 不是在缓冲区拥塞时告诉相邻设备停止传输,而是设置传输 IPv4 或 IPv6 标头的 ECN 位,以向终端主机指示可能发生拥塞。因此,发送主机降低其发送速率,直到传输交换机不再设置 ECN 位。
您将 ECN 与 基于融合以太网的 RDMA - RoCE 一起使用。RoCE 部分描述了如何在 RoCE 环境中部署 PFC 和 ECN。
ECN 的工作原理是让传输交换机标记两个终端主机之间的数据包。
- 传输主机通过将传出 IP 标头中的 ECN 位设置为
01
或10
来指示它支持 ECN - 如果传输交换机的缓冲区大于配置的最小缓冲区阈值,则交换机会将 ECN 位重新标记为
11
,表示遇到拥塞或 CE。 - 接收主机将任何回复数据包(如 TCP-ACK)标记为 CE (
11
)。 - 原始传输主机降低其传输速率。
- 当交换机缓冲区拥塞降至配置的最小缓冲区阈值以下时,交换机停止重新标记 ECN 位,将其设置回
01
或10
。 - 接收主机在下一个回复中反映此新的 ECN 标记,以便传输主机恢复以正常速度发送。
默认配置文件 (default-global
) 默认在出口队列 0 上为所有端口启用 ECN,并具有以下设置
- 最小缓冲区阈值为 150000 字节。当缓冲区拥塞超过此阈值时,随机 ECN 标记开始,并且 ECN 标记概率随着队列深度向最大阈值增加而增加。
- 最大缓冲区阈值为 1500000 字节。当缓冲区拥塞超过此阈值时,Cumulus Linux 会标记所有支持 ECN 的数据包。
- 随机早期检测 (RED) 已禁用。ECN 通过向主机发出信号以减少传输来防止网络中因拥塞而导致的数据包丢失。但是,如果在 ECN 标记后拥塞仍然持续,则在交换机缓冲区满后数据包会丢失。默认情况下,当缓冲区满时,Cumulus Linux 会尾部丢弃数据包。您可以启用 RED 以随机丢弃队列中的数据包,而不是始终丢弃最后一个到达的数据包。这可能会提高基于 TCP 的流量的整体性能。
以下示例命令更改应用于所有端口的默认 ECN 配置文件。这些命令在出口队列 4、5 和 7 上启用 ECN,将最小缓冲区阈值设置为 40000,最大缓冲区阈值设置为 200000,并启用 RED。
cumulus@switch:~$ nv set qos congestion-control default-global traffic-class 4,5,7 min-threshold 40000
cumulus@switch:~$ nv set qos congestion-control default-global traffic-class 4,5,7 max-threshold 200000
cumulus@switch:~$ nv set qos congestion-control default-global traffic-class 4,5,7 red enable
cumulus@switch:~$ nv config apply
以下示例禁用所有端口的默认配置文件中的 ECN 位标记。
cumulus@switch:~$ nv set qos congestion-control default-global traffic-class 0 ecn disable
cumulus@switch:~$ nv config apply
要显示默认配置文件的 ECN 设置,请运行 nv show qos congestion-control default-global
命令
cumulus@switch:~$ nv show qos congestion-control default-global
operational applied description
-- ----------- ------- -----------
ECN Configurations
=====================
traffic-class ECN RED Min Th Max Th Probability
------------- ------ ------ ------- -------- -----------
4 enable enable 40000 B 200000 B 100
5 enable enable 40000 B 200000 B 100
7 enable enable 40000 B 200000 B 100
要显示默认配置文件中特定出口队列的 ECN 设置,请运行 nv show qos congestion-control default-global traffic-class <value>
命令
cumulus@switch:~$ nv show qos congestion-control default-global traffic-class 4
operational applied description
------------- ----------- -------- -----------------------------------
ecn enable enable Early Congestion Notification State
max-threshold 200000 B 200000 B Maximum Threshold (in bytes)
min-threshold 40000 B 40000 B Minimum Threshold (in bytes)
probability 100 100 Probability
red enable enable Random Early Detection State
编辑 /etc/cumulus/datapath/qos/qos_features.conf
文件的 Explicit Congestion Notification
部分。
default_ecn_red_conf.egress_queue_list = [4,5,7]
default_ecn_red_conf.ecn_enable = true
default_ecn_red_conf.red_enable = true
default_ecn_red_conf.min_threshold_bytes = 40000
default_ecn_red_conf.max_threshold_bytes = 200000
default_ecn_red_conf.probability = 100
要禁用 ECN 位标记,请将 ecn_enable
设置为 false。以下示例禁用所有端口的默认配置文件中的 ECN 位标记。
...
default_ecn_red_conf.ecn_enable = false
...
要将自定义 ECN 配置文件应用于特定接口,请参阅 端口组。
出口队列
Cumulus Linux 支持八个出口队列,以提供不同的服务类别。默认情况下,交换机优先级值直接映射到匹配的出口队列。例如,交换机优先级值 0 映射到出口队列 0。
您可以通过将交换机优先级值更改为相应的队列值来重新映射队列。您可以将多个交换机优先级值映射到单个出口队列。
您不必分配所有出口队列。
以下命令示例将交换机优先级 2 分配给出口队列 7
cumulus@switch:~$ nv set qos egress-queue-mapping default-global switch-priority 2 traffic-class 7
cumulus@switch:~$ nv config apply
NVUE 仅支持 default-global
配置文件。
要显示默认配置文件的出口队列映射配置,请运行 nv show qos egress-queue-mapping default-global
命令
cumulus@switch:~$ nv show qos egress-queue-mapping default-global
operational applied description
-- ----------- ------- -----------
SP->TC mapping configuration
===============================
switch-priority traffic-class
--------------- -------------
0 0
1 1
2 7
3 3
4 4
5 5
6 6
7 7
要显示默认配置文件中特定交换机优先级的出口队列映射,请运行 nv show qos egress-queue-mapping default-global switch-priority <value>
命令。以下示例命令显示交换机优先级 2 映射到出口队列 7。
cumulus@switch:~$ nv show qos egress-queue-mapping default-global switch-priority 2
operational applied description
------------- ----------- ------- -------------
traffic-class 7 7 Traffic Class
您在 qos_infra.conf
文件中配置出口队列。
cos_egr_queue.cos_0.uc = 0
cos_egr_queue.cos_1.uc = 1
cos_egr_queue.cos_2.uc = 7
cos_egr_queue.cos_3.uc = 3
cos_egr_queue.cos_4.uc = 4
cos_egr_queue.cos_5.uc = 5
cos_egr_queue.cos_6.uc = 6
cos_egr_queue.cos_7.uc = 7
出口调度器
Cumulus Linux 支持 802.1Qaz,即增强型传输选择,它允许交换机为出口队列分配带宽,然后调度来自每个队列的流量传输。802.1Qaz 支持优先级队列。
Cumulus Linux 提供一个默认出口调度器,该调度器应用于所有端口,其中分配给出口队列 0、2、4、6 的带宽为 12%,分配给出口队列 1、3、5、7 的带宽为 13%。您还可以为特定端口应用自定义出口调度器;请参阅 端口组。
以下示例修改默认配置文件。这些命令将出口队列 0、1、5 和 7 的带宽分配更改为严格优先级,将出口队列 2 和 6 的带宽分配更改为 30%,并将出口队列 3 和 4 的带宽分配更改为 20%。
traffic-class
值定义您要分配带宽的出口队列。例如,traffic-class 2
定义出口队列 2 的带宽分配。- 对于每个出口队列,您可以将模式定义为
dwrr
或strict
。在dwrr
模式下,您必须定义介于 1 到 100 之间的带宽百分比值。如果您未指定出口队列的值,则 Cumulus Linux 使用 0 的 DWRR 值(无出口调度)。您分配给bw_percent
的值的总和必须小于或等于 100。
cumulus@switch:~$ nv set qos egress-scheduler default-global traffic-class 2,6 mode dwrr
cumulus@switch:~$ nv set qos egress-scheduler default-global traffic-class 2,6 bw-percent 30
cumulus@switch:~$ nv set qos egress-scheduler default-global traffic-class 3,4 mode dwrr
cumulus@switch:~$ nv set qos egress-scheduler default-global traffic-class 3,4 bw-percent 20
cumulus@switch:~$ nv set qos egress-scheduler default-global traffic-class 0,1,5,7 mode strict
cumulus@switch:~$ nv config apply
要显示默认配置文件的出口调度策略,请运行 nv show qos egress-scheduler default-global
命令
cumulus@switch:~$ nv show qos egress-scheduler default-global
operational applied description
-- ----------- ------- -----------
TC->DWRR weight configuration
================================
traffic-class mode bw-percent
------------- ------ ----------
0 strict
1 strict
2 dwrr 30
3 dwrr 20
4 dwrr 20
5 strict
6 dwrr 30
7 strict
您在 /etc/cumulus/datapath/qos/qos_features.conf
文件的 egress scheduling
部分中配置出口调度策略。
egr_queue_
值定义您要分配带宽的出口队列。例如,egr_queue_0
定义出口队列 0 的带宽分配。bw_percent
值定义您要分配给出口队列的带宽分配。如果您未指定出口队列的值,则没有出口调度。如果您为出口队列指定值 0,则 Cumulus Linux 会为出口队列分配strict
优先级模式,并始终先于其他队列处理它。您分配给bw_percent
的值的总和必须小于或等于 100。
default_egress_sched.egr_queue_0.bw_percent = 0
default_egress_sched.egr_queue_1.bw_percent = 0
default_egress_sched.egr_queue_2.bw_percent = 30
default_egress_sched.egr_queue_3.bw_percent = 20
default_egress_sched.egr_queue_4.bw_percent = 20
default_egress_sched.egr_queue_5.bw_percent = 0
default_egress_sched.egr_queue_6.bw_percent = 30
default_egress_sched.egr_queue_7.bw_percent = 0
strict
模式不定义最大带宽分配。这可能会导致其他队列饥饿。
要为特定端口应用自定义出口调度器,请参阅 端口组。
策略和整形
流量整形和策略控制交换机在网络上发送或接收流量的速率,以防止拥塞。
流量整形通常发生在出口,而流量策略发生在入口。
整形
流量整形允许交换机以低于物理接口的平均比特率发送流量。如果接收设备无法处理该速率的流量,或者具有限制其接受流量的策略,则流量整形可防止接收设备丢弃突发流量。
流量整形的工作原理是将数据包保存在缓冲区中,并在特定的时间间隔释放它们。
Cumulus Linux 支持两级分层流量整形:一级在出口队列级别,一级在端口级别。这允许为每个出口队列提供最小和最大带宽保证,并定义端口流量整形速率。
以下示例配置
- 将与流量整形设置一起使用的配置文件名称(端口组)设置为
shaper1
。 - 将出口队列 2 的最小带宽设置为 100 kbps。默认最小带宽为 0 kbps。
- 将出口队列 2 的最大带宽设置为 500 kbps。默认最小带宽为 2147483647 kbps。
- 将端口组的最大数据包整形器速率设置为 200000。默认最大数据包整形器速率为 2147483647 kbps。
- 将流量整形配置应用于 swp1、swp2、swp3 和 swp5。
- 当出口队列的最小带宽为
0
时,此队列没有带宽保证。 - 出口队列的最大带宽不得超过端口组的最大数据包整形器速率。
- 端口组的最大数据包整形器速率不得超过物理接口速度。
- Cumulus Linux 仅对包含整形配置的配置文件中的流量类别进行流量整形。
cumulus@switch:~$ nv set qos egress-shaper shaper1 traffic-class 2 min-rate 100
cumulus@switch:~$ nv set qos egress-shaper shaper1 traffic-class 2 max-rate 500
cumulus@switch:~$ nv set qos egress-shaper shaper1 port-max-rate 200000
cumulus@switch:~$ nv set interface swp1,swp2,swp3,swp5 qos egress-shaper profile shaper1
cumulus@switch:~$ nv config apply
编辑 qos_features.conf
文件的 shaping
部分。
Cumulus Linux 基于配置的出口队列的 egr_queue
值。
shaping.port_group_list = [shaper1]
shaping.shaper1.port_set = swp1-swp3,swp5
shaping.shaper1.egr_queue_0.shaper = [50000, 100000]
shaping.shaper1.port.shaper = 900000
策略
流量策略可防止接口接收超过预期量的流量。您可以使用策略来强制接口上的最大传输速率。交换机会丢弃任何高于策略级别的流量。
Cumulus Linux 支持单速率策略器和双速率策略器(三色策略器)。
您可以使用 ebtables、iptables 或 ip6table 规则配置流量策略。
有关配置和应用 ACL 的更多信息,请参阅访问控制列表配置。
单速率策略器
要配置单速率策略器,请使用 iptables JUMP
操作 -j POLICE
。
Cumulus Linux 支持单速率策略器的以下 iptable 标志。
iptables 标志 | 描述 |
---|---|
--set-mode [pkt | KB] | 定义策略器以计数数据包或千字节。 |
--set-rate [<kbytes> | <packets>] | 每秒千字节或数据包的最大流量速率。 |
--set-burst <kilobytes> | 允许的突发大小(以千字节为单位)。 |
例如,要创建允许每秒 400 个数据包且突发为 100 个数据包的策略器-j POLICE --set-mode pkt --set-rate 400 --set-burst 100
双速率策略器
要配置双速率策略器,请使用 iptables JUMP
操作 -j TRICOLORPOLICE
。
Cumulus Linux 支持双速率策略器的以下 iptable 标志。
iptables 标志 | 描述 |
---|---|
--set-color-mode [blind | aware] | 策略模式:单速率 (blind ) 或双速率 (aware )。默认值为 aware 。 |
--set-cir <kbps> | 承诺信息速率 (CIR),单位为千比特每秒。 |
--set-cbs <kbytes> | 承诺突发大小 (CBS),单位为千字节。 |
--set-pir <kbps> | 峰值信息速率 (PIR),单位为千比特每秒。 |
--set-ebs <kbytes> | 超额突发大小 (EBS),单位为千字节。 |
--set-conform-action-dscp <dscp value> | 符合策略器速率的流量要标记的数值 DSCP 值。 |
--set-exceed-action-dscp <dscp value> | 超出策略器速率的流量要标记的数值 DSCP 值。 |
--set-violate-action-dscp <dscp value> | 违反策略器速率的流量要标记的数值 DSCP 值。 |
--set-violate-action [accept | drop] | Cumulus Linux 接受并重新标记,或丢弃违反策略器速率的数据包。 |
例如,要配置双速率、三色策略器,CIR 为 3 Mbps,CBS 为 500 KB,PIR 为 10 Mbps,EBS 为 1 MB,并丢弃违反策略器的数据包
-j TRICOLORPOLICE --set-color-mode blind --set-cir 3000 --set-cbs 500 --set-pir 10000 --set-ebs 1000 --set-violate-action drop
端口组
Cumulus Linux 支持所有功能的配置文件(端口组),包括 ECN 和 RED。配置文件将类似的 QoS 配置应用于一组端口。
- 配置文件的配置将覆盖端口组中入口端口的全局设置。
- 不在配置文件中的端口使用全局设置。
- 要将配置文件应用于所有端口,请使用全局配置文件。
信任和标记
您可以使用端口组为不同的端口分配不同的配置文件。配置文件是一组配置设置的标签。
以下示例配置了两个配置文件。customer1
应用于 swp1、swp4 和 swp6。customer2
应用于 swp5 和 swp7。
cumulus@switch:~$ nv set qos mapping customer1 trust l3
cumulus@switch:~$ nv set qos mapping customer1 dscp 0 switch-priority 1-7
cumulus@switch:~$ nv set interface swp1,swp4,swp6 qos mapping profile customer1
cumulus@switch:~$ nv set qos mapping customer2 trust l2
cumulus@switch:~$ nv set qos mapping customer2 pcp 1 switch-priority 4
cumulus@switch:~$ nv set interface swp5,swp7 qos mapping profile customer2
cumulus@switch:~$ nv config apply
以下示例配置了配置文件 customports
,无论入口标记如何,该配置文件都会将 swp1、swp2 和 swp3 上的流量分配给交换机优先级 4。
cumulus@switch:~$ nv set qos mapping customports trust port
cumulus@switch:~$ nv set qos mapping customports port-default-sp 4
cumulus@switch:~$ nv set interface swp1,swp2,swp3 qos mapping profile customports
cumulus@switch:~$ nv config apply
您可以使用 qos_features.conf
文件中的 source.port_group_list
配置定义配置文件。source.port_group_list
是用于一组设置的一个或多个名称。
以下示例配置了两个配置文件。customer1
应用于 swp1、swp4 和 swp6。customer2
应用于 swp5 和 swp7。
source.port_group_list = [customer1,customer2]
source.customer1.packet_priority_source_set = [dscp]
source.customer1.port_set = swp1-swp4,swp6
source.customer1.port_default_priority = 0
source.customer1.cos_0.priority_source.dscp = [0-7]
source.customer2.packet_priority_source_set = [802.1p]
source.customer2.port_set = swp5,swp7
source.customer2.port_default_priority = 0
source.customer2.cos_1.priority_source.8021p = [4]
配置 | 描述 |
---|---|
source.port_group_list | 您要使用的端口组(配置文件)的名称。 以下示例定义了 customer1 和 customer2 source.port_group_list = [customer1,customer2] |
source.customer1.packet_priority_source_set | 入口标记信任。 在以下示例中,入口 DSCP 值用于组 customer1 source.customer1.packet_priority_source_set = [dscp] |
source.customer1.port_set | 要在其上应用入口标记信任策略的端口集。 在以下示例中,端口 swp1、swp2、swp3、swp4 和 swp6 用于 customer1 source.customer1.port_set = swp1-swp4,swp6 |
source.customer1.port_default_priority | 未标记或不受信任流量的默认交换机优先级标记。 在以下示例中,Cumulus Linux 使用交换机优先级 0 标记 customer1 端口的未标记流量或第 2 层流量source.customer1.port_default_priority = 0 |
source.customer1.cos_0.priority_source | customer1 的入口 DSCP 值到交换机优先级值映射。在以下示例中,从 0 到 7 的 DSCP 值集映射到交换机优先级 0 source.customer1.cos_0.priority_source.dscp = [0,1,2,3,4,5,6,7] |
source.customer2.packet_priority_source_set | customer2 的入口标记信任。在以下示例中,802.1p 是 trusted source.packet_priority_source_set = [802.1p] |
source.customer2.port_set | 要在其上应用入口标记信任策略的端口集。 在以下示例中,swp5 和 swp7 应用于 customer2 source.customer2.port_set = swp5,swp7 |
source.customer2.port_default_priority | 未标记或不受信任流量的默认交换机优先级标记。 在以下示例中,Cumulus Linux 使用交换机优先级 0 标记 customer1 端口的未标记标记第 2 层流量或未标记 VLAN 标记流量source.customer2.port_default_priority = 0 |
source.customer2.cos_0.priority_source | customer2 的交换机优先级值到入口 802.1p 值映射。以下示例将入口 802.1p 值 4 映射到交换机优先级 1 source.customer2.cos_1.priority_source.8021p = [4] |
以下示例配置了配置文件 customports
,无论入口标记如何,该配置文件都会将 swp1、swp2 和 swp3 上的流量分配给交换机优先级 4。
source.port_group_list = [customports]
source.customports.packet_priority_source_set = [port]
source.customports.port_default_priority = 4
source.customports.port_set = swp1,swp2,swp3
重新标记
您可以使用配置文件根据交换机优先级(内部 COS)值在出口上重新标记 802.1p 或 DSCP。
要更改数据包上的标记值,交换机 ASIC 会读取入口端口上的启用或禁用重写标志,并参考出口端口上的映射配置来更改标记值。要重新标记 802.1p 或 DSCP 值,您必须在入口端口上启用重写,并在出口端口上配置映射。
在以下示例配置中,只有在 swp1 上入口并在 swp2 上出口的数据包才会更改数据包的标记值。在其他端口上入口并在 swp2 上出口的数据包不会更改数据包的标记值。这些命令将交换机优先级 0 和 1 映射到出口 DSCP 37。
cumulus@switch:~$ nv set qos remark remark_port_group1 rewrite l3
cumulus@switch:~$ nv set interface swp1 qos remark profile remark_port_group1
cumulus@switch:~$ nv set qos remark remark_port_group2 switch-priority 0 dscp 37
cumulus@switch:~$ nv set qos remark remark_port_group2 switch-priority 1 dscp 37
cumulus@switch:~$ nv set interface swp2 qos remark profile remark_port_group2
cumulus@switch:~$ nv config apply
您可以使用 /etc/cumulus/datapath/qos/qos_features.conf
文件中的 remark.port_group_list
定义这些配置文件。该名称是配置设置的标签。
remark.port_group_list = [remark_port_group1,remark_port_group2]
remark.remark_port_group1.packet_priority_remark_set = [dscp]
remark.remark_port_group1.port_set = swp1
remark.remark_port_group2.packet_priority_remark_set = []
remark.remark_port_group2.port_set = swp2
remark.remark_port_group2.cos_0.priority_remark.dscp = [37]
remark.remark_port_group2.cos_1.priority_remark.dscp = [37]
出口调度
您可以将端口组与出口调度权重一起使用,为不同的出口端口分配不同的配置文件。
在以下示例中,配置文件 list2
应用于 swp1、swp3 和 swp18。list2
仅为队列 2、5 和 6 分配权重,并在队列 2、5 或 6 中没有拥塞时,以尽力而为的方式调度其他队列。list1
应用于 swp2,并为所有队列分配权重。
cumulus@switch:~$ nv set qos egress-scheduler list2 traffic-class 2,5,6 mode dwrr
cumulus@switch:~$ nv set qos egress-scheduler list2 traffic-class 2,5 bw-percent 50
cumulus@switch:~$ nv set qos egress-scheduler list2 traffic-class 6 mode strict
cumulus@switch:~$ nv set interface swp1,swp3,swp18 qos egress-scheduler profile list2
cumulus@switch:~$ nv set qos egress-scheduler list1 traffic-class 0,3,4,5,6 mode dwrr
cumulus@switch:~$ nv set qos egress-scheduler list1 traffic-class 0,3,4,5,6 bw-percent 10
cumulus@switch:~$ nv set qos egress-scheduler list1 traffic-class 1 mode dwrr
cumulus@switch:~$ nv set qos egress-scheduler list1 traffic-class 1 bw-percent 20
cumulus@switch:~$ nv set qos egress-scheduler list1 traffic-class 2 mode dwrr
cumulus@switch:~$ nv set qos egress-scheduler list1 traffic-class 2 bw-percent 30
cumulus@switch:~$ nv set qos egress-scheduler list1 traffic-class 7 mode strict
cumulus@switch:~$ nv set interface swp2 qos egress-scheduler profile list1
cumulus@switch:~$ nv config apply
您可以使用 /etc/cumulus/datapath/qos/qos_features.conf
文件中的 egress_sched.port_group_list
定义端口组。egress_sched.port_group_list
包括组设置的名称。该名称是配置设置的标签(配置文件)。
egress_sched.port_group_list = [list1,list2]
egress_sched.list1.port_set = swp2
egress_sched.list1.egr_queue_0.bw_percent = 10
egress_sched.list1.egr_queue_1.bw_percent = 20
egress_sched.list1.egr_queue_2.bw_percent = 30
egress_sched.list1.egr_queue_3.bw_percent = 10
egress_sched.list1.egr_queue_4.bw_percent = 10
egress_sched.list1.egr_queue_5.bw_percent = 10
egress_sched.list1.egr_queue_6.bw_percent = 10
egress_sched.list1.egr_queue_7.bw_percent = 0
#
egress_sched.list2.port_set = [swp1,swp3,swp18]
egress_sched.list2.egr_queue_2.bw_percent = 50
egress_sched.list2.egr_queue_5.bw_percent = 50
egress_sched.list2.egr_queue_6.bw_percent = 0
配置 | 描述 |
---|---|
egress_sched.port_group_list | 要使用的端口组(标签)的名称。 以下示例定义了端口组 list1 和 list2 egress_sched.port_group_list = [list1,list2] |
egress_sched.list1.port_set | 您要在其上应用端口组的接口。egress_sched.list1.port_set = swp2 |
egress_sched.list1.egr_queue_0.bw_percent | 出口队列 0 的带宽百分比。egress_sched.list1.egr_queue_0.bw_percent = 10 |
egress_sched.list1.egr_queue_1.bw_percent | 出口队列 1 的带宽百分比。egress_sched.list1.egr_queue_1.bw_percent = 20 |
egress_sched.list1.egr_queue_2.bw_percent | 出口队列 2 的带宽百分比。egress_sched.list1.egr_queue_2.bw_percent = 30 |
egress_sched.list1.egr_queue_3.bw_percent | 出口队列 3 的带宽百分比。egress_sched.list1.egr_queue_3.bw_percent = 10 |
egress_sched.list1.egr_queue_4.bw_percent | 出口队列 4 的带宽百分比。egress_sched.list1.egr_queue_4.bw_percent = 10 |
egress_sched.list1.egr_queue_5.bw_percent | 出口队列 5 的带宽百分比。egress_sched.list1.egr_queue_5.bw_percent = 10 |
egress_sched.list1.egr_queue_6.bw_percent | 出口队列 6 的带宽百分比。egress_sched.list1.egr_queue_6.bw_percent = 10 |
egress_sched.list1.egr_queue_7.bw_percent | 出口队列 7 的带宽百分比。0 表示严格优先级队列egress_sched.list1.egr_queue_7.bw_percent = 0 |
egress_sched.list2.port_set | 您要应用于端口组的接口。 以下示例将 swp1 、swp3 和 swp18 应用于端口组 list2 egress_sched.list2.port_set = [swp1,swp3,swp18] |
egress_sched.list2.egr_queue_2.bw_percent | 出口队列 2 的带宽百分比。egress_sched.list2.egr_queue_2.bw_percent = 50 |
egress_sched.list2.egr_queue_5.bw_percent | 出口队列 5 的带宽百分比。egress_sched.list2.egr_queue_5.bw_percent = 50 |
egress_sched.list2.egr_queue_6.bw_percent | 出口队列 6 的带宽百分比。0 表示严格优先级队列egress_sched.list2.egr_queue_6.bw_percent = 0 |
PFC
要在端口组上设置优先级流控制,您可以创建一个配置文件来定义支持发送 PFC 暂停帧的出口队列,并定义要应用 PFC 暂停帧配置的接口集。Cumulus Linux 会自动启用 PFC 帧传输和 PFC 帧接收,并导出所有其他 PFC 设置,例如触发 PFC 帧传输开始和停止的缓冲区限制、保留缓冲区空间量以及电缆长度。
以下示例将名为 my_pfc_ports
的 PFC 配置文件应用于 swp1、swp2、swp3、swp4 和 swp6 上的出口队列 3 和 5。
cumulus@switch:~$ nv set qos pfc my_pfc_ports switch-priority 3,5
cumulus@switch:~$ nv set interface swp1-4,swp6 qos pfc profile my_pfc_ports
cumulus@switch:~$ nv config apply
以下示例将名为 my_pfc_ports2
的 PFC 配置文件应用于 swp1 上的出口队列 0。这些命令禁用 PFC 帧接收,并将触发 PFC 帧传输停止的缓冲区限制设置为 1500 字节,将触发 PFC 帧传输开始的缓冲区限制设置为 1000 字节。这些命令还将保留缓冲区空间量设置为 2000 字节,并将电缆长度设置为 50 米
cumulus@switch:~$ nv set qos pfc my_pfc_ports2 switch-priority 0
cumulus@switch:~$ nv set qos pfc my_pfc_ports2 xoff-threshold 1500
cumulus@switch:~$ nv set qos pfc my_pfc_ports2 xon-threshold 1000
cumulus@switch:~$ nv set qos pfc my_pfc_ports2 tx enable
cumulus@switch:~$ nv set qos pfc my_pfc_ports2 rx disable
cumulus@switch:~$ nv set qos pfc my_pfc_ports2 port-buffer 2000
cumulus@switch:~$ nv set qos pfc my_pfc_ports2 cable-length 50
cumulus@switch:~$ nv set interface swp1 qos pfc profile my_pfc_ports2
cumulus@switch:~$ nv config apply
所有 PFC 命令
命令 | 描述 |
---|---|
nv set qos pfc <profile> port-buffer <value> | 为端口组列表中定义的接口保留的缓冲区空间量(来自全局共享缓冲区)。 以下示例将保留缓冲区空间量设置为 25000 字节 nv set qos pfc my_pfc_ports port-buffer 25000 |
nv set qos pfc <profile> xoff-threshold <value> | 在端口组列表中的接口集发送 PFC 暂停帧之前,交换机必须消耗的保留缓冲区量。 以下示例在消耗 20000 字节的保留缓冲区后发送 PFC 暂停帧 nv set qos pfc my_pfc_ports xoff-threshold 20000 |
nv set qos pfc <profile> xon-threshold <value> | 缓冲区消耗必须降至 xoff 阈值以下的字节数,然后 PFC 暂停帧才会停止发送。在以下示例中,缓冲区拥塞必须减少 1000 字节(降至 8000 字节)后,PFC 暂停帧才会停止 nv set qos pfc my_pfc_ports xon-threshold 1000 |
nv set qos pfc <profile> rx enable nv set qos pfc <profile> rx disable | 启用或禁用发送 PFC 暂停帧。默认值为启用。 以下示例禁用发送 PFC 暂停帧 nv set qos pfc my_pfc_ports rx disable |
nv set qos pfc <profile> tx enable nv set qos pfc <profile> tx disable | 启用或禁用接收 PFC 暂停帧。您不需要为 rx enable 定义 COS 值。交换机接收任何 COS 值。默认值为启用。以下示例禁用接收 PFC 暂停帧 nv set qos pfc my_pfc_ports tx disable |
nv set qos pfc <profile> cable-length <value> | 连接到端口的电缆长度,以米为单位。Cumulus Linux 在内部使用此值来确定生成 PFC 暂停帧和接收 PFC 暂停帧之间的延迟。默认值为 10 米。以下示例将电缆长度设置为 5 米nv set qos pfc my_pfc_ports cable-length 5 |
编辑 /etc/cumulus/datapath/qos/qos_features.conf
文件的 priority flow control
部分。
以下示例将名为 my_pfc_ports
的 PFC 配置文件应用于 swp1、swp2、swp3、swp4 和 swp6 上的出口队列 3 和 5。
pfc.port_group_list = [my_pfc_ports2]
pfc.my_pfc_ports2.cos_list = [0]
pfc.my_pfc_ports2.port_set = swp1
以下示例将名为 my_pfc_ports2
的 PFC 配置文件应用于 swp1 上的出口队列 0。这些命令还禁用 PFC 帧接收,并将 xoff-size 设置为 1500 字节,xon-size 设置为 1000 字节,headroom 设置为 2000 字节,并将电缆长度设置为 10 米
pfc.port_group_list = [my_pfc_ports2]
pfc.my_pfc_ports2.cos_list = [0]
pfc.my_pfc_ports2.port_set = swp1
pfc.my_pfc_ports2.port_buffer_bytes = 2000
pfc.my_pfc_ports2.xoff_size = 1500
pfc.my_pfc_ports2.xon_delta = 1000
pfc.my_pfc_ports2.tx_enable = true
pfc.my_pfc_ports2.rx_enable = false
pfc.my_pfc_ports2.cable_length = 10
所有 PFC 配置选项
配置 | 描述 |
---|---|
pfc.my_pfc_ports.port_buffer_bytes | 为端口组列表中定义的接口保留的缓冲区空间量(来自全局共享缓冲区)。 以下示例将保留缓冲区空间量设置为 25000 字节 pfc.my_pfc_ports.port_buffer_bytes = 25000 |
pfc.my_pfc_ports.xoff_size | 在端口组列表中的接口集发送 PFC 暂停帧之前,交换机必须消耗的保留缓冲区量。 以下示例在消耗 10000 字节的保留缓冲区后发送 PFC 暂停帧 pfc.my_pfc_ports.xoff_size = 10000 |
pfc.my_pfc_ports.xon_delta | 缓冲区消耗必须降至 xoff 阈值以下的字节数,然后 PFC 暂停帧才会停止发送。以下示例缓冲区拥塞必须减少 2000 字节(降至 8000 字节)后,PFC 暂停帧才会停止 pfc.my_pfc_ports.xon_delta = 2000 |
pfc.my_pfc_ports.rx_enable | 启用 (true ) 或禁用 (false ) 发送 PFC 暂停帧。默认值为 true 。以下示例启用发送 PFC 暂停帧 pfc.my_pfc_ports.tx_enable = true |
pfc.my_pfc_ports.tx_enable | 启用 (true ) 或禁用 (false ) 接收 PFC 暂停帧。您不需要为 rx_enable 定义 COS 值。交换机接收任何 COS 值。默认值为 true 。以下示例启用接收 PFC 暂停帧 pfc.my_pfc_ports.rx_enable = true |
pfc.my_pfc_ports.cable_length | 端口组列表中连接到端口的电缆长度,以米为单位。Cumulus Linux 在内部使用此值来确定生成 PFC 暂停帧和接收 PFC 暂停帧之间的延迟。默认值为 10 米在此示例中,电缆为 5 米pfc.my_pfc_ports.cable_length = 5 |
ECN
您可以创建 ECN 配置文件并将它们分配给不同的端口。
以下示例为出口队列(traffic-class
)1 和 2 创建一个名为 my-red-profile
的自定义 ECN 配置文件。这些命令将最小缓冲区阈值设置为 40000 字节,最大缓冲区阈值设置为 200000 字节,并将概率设置为 10。这些命令还启用 RED 并将 ECN 配置文件应用于 swp1 和 swp2。
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 1,2 min-threshold-bytes 40000
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 1,2 max-threshold-bytes 200000
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 1,2 probability 10
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 1,2 red enable
cumulus@switch:~$ nv set interface swp1,swp2 qos congestion-control my-red-profile
cumulus@switch:~$ nv config apply
您可以为自定义配置文件中的不同流量类别配置不同的阈值和概率值
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 1,2 min-threshold-bytes 40000
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 1,2 max-threshold-bytes 200000
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 1,2 probability 10
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 1,2 red enable
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 4 min-threshold-bytes 30000
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 4 max-threshold-bytes 150000
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 4 probability 80
cumulus@switch:~$ nv set interface swp1,swp2 qos congestion-control my-red-profile
cumulus@switch:~$ nv config apply
您可以禁用 ECN 配置文件的 ECN 位标记。以下示例禁用 my-red-profile
配置文件中的 ECN 位标记
cumulus@switch:~$ nv set qos congestion-control my-red-profile traffic-class 1 ecn disable
cumulus@switch:~$ nv config apply
编辑 /etc/cumulus/datapath/qos/qos_features.conf
文件的 Explicit Congestion Notification
部分。
以下示例为出口队列 1 和 2 创建一个名为 my-red-profile
的自定义 ECN 配置文件,最小缓冲区阈值为 40000 字节,最大缓冲区阈值为 200000 字节,概率为 10。这些命令还启用 RED 并将 ECN 配置文件应用于 swp1 和 swp2。
ecn_red.port_group_list = [my-red-profile]
my-red-profile.egress_queue_list = [1,2]
my-red-profile.port_set = swp1,swp2
my-red-profile.ecn_enable = true
my-red-profile.red_enable = true
my-red-profile.min_threshold_bytes = 40000
my-red-profile.max_threshold_bytes = 200000
my-red-profile.probability = 10
要禁用 ECN 位标记,请将 ecn_enable
设置为 false。以下示例禁用 my-red-profile
中的 ECN 位标记。
...
my-red-profile.ecn_enable = false
...
流量池
Cumulus Linux 支持调整以下流量池
流量池 | 描述 |
---|---|
default-lossy | 所有交换机优先级的默认流量池。 |
default-lossless | 当您启用流控制时,用于无损流量的流量池。 |
mc-lossy | 用于组播流量的流量池。 |
roce-lossy | 用于 RoCE 有损模式的流量池。 |
roce-lossless | 用于 RoCE 无损模式的流量池。 |
您一次只能在交换机上配置一个无损池。当您使用 RoCE 时,配置
roce-lossless
池,否则配置default-lossless
池。您可以同时配置多个有损池。
您可以通过关联交换机优先级并定义分配给池的缓冲区内存百分比来配置流量池。以下示例关联了交换机优先级 2,并为 mc-lossy
池分配了 30% 的内存百分比
cumulus@switch:~$ nv set qos traffic-pool default-lossy switch-priority 0,1,3,4,5,6,7
cumulus@switch:~$ nv set qos traffic-pool default-lossy memory-percent 70
cumulus@switch:~$ nv set qos traffic-pool mc-lossy switch-priority 2
cumulus@switch:~$ nv set qos traffic-pool mc-lossy memory-percent 30
cumulus@switch:~$ nv config apply
在 /etc/mlx/datapath/qos/qos_infra.conf
文件中配置以下设置
traffic.priority_group_list = [service2,bulk]
priority_group.service2.cos_list = [2]
priority_group.bulk.cos_list = [0,1,3,4,5,6,7]
priority_group.service2.id = 2
priority_group.service2.service_pool = 2
ingress_service_pool.2.percent = 30
ingress_service_pool.0.percent = 70
port.service_pool.2.ingress_buffer.reserved = 10240
ingress_service_pool.2.mode = 1
port.service_pool.2.ingress_buffer.dynamic_quota = ALPHA_8
priority_group.service2.ingress_buffer.dynamic_quota = ALPHA_8
egress_buffer.egr_queue_2.uc.service_pool = 2
egress_service_pool.2.percent = 30
egress_service_pool.0.percent = 70
port.service_pool.2.egress_buffer.uc.reserved = 0
egress_buffer.cos_2.mc.service_pool = 2
egress_buffer.egr_queue_2.uc.reserved = 1024
port.egress_buffer.mc.reserved = 10240
port.egress_buffer.mc.shared_size = 2097152
egress_service_pool.2.mode = 1
port.service_pool.2.egress_buffer.uc.dynamic_quota = ALPHA_8
egress_buffer.egr_queue_2.uc.dynamic_quota = ALPHA_8
egress_buffer.cos_2.mc.dynamic_quota = ALPHA_8
有关其他 default-lossless
和 RoCE 池示例,请参阅 流控制缓冲区 和 RoCE。您可以使用 nv show qos traffic-pool <pool name>
命令查看流量池配置
cumulus@switch:~$ nv show qos traffic-pool default-lossy
applied
----------------- -------
memory-percent 80
[switch-priority] 0
[switch-priority] 1
[switch-priority] 2
[switch-priority] 3
[switch-priority] 4
[switch-priority] 5
[switch-priority] 6
[switch-priority] 7
高级缓冲区调优
除了支持的 流量池 配置之外,您还可以使用 NVUE 命令来调优高级缓冲区属性。高级缓冲区配置可以覆盖系统上配置的基本流量池配置文件。
您只能为 default-global
配置文件配置高级缓冲区设置。
缓冲区区域
您可以使用以下 NVUE 命令调整高级缓冲区设置
nv set qos advance-buffer-config default-global <buffer> <priority-group | property> <value>
您可以调整以下支持的缓冲区区域和属性的设置
缓冲区 | 支持的属性值 |
---|---|
ingress-lossy-buffer |
bulk 和 service[1-7] 优先级组的以下属性name - 优先级组别名。reserved - 以字节为单位的预留缓冲区分配。service-pool - 服务池映射。shared-alpha - 动态共享缓冲区 alpha 分配。shared-bytes - 以字节为单位的静态共享缓冲区分配。switch-priority - 交换机优先级值。 |
egress-lossless-buffer | reserved - 以字节为单位的预留缓冲区分配。service-pool - 服务池映射。shared-alpha - 动态共享缓冲区 alpha 分配。shared-bytes - 以字节为单位的静态共享缓冲区分配。 |
ingress-lossless-buffer | service-pool - 服务池映射。shared-alpha - 动态共享缓冲区 alpha 分配。shared-bytes - 以字节为单位的静态共享缓冲区分配。 |
egress-lossy-buffer | multicast-port - 以字节为单位的多播端口 reserved 或 shared-bytes 分配。multicast-switch-priority [0-7] - 为每个多播交换机优先级设置 reserved 、service-pool 、shared-alpha 或 shared-bytes 属性。traffic-class [0-15] - 为每个流量类别设置 reserved 、service-pool 、shared-alpha 或 shared-bytes 属性。 |
为映射到静态服务池的缓冲区区域配置 shared-bytes
,为映射到动态服务池的缓冲区区域配置 shared-alpha
。
共享缓冲区 alpha 值确定跨缓冲区区域分配的可用共享内存的比例。具有较高 alpha 值的区域接收较高比例的可用共享缓冲区内存。以下示例在使用 RoCE 无损模式时将 ingress-lossless-buffer
共享 alpha 值更改为 alpha_2
cumulus@switch:~$ nv set qos advance-buffer-config default-global ingress-lossless-buffer shared-alpha alpha_2
cumulus@switch:~$ nv config apply
服务池
您可以使用以下 NVUE 命令配置入口和出口服务池配置文件属性
nv set qos advance-buffer-config default-global ingress-service-pool <pool-id> <property> <value>
nv set qos advance-buffer-config default-global egress-service-pool <pool-id> <property> <value>
您可以调整每个池的以下属性
属性 | 描述 |
---|---|
infinite | 池无限标志。 |
memory-percent | 池内存百分比分配。 |
mode | 池模式:静态或动态。 |
reserved | 以字节为单位的预留缓冲区分配。 |
shared-alpha | 动态共享缓冲区 alpha 分配。 |
shared-bytes | 静态共享缓冲区分配(以字节为单位)。 |
默认流量池和高级缓冲区配置设置之间存在关系。
配置高级缓冲区设置时请谨慎。如果您尝试应用不兼容的流量池和高级缓冲区配置,NVUE 会发出警告。NVUE 在应用高级缓冲区配置之前执行以下验证检查
- 您必须将所有交换机优先级 (0-7) 映射到一个优先级组。您可以将多个交换机优先级映射到同一个优先级组。
- 所有入口池的
memory-percent
值之和必须小于或等于 100%。 - 所有出口池的
memory-percent
值之和必须小于或等于 100%。
请参考下表查看默认流量池和高级缓冲区属性之间的映射关系
默认流量池 | 默认流量池属性 | 高级缓冲区区域或服务池 | 高级缓冲区属性 |
---|---|---|---|
default-lossy | memory-percent | ingress-service-pool 0 egress-service-pool 0 | memory-percent |
default-lossy | switch-priority | ingress-lossy-buffer | priority-group bulk switch-priority |
default-lossless | memory-percent | ingress-service-pool 1 egress-service-pool 1 | memory-percent |
roce-lossless | memory-percent | ingress-service-pool 1 egress-service-pool 1 | memory-percent |
mc-lossy | memory-percent | ingress-service-pool 2 egress-service-pool 2 | memory-percent |
mc-lossy | switch-priority | ingress-lossy-buffer | priority-group service2 switch-priority |
例如,要为新的静态服务池分配 20% 的内存,您必须允许默认流量池提供 20% 的内存。以下命令将 default-lossy
流量池减少到 80% 内存,允许您将内存分配给 ingress-service-pool 3
cumulus@switch:~$ nv set qos traffic-pool default-lossy memory-percent 80
cumulus@switch:~$ nv set qos advance-buffer-config default-global ingress-service-pool 3 memory-percent 20
cumulus@switch:~$ nv config apply
您可以使用 nv show qos advance-buffer-config default-global <buffer/pool name>
命令查看高级缓冲区配置
cumulus@switch:~$ nv show qos advance-buffer-config default-global ingress-service-pool
Pool-Id infinite memory-percent mode reserved shared-alpha shared-bytes
------- -------- -------------- ------- -------- ------------ ------------
0 80 dynamic
3 20
有损 Headroom
有损 headroom 是存储等待交换机处理的数据包的缓冲区。如果预期处理延迟比正常时间长(例如,如果有多个 ACL 规则),请增加有损 headroom。
要更改优先级组的有损 headroom,请运行以下命令。交换机根据 MTU 和内部延迟在内部计算默认值。
运行 nv set qos advance-buffer-config default-global ingress-lossy-buffer priority-group <priority-group> headroom <bytes>
命令,其中 <priority-group>
是 bulk
或 service1
到 service7
。
以下示例将优先级组 service1
的有损 headroom 配置为 50000 字节
cumulus@switch:~$ nv set qos advance-buffer-config default-global ingress-lossy-buffer priority-group service1 headroom 50000
cumulus@switch:~$ nv config apply
要取消设置优先级组的有损 headroom,请运行 nv unset qos advance-buffer-config default-global ingress-lossy-buffer priority-group <priority-group> headroom
命令。
编辑 /etc/mlx/datapath/qos/qos_infra.conf
文件以调整 priority_group.<priority-group>.ingress_buffer.lossy_headroom
参数。<priority-group>
可以是 bulk
或 service1
到 service7
。
以下示例将优先级组 service1
的有损 headroom 配置为 50000 字节
cumulus@switch:~$ sudo nano /etc/mlx/datapath/qos/qos_infra.conf
...
priority_group.service1.ingress_buffer.lossy_headroom = 50000
要取消设置优先级组的有损 headroom,请注释掉 priority_group.<priority-group>.ingress_buffer.lossy_headroom
参数。
入口和出口管理缓冲区
管理流量由 OSPF 和 BGP hello 和更新数据包以及进出 CPU 的 BFD 数据包组成。
要配置入口管理缓冲区
运行 nv set qos advance-buffer-config default-global ingress-mgmt-buffer <option> <value>
命令。您可以调整以下选项
选项 | 描述 |
---|---|
headroom | 以字节为单位的入口管理缓冲区 headroom 分配。 |
reserved | 入口管理预留缓冲区分配(以字节为单位)。 |
service-pool | 入口管理缓冲区服务池映射。您可以指定介于 0 和 7 之间的值。 |
shared-alpha | 动态入口管理共享缓冲区 alpha 分配。您可以指定以下值之一:alpha_0 、alpha_1_128 、alpha_1_64 、alpha_1_32 、alpha_1_16 、alpha_1_8 、alpha_1_4 、alpha_1_2 、alpha_1 、alpha_2 、alpha_4 、alpha_8 、alpha_16 、alpha_32 、alpha_64 或 alpha_infinity 。 |
shared-bytes | 静态入口管理共享缓冲区分配(以字节为单位)。 |
如果入口管理缓冲区映射到的 service-pool
是动态的,请使用 shared-alpha
值。如果映射的 service-pool
是静态的,请使用 shared-bytes
值。
以下示例将入口管理缓冲区 headroom 配置为 20000 字节
cumulus@switch:~$ nv set qos advance-buffer-config default-global ingress-mgmt-buffer headroom 20000
cumulus@switch:~$ nv config apply
以下示例将入口管理预留缓冲区分配配置为 45000 字节
cumulus@switch:~$ nv set qos advance-buffer-config default-global ingress-mgmt-buffer reserved 45000
cumulus@switch:~$ nv config apply
以下示例将入口管理缓冲区服务池映射配置为 0
cumulus@switch:~$ nv set qos advance-buffer-config default-global ingress-mgmt-buffer service-pool 0
cumulus@switch:~$ nv config apply
以下示例将静态共享入口管理缓冲区配置为 14000 字节
cumulus@switch:~$ nv set qos advance-buffer-config default-global ingress-mgmt-buffer shared-bytes 14000
cumulus@switch:~$ nv config apply
以下示例将动态共享入口管理缓冲区 alpha 分配配置为 alpha_2
cumulus@switch:~$ nv set qos advance-buffer-config default-global ingress-mgmt-buffer shared-alpha alpha_2
cumulus@switch:~$ nv config apply
要取消设置入口管理缓冲区设置,请运行 nv unset qos advance-buffer-config default-global ingress-mgmt-buffer <option>
命令;例如,
cumulus@switch:~$ nv unset qos advance-buffer-config default-global ingress-mgmt-buffer reserved
cumulus@switch:~$ nv config apply
编辑 /etc/mlx/datapath/qos/qos_infra.conf
文件以添加以下参数。
参数 | 描述 |
---|---|
management.ingress_service_pool | 入口管理缓冲区服务池映射。您可以指定介于 0 和 7 之间的值。 |
management.ingress_buffer.lossy_headroom | 以字节为单位的入口管理缓冲区 headroom 分配。 |
management.ingress_buffer.reserved | 入口管理预留缓冲区分配(以字节为单位)。 |
management.ingress_buffer.shared-size | 静态入口管理共享缓冲区分配(以字节为单位)。您可以指定介于 0 和 4294967295 之间的值。 |
management.ingress_buffer.dynamic_quota | 动态入口管理共享缓冲区 alpha 分配。您可以指定以下值之一:alpha_0 、alpha_1_128 、alpha_1_64 、alpha_1_32 、alpha_1_16 、alpha_1_8 、alpha_1_4 、alpha_1_2 、alpha_1 、alpha_2 、alpha_4 、alpha_8 、alpha_16 、alpha_32 、alpha_64 或 alpha_infinity 。 |
如果入口管理缓冲区映射到的 service-pool
是动态的,请使用 shared-alpha
值。如果映射的 service-pool
是静态的,请使用 shared-bytes
值。
cumulus@switch:~$ sudo nano /etc/mlx/datapath/qos/qos_infra.conf
...
# all priority groups share a service pool on Spectrum
management.ingress_service_pool = 0
...
# priority group minimum buffer allocation: size in bytes
# priority group shared buffer allocation: shared buffer size in bytes
# if a priority group has no packet priority values assigned to it, the buffers will not be allocated
...
management.ingress_buffer.reserved = 45000
management.ingress_buffer.shared_size = 14000
management.ingress_buffer.lossy_headroom = 20000
...
# Ingress buffer per-PG dynamic buffering alpha (Default: ALPHA_8)
...
management.ingress_buffer.dynamic_quota = alpha_2
要取消设置入口管理缓冲区设置,请删除或注释掉 management.ingress_service_pool
或 management.ingress_buffer
参数。
要配置出口管理缓冲区
运行 nv set qos advance-buffer-config default-global egress-mgmt-buffer <option> <value>
命令。您可以调整以下选项
选项 | 描述 |
---|---|
reserved | 出口管理预留缓冲区分配(以字节为单位)。 |
service-pool | 出口管理缓冲区服务池映射。您可以指定介于 0 和 7 之间的值。 |
shared-alpha | 动态出口管理共享缓冲区 alpha 分配。您可以指定以下值之一:alpha_0 、alpha_1_128 、alpha_1_64 、alpha_1_32 、alpha_1_16 、alpha_1_8 、alpha_1_4 、alpha_1_2 、alpha_1 、alpha_2 、alpha_4 、alpha_8 、alpha_16 、alpha_32 、alpha_64 或 alpha_infinity 。 |
shared-bytes | 静态出口管理共享缓冲区分配(以字节为单位)。您可以指定介于 0 和 4294967295 之间的值。 |
如果出口管理缓冲区映射到的 service-pool
是动态的,请使用 shared-alpha
值。如果映射的 service-pool
是静态的,请使用 shared-bytes
值。
以下示例将出口管理预留缓冲区配置为 30000 字节
cumulus@switch:~$ nv set qos advance-buffer-config default-global egress-mgmt-buffer reserved 30000
cumulus@switch:~$ nv config apply
以下示例将出口管理缓冲区服务池映射配置为 0
cumulus@switch:~$ nv set qos advance-buffer-config default-global egress-mgmt-buffer service-pool 0
cumulus@switch:~$ nv config apply
以下示例将动态出口管理共享缓冲区 alpha 分配配置为 alpha_2
cumulus@switch:~$ nv set qos advance-buffer-config default-global egress-mgmt-buffer shared-alpha alpha_2
cumulus@switch:~$ nv config apply
以下示例将静态出口管理共享缓冲区配置为 20000 字节
cumulus@switch:~$ nv set qos advance-buffer-config default-global egress-mgmt-buffer shared-bytes 20000
cumulus@switch:~$ nv config apply
要取消设置出口管理缓冲区设置,请运行 nv unset qos advance-buffer-config default-global egress-mgmt-buffer <option>
命令;例如,
cumulus@switch:~$ nv unset qos advance-buffer-config default-global egress-mgmt-buffer reserved
cumulus@switch:~$ nv config apply
编辑 /etc/mlx/datapath/qos/qos_infra.conf
文件以添加以下参数。
参数 | 描述 |
---|---|
management.egress_service_pool | 出口管理缓冲区服务池映射。您可以指定介于 0 和 7 之间的值。 |
management.egress_buffer.reserved | 出口管理预留缓冲区分配(以字节为单位)。 |
management.egress_buffer.shared-alpha | 动态出口管理共享缓冲区 alpha 分配。您可以指定以下值之一:alpha_0 、alpha_1_128 、alpha_1_64 、alpha_1_32 、alpha_1_16 、alpha_1_8 、alpha_1_4 、alpha_1_2 、alpha_1 、alpha_2 、alpha_4 、alpha_8 、alpha_16 、alpha_32 、alpha_64 或 alpha_infinity 。 |
management.egress_buffer.shared-size | 静态出口管理共享缓冲区分配(以字节为单位)。 |
如果出口管理缓冲区映射到的 service-pool
是动态的,请使用 shared-alpha
值。如果映射的 service-pool
是静态的,请使用 shared-bytes
值。
cumulus@switch:~$ sudo nano /etc/mlx/datapath/qos/qos_infra.conf
...
# service pool assigned for egress queues
management.egress_service_pool = 0
...
# Shared buffer allocation for ePort.TC region : size in bytes.
...
management.egress_buffer.shared_size = 20000
...
# Minimum buffer allocation for ePort.TC region: size in bytes
...
management.egress_buffer.reserved = 30000
...
# Egress buffer per-egress-queue dynamic buffering quota (alpha) for multicast (Default: ALPHA_INFINITY)
...
management.egress_buffer.dynamic_quota = alpha_2
要取消设置出口管理缓冲区设置,请删除或注释掉 management.egress_service_pool
或 management.egress_buffer
参数。
要显示入口管理缓冲区配置,请运行 nv show qos advance-buffer-config default-global ingress-mgmt-buffer
命令
cumulus@switch:~$ nv show qos advance-buffer-config default-global ingress-mgmt-buffer
operational applied
------------ ----------- ----
headroom 30000 Bytes 30000 Bytes
shared-bytes 19.53 KB 19.53 KB
要显示出口管理缓冲区配置,请运行 nv show qos advance-buffer-config default-global egress-mgmt-buffer
命令
cumulus@switch:~$ nv show qos advance-buffer-config default-global egress-mgmt-buffer
operational applied
------------ ----------- ----
reserved 1200 Bytes 1200 Bytes
shared-bytes 13.53 KB 13.53 KB
语法检查器
Cumulus Linux 为 qos_features.conf
和 qos_infra.conf
文件提供了一个语法检查器,以检查错误,例如缺少参数或参数标签和值无效。
语法检查器在每次 switchd reload
时自动运行。
您可以从命令行使用 cl-consistency-check --datapath-syntax-check
命令手动运行语法检查器。如果存在错误,默认情况下它们会写入 stderr
。如果您使用 -q
运行命令,错误将写入 /var/log/switchd.log
文件。
cl-consistency-check --datapath-syntax-check
命令接受以下选项
选项 | 描述 |
---|---|
-h | 显示此命令选项列表。 |
-q | 以静默模式运行命令。错误将写入 /var/log/switchd.log 文件,而不是 stderr 。 |
-qi | 针对指定的 qos_infra.conf 文件运行语法检查器。 |
-qf | 针对指定的 qos_features.conf 文件运行语法检查器。 |
默认情况下,语法检查器假定
qos_infra.conf
位于/etc/mlx/datapath/qos/qos_infra.conf
中qos_features.conf
位于/etc/cumulus/datapath/qos/qos_features.conf
中
您可以在 switchd
运行或停止时运行语法检查器。
显示 Qos 计数器
NVUE 提供以下命令来显示接口的 QoS 统计信息
NVUE 命令 | 描述 |
---|---|
nv show interface <interface> counters qos | 显示特定接口的所有 QoS 统计信息。 |
nv show interface <interface> counters qos egress-queue-stats | 显示特定接口的 QoS 出口队列统计信息。 |
nv show interface <interface> counters qos ingress-buffer-stats | 显示特定接口的 QoS 入口缓冲区统计信息。 |
nv show interface <interface> counters qos pfc-stats | 显示特定接口的 QoS PFC 统计信息。 |
nv show interface <interface> counters qos port-stats | 显示特定接口的 QoS 端口统计信息。 |
以下示例显示 swp1 的所有 QoS 统计信息
cumulus@switch:~$ nv show interface swp1 counters qos
Ingress Buffer Statistics
============================
priority-group rx-frames rx-buffer-discards rx-shared-buffer-discards
-------------- --------- ------------------ -------------------------
0 0 0 Bytes 0 Bytes
1 0 0 Bytes 0 Bytes
2 0 0 Bytes 0 Bytes
3 0 0 Bytes 0 Bytes
4 0 0 Bytes 0 Bytes
5 0 0 Bytes 0 Bytes
6 0 0 Bytes 0 Bytes
7 0 0 Bytes 0 Bytes
Egress Queue Statistics
==========================
traffic-class tx-frames tx-bytes tx-uc-buffer-discards wred-discards
------------- --------- -------- --------------------- -------------
0 0 0 Bytes 0 Bytes 0
1 0 0 Bytes 0 Bytes 0
2 0 0 Bytes 0 Bytes 0
3 0 0 Bytes 0 Bytes 0
4 0 0 Bytes 0 Bytes 0
5 0 0 Bytes 0 Bytes 0
6 0 0 Bytes 0 Bytes 0
7 0 0 Bytes 0 Bytes 0
PFC Statistics
=================
switch-priority rx-pause-frames rx-pause-duration tx-pause-frames tx-pause-duration
--------------- --------------- ----------------- --------------- -----------------
0 0 0 0 0
1 0 0 0 0
2 0 0 0 0
3 0 0 0 0
4 0 0 0 0
5 0 0 0 0
6 0 0 0 0
7 0 0 0 0
Qos Port Statistics
======================
Counter Receive Transmit
------------------ ------- --------
ecn-marked-packets n/a 0
mc-buffer-discards n/a 0
pause-frames 0 0
...
清除 QoS 缓冲区
- 要清除 Qos 池缓冲区,请运行
nv action clear qos buffer pool
命令。 - 要清除 QoS 多播交换机优先级缓冲区,请运行
nv action clear qos buffer multicast-switch-priority
命令。 - 要清除接口上的 Qos 缓冲区,请运行
nv action clear interface <interface> qos buffer
命令。
cumulus@switch:~$ nv action clear qos buffer pool
QoS pool buffers cleared.
Action succeeded
cumulus@switch:~$ nv action clear qos buffer multicast-switch-priority
QoS multicast buffers cleared.
Action succeeded
cumulus@switch:~$ nv action clear interface swp1 qos buffer
QoS buffers cleared on swp1.
Action succeeded
默认配置文件
qos_features.conf
# /etc/cumulus/datapath/qos/qos_features.conf
#
# Copyright © 2021 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
#
# This software product is a proprietary product of Nvidia Corporation and its affiliates
# (the "Company") and all right, title, and interest in and to the software
# product, including all associated intellectual property rights, are and
# shall remain exclusively with the Company.
#
# This software product is governed by the End User License Agreement
# provided with the software product.
# packet header field used to determine the packet priority level
# fields include {802.1p, dscp, port}
traffic.packet_priority_source_set = [802.1p]
traffic.port_default_priority = 0
# packet priority source values assigned to each internal cos value
# internal cos values {cos_0..cos_7}
# (internal cos 3 has been reserved for CPU-generated traffic)
# 802.1p values = {0..7}
traffic.cos_0.priority_source.8021p = [0]
traffic.cos_1.priority_source.8021p = [1]
traffic.cos_2.priority_source.8021p = [2]
traffic.cos_3.priority_source.8021p = [3]
traffic.cos_4.priority_source.8021p = [4]
traffic.cos_5.priority_source.8021p = [5]
traffic.cos_6.priority_source.8021p = [6]
traffic.cos_7.priority_source.8021p = [7]
# dscp values = {0..63}
#traffic.cos_0.priority_source.dscp = [0,1,2,3,4,5,6,7]
#traffic.cos_1.priority_source.dscp = [8,9,10,11,12,13,14,15]
#traffic.cos_2.priority_source.dscp = [16,17,18,19,20,21,22,23]
#traffic.cos_3.priority_source.dscp = [24,25,26,27,28,29,30,31]
#traffic.cos_4.priority_source.dscp = [32,33,34,35,36,37,38,39]
#traffic.cos_5.priority_source.dscp = [40,41,42,43,44,45,46,47]
#traffic.cos_6.priority_source.dscp = [48,49,50,51,52,53,54,55]
#traffic.cos_7.priority_source.dscp = [56,57,58,59,60,61,62,63]
# remark packet priority value
# fields include {802.1p, dscp}
traffic.packet_priority_remark_set = []
# packet priority remark values assigned from each internal cos value
# internal cos values {cos_0..cos_7}
# (internal cos 3 has been reserved for CPU-generated traffic)
# 802.1p values = {0..7}
#traffic.cos_0.priority_remark.8021p = [0]
#traffic.cos_1.priority_remark.8021p = [1]
#traffic.cos_2.priority_remark.8021p = [2]
#traffic.cos_3.priority_remark.8021p = [3]
#traffic.cos_4.priority_remark.8021p = [4]
#traffic.cos_5.priority_remark.8021p = [5]
#traffic.cos_6.priority_remark.8021p = [6]
#traffic.cos_7.priority_remark.8021p = [7]
# dscp values = {0..63}
#traffic.cos_0.priority_remark.dscp = [0]
#traffic.cos_1.priority_remark.dscp = [8]
#traffic.cos_2.priority_remark.dscp = [16]
#traffic.cos_3.priority_remark.dscp = [24]
#traffic.cos_4.priority_remark.dscp = [32]
#traffic.cos_5.priority_remark.dscp = [40]
#traffic.cos_6.priority_remark.dscp = [48]
#traffic.cos_7.priority_remark.dscp = [56]
# source.port_group_list = [source_port_group]
# source.source_port_group.packet_priority_source_set = [dscp]
# source.source_port_group.port_set = swp1-swp4,swp6
# source.source_port_group.port_default_priority = 0
# source.source_port_group.cos_0.priority_source.dscp = [0,1,2,3,4,5,6,7]
# source.source_port_group.cos_1.priority_source.dscp = [8,9,10,11,12,13,14,15]
# source.source_port_group.cos_2.priority_source.dscp = [16,17,18,19,20,21,22,23]
# source.source_port_group.cos_3.priority_source.dscp = [24,25,26,27,28,29,30,31]
# source.source_port_group.cos_4.priority_source.dscp = [32,33,34,35,36,37,38,39]
# source.source_port_group.cos_5.priority_source.dscp = [40,41,42,43,44,45,46,47]
# source.source_port_group.cos_6.priority_source.dscp = [48,49,50,51,52,53,54,55]
# source.source_port_group.cos_7.priority_source.dscp = [56,57,58,59,60,61,62,63]
# remark.port_group_list = [remark_port_group]
# remark.remark_port_group.packet_priority_remark_set = [dscp]
# remark.remark_port_group.port_set = swp1-swp4,swp6
# remark.remark_port_group.cos_0.priority_remark.dscp = [0]
# remark.remark_port_group.cos_1.priority_remark.dscp = [8]
# remark.remark_port_group.cos_2.priority_remark.dscp = [16]
# remark.remark_port_group.cos_3.priority_remark.dscp = [24]
# remark.remark_port_group.cos_4.priority_remark.dscp = [32]
# remark.remark_port_group.cos_5.priority_remark.dscp = [40]
# remark.remark_port_group.cos_6.priority_remark.dscp = [48]
# remark.remark_port_group.cos_7.priority_remark.dscp = [56]
# to configure priority flow control on a group of ports:
# -- assign cos value(s) to the cos list
# -- add or replace a port group names in the port group list
# -- for each port group in the list
# -- populate the port set, e.g.
# swp1-swp4,swp8,swp50s0-swp50s3
# -- set a PFC buffer size in bytes for each port in the group
# -- set the xoff byte limit (buffer limit that triggers PFC frames transmit to start)
# -- set the xon byte delta (buffer limit that triggers PFC frames transmit to stop)
# -- enable PFC frame transmit and/or PFC frame receive
# priority flow control
#pfc.port_group_list = [pfc_port_group]
#pfc.pfc_port_group.cos_list = []
#pfc.pfc_port_group.port_set = swp1-swp4,swp6
#pfc.pfc_port_group.port_buffer_bytes = 25000
#pfc.pfc_port_group.xoff_size = 10000
#pfc.pfc_port_group.xon_delta = 2000
#pfc.pfc_port_group.tx_enable = true
#pfc.pfc_port_group.rx_enable = true
#Specify cable length in mts
#pfc.pfc_port_group.cable_length = 10
# to configure pause on a group of ports:
# -- add or replace port group names in the port group list
# -- for each port group in the list
# -- populate the port set, e.g.
# swp1-swp4,swp8,swp50s0-swp50s3
# -- set a pause buffer size in bytes for each port
# -- set the xoff byte limit (buffer limit that triggers pause frames transmit to start)
# -- set the xon byte delta (buffer limit that triggers pause frames transmit to stop)
# -- enable pause frame transmit and/or pause frame receive
# link pause
# link_pause.port_group_list = [pause_port_group]
# link_pause.pause_port_group.port_set = swp1-swp4,swp6
# link_pause.pause_port_group.port_buffer_bytes = 25000
# link_pause.pause_port_group.xoff_size = 10000
# link_pause.pause_port_group.xon_delta = 2000
# link_pause.pause_port_group.rx_enable = true
# link_pause.pause_port_group.tx_enable = true
# Specify cable length in mts
# link_pause.pause_port_group.cable_length = 10
# Explicit Congestion Notification
# to configure ECN and RED on a group of ports:
# -- add or replace port group names in the port group list
# -- assign cos value(s) to the cos list
# -- for each port group in the list
# -- populate the port set, e.g.
# swp1-swp4,swp8,swp50s0-swp50s3
# -- to enable RED requires the latest traffic.conf
#Default ECN configuration on TC0
default_ecn_red_conf.egress_queue_list = [0]
default_ecn_red_conf.ecn_enable = true
default_ecn_red_conf.red_enable = false
default_ecn_red_conf.min_threshold_bytes = 150000
default_ecn_red_conf.max_threshold_bytes = 1500000
default_ecn_red_conf.probability = 100
#ecn_red.port_group_list = [ecn_red_port_group]
#ecn_red.ecn_red_port_group.egress_queue_list = [1]
#ecn_red.ecn_red_port_group.port_set = allports
#ecn_red.ecn_red_port_group.ecn_enable = true
#ecn_red.ecn_red_port_group.red_enable = false
#ecn_red.ecn_red_port_group.min_threshold_bytes = 40000
#ecn_red.ecn_red_port_group.max_threshold_bytes = 200000
#ecn_red.ecn_red_port_group.probability = 100
# Hierarchical traffic shaping
# to configure shaping at 2 levels:
# - per egress queue egr_queue_0 - egr_queue_7
# - port level aggregate
# -- add or replace a port group names in the port group list
# -- for each port group in the list
# -- populate the port set, e.g.
# swp1-swp4,swp8,swp50s0-swp50s3
# -- set min and max rates in kbps for each egr_queue [min, max]
# -- set max rate in kbps at port level
# shaping.port_group_list = [shaper_port_group]
# shaping.shaper_port_group.port_set = swp1-swp3,swp5,swp7s0-swp7s3
# shaping.shaper_port_group.egr_queue_0.shaper = [50000, 100000]
# shaping.shaper_port_group.egr_queue_1.shaper = [51000, 150000]
# shaping.shaper_port_group.egr_queue_2.shaper = [52000, 200000]
# shaping.shaper_port_group.egr_queue_3.shaper = [53000, 250000]
# shaping.shaper_port_group.egr_queue_4.shaper = [54000, 300000]
# shaping.shaper_port_group.egr_queue_5.shaper = [55000, 350000]
# shaping.shaper_port_group.egr_queue_6.shaper = [56000, 400000]
# shaping.shaper_port_group.egr_queue_7.shaper = [57000, 450000]
# shaping.shaper_port_group.port.shaper = 900000
# default egress scheduling weight per egress queue
# To be applied to all the ports if port_group profile not configured
# If you do not specify any bw_percent of egress_queues, those egress queues
# will assume DWRR weight 0 - no egress scheduling for those queues
# '0' indicates strict priority
default_egress_sched.egr_queue_0.bw_percent = 12
default_egress_sched.egr_queue_1.bw_percent = 13
default_egress_sched.egr_queue_2.bw_percent = 12
default_egress_sched.egr_queue_3.bw_percent = 13
default_egress_sched.egr_queue_4.bw_percent = 12
default_egress_sched.egr_queue_5.bw_percent = 13
default_egress_sched.egr_queue_6.bw_percent = 12
default_egress_sched.egr_queue_7.bw_percent = 13
# port_group profile for egress scheduling weight per egress queue
# If you do not specify any bw_percent of egress_queues, those egress queues
# will assume DWRR weight 0 - no egress scheduling for those queues
# '0' indicates strict priority
#egress_sched.port_group_list = [sched_port_group1]
#egress_sched.sched_port_group1.port_set = swp2
#egress_sched.sched_port_group1.egr_queue_0.bw_percent = 10
#egress_sched.sched_port_group1.egr_queue_1.bw_percent = 20
#egress_sched.sched_port_group1.egr_queue_2.bw_percent = 30
#egress_sched.sched_port_group1.egr_queue_3.bw_percent = 10
#egress_sched.sched_port_group1.egr_queue_4.bw_percent = 10
#egress_sched.sched_port_group1.egr_queue_5.bw_percent = 10
#egress_sched.sched_port_group1.egr_queue_6.bw_percent = 10
#egress_sched.sched_port_group1.egr_queue_7.bw_percent = 0
# PFC Watchdog Configuration
# Add the port to the port_group_list where you want to enable PFC Watchdog
# It will enable PFC Watchdog on all the traffic-class corresponding to
# the lossless switch-priority configured on the port.
#pfc_watchdog.port_group_list = [pfc_wd_port_group]
#pfc_watchdog.pfc_wd_port_group.port_set = swp3
# Cut-through is disabled by default on all chips with the exception of
# Spectrum. On Spectrum cut-through cannot be disabled.
#cut_through_enable = false
qos_infra.conf
#
# Default qos-infra configuration for Mellanox Spectrum chip
#
# Copyright © 2021 NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED.
#
# This software product is a proprietary product of Nvidia Corporation and its affiliates
# (the "Company") and all right, title, and interest in and to the software
# product, including all associated intellectual property rights, are and
# shall remain exclusively with the Company.
#
# This software product is governed by the End User License Agreement
# provided with the software product.
# scheduling algorithm: algorithm values = {dwrr}
scheduling.algorithm = dwrr
# priority groups
# supported group names are control, bulk, service1-6
traffic.priority_group_list = [bulk]
# internal cos values assigned to each priority group
# each cos value should be assigned exactly once
# internal cos values {0..7}
priority_group.bulk.cos_list = [0,1,2,3,4,5,6,7]
# Alias Name defined for each priority group
# Valid string between 0-255 chars
# Sample alias support for naming priority groups
#priority_group.bulk.alias = "Bulk"
# priority group ID assigned to each priority group
#priority_group.control.id = 7
#priority_group.service2.id = 2
priority_group.bulk.id = 0
# all priority groups share a service pool on Spectrum
# service pools assigned to each priority group
priority_group.bulk.service_pool = 0
# service pool assigned for lossless PGs
#flow_control.ingress_service_pool = 0
# --- ingress buffer space allocations ---
# total buffer
# - ingress minimum buffer allocations
# - ingress service pool buffer allocations
# - priority group ingress headroom allocations
# - ingress global headroom allocations
# = total ingress shared buffer size
# ingress service pool buffer allocation: percent of total buffer
# If a service pool has no priority groups, the buffer is added
# to the shared buffer space.
ingress_service_pool.0.percent = 100
# Ingress buffer port.pool buffer : size in bytes
#port.service_pool.0.ingress_buffer.reserved = 10240
#port.service_pool.0.ingress_buffer.shared_size = 9000
#port.management.ingress_buffer.reserved = 0
# priority group minimum buffer allocation: size in bytes
# priority group shared buffer allocation: shared buffer size in bytes
# if a priority group has no packet priority values assigned to it, the buffers will not be allocated
#priority_group.bulk.ingress_buffer.reserved = 0
#priority_group.bulk.ingress_buffer.shared_size = 15
# ---- ingress dynamic buffering settings
# To enable ingress static pool, set the mode to 0
ingress_service_pool.0.mode = 1
# The ALPHA defines the max% of buffers (quota) available on a
# per ingress port OR ipool, Ingress PG, Egress TC, Egress port OR epool.
# ALPHA value equates to the following buffer limit calculated as:
# alpha%(alpha+1) = Max Buffer percentage
# https://community.mellanox.com/s/article/understanding-the-alpha-parameter-in-the-buffer-configuration-of-mellanox-spectrum-switches
# Each shared buffer pool can use a maximum of [total_buffer * (alpha / (alpha+1))]
# Configure quota values mapped to the following alpha values:
# Configuration value = alpha level:
# Both ALPHA_*(string representation) as well as integer values (old representation) will be supported for alpha
# 0/ALPHA_0 = alpha 0
# 1/ALPHA_1_128 = alpha 1/128
# 2/ALPHA_1_64 = alpha 1/64
# 3/ALPHA_1_32 = alpha 1/32
# 4/ALPHA_1_16 = alpha 1/16
# 5/ALPHA_1_8 = alpha 1/8
# 6/ALPHA_1_4 = alpha 1/4
# 7/ALPHA_1_2 = alpha 1/2
# 8/ALPHA_1 = alpha 1
# 9/ALPHA_2 = alpha 2
# 10/ALPHA_4 = alpha 4
# 11/ALPHA_8 = alpha 8
# 12/ALPHA_16 = alpha 16
# 13/ALPHA_32 = alpha 32
# 14/ALPHA_64 = alpha 64
# 15/ALPHA_INFINITY = alpha Infinity
# Ingress buffer per-port dynamic buffering alpha (Default: ALPHA_8)
#port.service_pool.0.ingress_buffer.dynamic_quota = ALPHA_8
#port.management.ingress_buffer.dynamic_quota = ALPHA_8
# Ingress buffer dynamic buffering alpha for lossless PGs (if any; Default: ALPHA_1)
#flow_control.ingress_buffer.dynamic_quota = ALPHA_1
# Ingress buffer per-PG dynamic buffering alpha (Default: ALPHA_8)
#priority_group.bulk.ingress_buffer.dynamic_quota = ALPHA_8
# --- egress buffer space allocations ---
# total egress buffer
# - minimum buffer allocations
# = total service pool buffer size
# service pool assigned for lossless PGs
#flow_control.egress_service_pool = 0
# service pool assigned for egress queues
egress_buffer.egr_queue_0.uc.service_pool = 0
egress_buffer.egr_queue_1.uc.service_pool = 0
egress_buffer.egr_queue_2.uc.service_pool = 0
egress_buffer.egr_queue_3.uc.service_pool = 0
egress_buffer.egr_queue_4.uc.service_pool = 0
egress_buffer.egr_queue_5.uc.service_pool = 0
egress_buffer.egr_queue_6.uc.service_pool = 0
egress_buffer.egr_queue_7.uc.service_pool = 0
# Service pool buffer allocation: percent of total
# buffer size.
egress_service_pool.0.percent = 100
# Egress buffer port.pool buffer : size in bytes
#port.service_pool.0.egress_buffer.uc.reserved = 10240
#port.service_pool.0.egress_buffer.uc.shared_size = 9000
#port.management.egress_buffer.reserved = 0
# Front panel port egress buffer limits enforced for each
# priority group.
# Unlimited egress buffers not supported on Spectrum.
#priority_group.bulk.unlimited_egress_buffer = false
# if a priority group has no cos values assigned to it, the buffers will not be allocated
# Service pool mapping for MC.SP region
egress_buffer.cos_0.mc.service_pool = 0
egress_buffer.cos_1.mc.service_pool = 0
egress_buffer.cos_2.mc.service_pool = 0
egress_buffer.cos_3.mc.service_pool = 0
egress_buffer.cos_4.mc.service_pool = 0
egress_buffer.cos_5.mc.service_pool = 0
egress_buffer.cos_6.mc.service_pool = 0
egress_buffer.cos_7.mc.service_pool = 0
# Reserved and static shared buffer allocation for MC.SP region: size in bytes
#egress_buffer.cos_0.mc.reserved = 10240
#egress_buffer.cos_1.mc.reserved = 10240
#egress_buffer.cos_2.mc.reserved = 10240
#egress_buffer.cos_3.mc.reserved = 10240
#egress_buffer.cos_4.mc.reserved = 10240
#egress_buffer.cos_5.mc.reserved = 10240
#egress_buffer.cos_6.mc.reserved = 10240
#egress_buffer.cos_7.mc.reserved = 10240
#egress_buffer.cos_0.mc.shared_size = 40
#egress_buffer.cos_1.mc.shared_size = 40
#egress_buffer.cos_2.mc.shared_size = 40
#egress_buffer.cos_3.mc.shared_size = 40
#egress_buffer.cos_4.mc.shared_size = 40
#egress_buffer.cos_5.mc.shared_size = 40
#egress_buffer.cos_6.mc.shared_size = 40
#egress_buffer.cos_7.mc.shared_size = 40
# Shared buffer allocation for ePort.TC region : size in bytes.
#egress_buffer.egr_queue_0.uc.shared_size = 40
#egress_buffer.egr_queue_1.uc.shared_size = 40
#egress_buffer.egr_queue_2.uc.shared_size = 40
#egress_buffer.egr_queue_3.uc.shared_size = 40
#egress_buffer.egr_queue_4.uc.shared_size = 40
#egress_buffer.egr_queue_5.uc.shared_size = 40
#egress_buffer.egr_queue_6.uc.shared_size = 40
#egress_buffer.egr_queue_7.uc.shared_size = 40
# Minimum buffer allocation for ePort.TC region: size in bytes
#egress_buffer.egr_queue_0.uc.reserved = 1024
#egress_buffer.egr_queue_1.uc.reserved = 1024
#egress_buffer.egr_queue_2.uc.reserved = 1024
#egress_buffer.egr_queue_3.uc.reserved = 1024
#egress_buffer.egr_queue_4.uc.reserved = 1024
#egress_buffer.egr_queue_5.uc.reserved = 1024
#egress_buffer.egr_queue_6.uc.reserved = 1024
#egress_buffer.egr_queue_7.uc.reserved = 1024
# Reserved Egress buffer for TCs mapped to lossless SPs
#flow_control.egress_buffer.reserved = 0
# Egress buffer ePort.MC buffer : size in bytes
# the per-port limit on multicast packets (applies to all switch priorities)
#port.egress_buffer.mc.reserved = 10240
#port.egress_buffer.mc.shared_size = 92160
# To enable egress static pool, set the mode to 0
egress_service_pool.0.mode = 1
# Egress dynamic buffer pool configuration
# Replace the shared_size parameter with the dynamic_quota=n/ALPHA_x,
# where ‘n’ should be the configuration value for alpha.
# ‘ALPHA_x’ should be string representation for alpha.
# Pls note : Same alpha configuration values can be used as mentioned in Ingress Dynamic Buffering section above
# Egress buffer per-port dynamic buffering quota (alpha ; Default: ALPHA_16)
#port.service_pool.0.egress_buffer.uc.dynamic_quota = ALPHA_16
#port.management.egress_buffer.dynamic_quota = ALPHA_8
# Egress buffer per-egress-queue dynamic buffering quota (alpha) for lossless egress queues (Default: ALPHA_INFINITY)
#flow_control.egress_buffer.dynamic_quota = ALPHA_1
# Egress buffer per-egress-queue dynamic buffering quota (alpha) for unicast (Default: ALPHA_8)
#egress_buffer.egr_queue_0.uc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_1.uc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_2.uc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_3.uc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_4.uc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_5.uc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_6.uc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_7.uc.dynamic_quota = ALPHA_8
# Egress buffer per-egress-queue dynamic buffering quota (alpha) for multicast (Default: ALPHA_INFINITY)
#egress_buffer.egr_queue_0.mc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_1.mc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_2.mc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_3.mc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_4.mc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_5.mc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_6.mc.dynamic_quota = ALPHA_8
#egress_buffer.egr_queue_7.mc.dynamic_quota = ALPHA_8
# These parameters can be assigned to the virtual Multicast port as well (Default: ALPHA_1_4)
#egress_buffer.cos_0.mc.dynamic_quota = ALPHA_1_4
#egress_buffer.cos_1.mc.dynamic_quota = ALPHA_1_4
#egress_buffer.cos_2.mc.dynamic_quota = ALPHA_1_4
#egress_buffer.cos_3.mc.dynamic_quota = ALPHA_1_4
#egress_buffer.cos_4.mc.dynamic_quota = ALPHA_1_4
#egress_buffer.cos_5.mc.dynamic_quota = ALPHA_1_4
#egress_buffer.cos_6.mc.dynamic_quota = ALPHA_1_4
#egress_buffer.cos_7.mc.dynamic_quota = ALPHA_1_4
# internal cos values mapped to egress queues
# multicast queue: same as unicast queue
cos_egr_queue.cos_0.uc = 0
cos_egr_queue.cos_0.cpu = 0
cos_egr_queue.cos_1.uc = 1
cos_egr_queue.cos_1.cpu = 1
cos_egr_queue.cos_2.uc = 2
cos_egr_queue.cos_2.cpu = 2
cos_egr_queue.cos_3.uc = 3
cos_egr_queue.cos_3.cpu = 3
cos_egr_queue.cos_4.uc = 4
cos_egr_queue.cos_4.cpu = 4
cos_egr_queue.cos_5.uc = 5
cos_egr_queue.cos_5.cpu = 5
cos_egr_queue.cos_6.uc = 6
cos_egr_queue.cos_6.cpu = 6
cos_egr_queue.cos_7.uc = 7
cos_egr_queue.cos_7.cpu = 7
注意事项
同时配置 QoS 和 Breakout 端口
如果您同时为 btoh breakout 端口和 breakout 接口配置 QoS 设置,则可能会发生错误。
您必须在 breakout 端口上进行 QoS 配置之前应用 breakout 端口配置。如果您正在使用 NVUE,请先配置 breakout 端口并执行 nv config apply
,然后在 breakout 端口上配置 QoS 设置,然后再次执行 nv config apply
。如果您正在使用 linux 文件配置,请先修改 ports.conf
,reload switchd
,然后修改 qos_features.conf
并第二次 reload switchd
。
Bond 成员接口上的 QoS 设置
如果您使用 Linux 命令在 bond 成员接口而不是逻辑 bond 接口上应用 QoS 设置,则成员必须共享相同的 QoS 配置。如果 bond 接口之间的配置不相同,则 bond 会继承您应用于 bond 的 _last_ interface
。
如果 QoS 设置不匹配,switchd reload
将失败;但是,switchd restart
不会失败。
NVUE 拒绝 bond 成员接口上的 QoS 配置,并在您尝试应用配置时显示错误;您必须在逻辑 bond 接口上应用所有 QoS 配置。
直通交换
您无法在 Spectrum ASIC 上禁用直通交换。Cumulus Linux 忽略 qos_features.conf
文件中的 cut_through_enable = false
设置。