Quality of Service
本文档介绍 MikroTik RouterOS 中面向具有 Marvell Prestera 交换机芯片设备的服务质量(QoS)功能,详细说明 QoS 优先级、流量整形和拥塞管理。内容涵盖 RouterOS v7.23 的增强功能,例如无损流量支持、动态缓冲区,以及适用于各种交换机型号的 QoS 设备兼容性表。
服务质量
本文档介绍 RouterOS 中面向配备 Marvell Prestera 交换机芯片 设备的**服务质量(QoS)**实现。
QoS 是网络交换机中的一组功能,允许网络管理员对流量进行优先级排序并分配网络资源,以确保关键数据以低延迟顺畅流动。
网络交换机中 QoS 的主要功能是以满足不同类型网络应用特定要求的方式管理流量。例如,语音和视频数据需要低延迟和最小丢包以确保高质量通信,而文件传输和其他数据应用可以容忍更高的延迟和丢包。
QoS 通过识别流经交换机的流量类型,并根据其需求分配优先级来工作。然后交换机使用此信息修改数据包报头并对流量进行优先级排序,确保高优先级流量比低优先级流量获得优先处理。
需要 RouterOS v7.15 或更高版本才能支持所有 QoS 功能:
- QoS 标记。 根据入站数据包报头匹配 QoS 配置文件,然后根据分配的 QoS 配置文件修改出站报头。
- QoS 强制执行。 根据分配的 QoS 配置文件和流量整形来避免或解决拥塞。
- QoS 策略。 通过 ACL 规则分配 QoS 配置文件。
- 主动队列管理:WRED(加权随机早期检测)、ECN 通知和处理、PFC(基于优先级的流控制)。
- 流量整形。
RouterOS v7.23 中的 QoS 变化
RouterOS v7.23 对服务质量(QoS)卸载引入了重大变化。这些变化简化了配置过程,并增加了对"无损"流量类的支持。尽管硬件资源是有限的,但当所有连接的设备都支持这些功能并正确配置时,使用 ECN 和/或 PFC 的主动队列管理可以防止丢包。以前的 RouterOS 版本已经支持 ECN 和 PFC,但 v7.23 简化了设置它们的方式。
信息
并非所有设备都支持无损流量。请查看 QoS 设备支持表。
配置变化摘要
- QoS 设置:大多数变化默认设置为 "auto",允许 RouterOS 为设置选择已知的最佳设置。
- QoS 设置:添加了
lossless-traffic-class和lossless-buffers,允许明确指定无损流量并为其预留队列资源。用户也可以将这些字段保留为 "auto"。 - QoS 监控:分别显示有损和无损的共享池使用情况。
- Tx 队列:移除了共享池索引。RouterOS 会根据流量类型(有损或无损)自动选择共享池。
- QoS 配置文件:添加了到指定 PCP 和 DSCP 值的自动映射(默认启用)。例如,添加 DSCP=46 的 QoS 配置文件会自动将该配置文件应用于从受信任端口收到的流量。
QoS 术语
本节定义本文档中使用的关键术语和缩写:
- QoS - Quality of Service,一组允许网络管理员对流量进行优先级排序并分配网络资源的功能。
- ACL - Access Control List,一组用于根据指定标准过滤网络流量的交换机规则。
- AQM - Active Queue Management,一种拥塞控制机制,通过在队列溢出之前丢弃或标记数据包来管理流量。
- DSCP - Differentiated Services Code Point,IP 报头中用于对网络流量进行优先级排序的 6 位字段。
- ECN - Explicit Congestion Notification,一种允许路由器向端点设备发出拥塞信号而不丢弃数据包的机制。
- ETS - Enhanced Transmission Selection,一种流量调度方法,使用加权轮询在多个队列组之间分配带宽。
- PCP - Priority Code Point,VLAN 报头中用于对 VLAN 内流量进行优先级排序的 3 位字段。
- PFC - Priority-based Flow Control(IEEE 802.1Qbb),一种流控制机制,暂停特定优先级队列上的流量以防止丢包。
- RoCE - RDMA over Converged Ethernet,一种通过以太网网络实现远程直接内存访问的协议。
- WRED - Weighted Random Early Detection,一种拥塞避免机制,在队列接近容量时随机丢弃数据包。
- /in/eth/sw/ -
/interface/ethernet/switch/的 CLI 快捷方式。
新一代 Marvell Prestera 交换机芯片中的 QoS 增强
具有新一代 Marvell Prestera 交换机芯片的 MikroTik 设备(例如运行 switch-marvell 软件包的 CRS8xx 系列)在 QoS 强制执行方面提供了新方法。以前的型号需要在保证的和共享的 Tx 队列缓冲区之间进行权衡。通过增加共享缓冲区百分比,设备可以吸收更大的流量突发,但同时,一个拥塞的端口可能占用所有共享缓冲区,限制其他端口的 QoS 能力。使用新一代交换机芯片通过引入**动态缓冲区(Dynamic Buffers)**实现了两全其美。交换机芯片根据当前拥塞级别动态调整端口和队列缓冲区限制。如果设备内部没有拥塞,单个端口可以吸收大量流量突发,防止丢包。当多个端口的 Tx 队列大小增加时,设备会降低每端口和每队列限制,强制公平使用共享资源,同时确保为非拥塞队列提供足够的缓冲区以继续转发流量。整个过程是自动化的,用户无需进行任何配置。
新一代 Marvell Prestera 交换机芯片的另一项改进是消除了用于存储控制数据的排队数据包描述符短缺。上一代设备有 Packet Cap 和 Use 统计。当设备收到小数据包突发时,即使它有足够的队列缓冲区来存储有效载荷,也可能由于达到 Packet Cap 而开始尾丢弃数据包。新一代设备确保始终有足够的内存来存储控制数据,仅将动态缓冲区大小作为唯一的限制因素。这就是新一代设备中没有 Packet Cap/Use 统计的原因。
新一代设备要求始终启用 QoS 硬件卸载(qos-hw-offloading=yes)。RouterOS 会忽略用户禁用它请求,同时保留该字段以实现向后兼容。
QoS 设备支持
| Switch Chip | Models | QoS Profiles | QoS Maps | Tx Managers | WRED | ECN | PFC | Lossless Buffers | Dynamic Buffers | Port/Queue Usage Stats |
|---|---|---|---|---|---|---|---|---|---|---|
| 98DX3236 | CRS305-1G-4S+IN CRS326-24G-2S+ (RM/IN) CRS328-24P-4S+RM CRS328-4C-20S-4S+RM | 128 | 1 | 8 | Current values | |||||
| 98DX226S | CRS305-1G-4S+OUT (FiberBox Plus) CRS310-1G-5S-4S+ (netFiber 9/IN) CRS310-8G+2S+IN CRS318-16P-2S+OUT (netPower 16P) CRS320-8P-8B-4S+RM CRS418-8P-8G-2S+RM CRS418-8P-8G-2S+5axQ2axQ-RM | 128 | 1 | 8 | Current values | |||||
| 98DX224S | CRS318-1Fi-15Fr-2S-OUT (netPower 15FR) | 128 | 1 | 8 | Current values | |||||
| 98DX2528 | CRS304-4XG-IN | 128 | 1 | 8 | Current values | |||||
| 98DX8525 | CCR2216-1G-12XS-2XQ CRS518-16XS-2XQ-RM | 1024 | 12 | 15 | ✔ | ✔ | ✔ | ✔ | Max fill <sup>1</sup> | |
| 98DX4310 | CRS504-4XQ (IN/OUT) CRS510-8XS-2XQ-IN RDS2216-2XG-4S+4XS-2XQ | 1024 | 12 | 15 | ✔ | ✔ | ✔ | ✔ | Max fill <sup>1</sup> | |
| 98DX8208 | CRS309-1G-8S+IN | 1024 | 12 | 15 | ✔ | ✔ | ✔ | ✔ | Current values <sup>2</sup> | |
| 98DX8212 | CRS312-4C+8XG-RM | 1024 | 12 | 15 | ✔ | ✔ | ✔ | ✔ | Current values <sup>2</sup> | |
| 98DX8216 | CRS317-1G-16S+RM | 1024 | 12 | 15 | ✔ | ✔ | ✔ | ✔ | Current values <sup>2</sup> | |
| 98DX8332 | CRS326-24S+2Q+RM CRS326-4C+20G+2Q+RM | 1024 | 12 | 15 | ✔ | ✔ | ✔ | ✔ | Current values <sup>2</sup> | |
| 98DX3257 | CRS354-48G-4S+2Q+RM CRS354-48P-4S+2Q+RM | 1024 | 12 | 15 | ✔ | ✔ | ✔ | ✔ | Current values <sup>2</sup> | |
| 98DX3255 | CCR2116-12G-4S+ | 1024 | 12 | 15 | ✔ | ✔ | ✔ | ✔ | Current values <sup>2</sup> | |
| 98CX8410 | CRS520-4XS-16XQ-RM | 1024 | 12 | 15 | ✔ | ✔ | ✔ | ✔ | Unavailable <sup>3</sup> | |
| 98DX7335 | CRS812-8DS-2DQ-2DDQ-RM CRS804-4DDQ-hRM | 1024 | 12 | 15 | ✔ | ✔ | ✔ | ✔ | ✔ | Current values + Max fill |
<sup>1</sup> 设备收集最大队列填充统计信息,而不是显示当前使用值。使用 reset-counters 命令清除这些统计信息。
<sup>2</sup> 由于硬件限制,某些交换机芯片型号在读取或轮询 QoS 端口/队列使用数据时可能会经历临时流量中断。
<sup>3</sup> 端口上各个队列的使用数据不可用;只能访问整个物理端口的合计总使用量。
应用和使用示例
基本配置示例
此示例演示如何在标准尽力而为(Best Effort)类之上为 VoIP(IP 电话)配置单个 QoS 级别。该配置使用 CRS326-24G-2S+ 设备,设置如下:
- 所有端口都已桥接并使用 vlan-filtering;
- sfp-sfpplus1 用作连接到另一台交换机的 VLAN 干道;
- ether1 到 ether9 是 IP 电话的专用端口;
- ether10 到 ether24 是用于主机连接的标准端口。
首先,定义一个 QoS 配置文件。此配置文件指定将在出站时应用于转发数据包的 DSCP 和 PCP 值:
/interface/ethernet/switch/qos/profile
add dscp=46 name=voip pcp=5 traffic-class=5
接下来,将 VoIP QoS 配置文件分配给 IP 电话的专用端口。这将配置文件应用于这些端口上的入站流量。所有其他以太网端口将使用默认配置文件(其中 dscp=0 且 pcp=0):
/interface/ethernet/switch/qos/port
set ether1 profile=voip
set ether2 profile=voip
set ether3 profile=voip
set ether4 profile=voip
set ether5 profile=voip
set ether6 profile=voip
set ether7 profile=voip
set ether8 profile=voip
set ether9 profile=voip
干道端口接收两种类型的 QoS 流量。要区分它们,请启用 trust-l3 和 trust-l2:
/interface/ethernet/switch/qos/port
set sfp-sfpplus1 trust-l3=trust trust-l2=trust
注意: 如果您运行的是 RouterOS 7.23 或更高版本,VLAN 优先级和 IP DSCP 映射会自动创建,因此不需要此步骤。如果您使用的是更早的 RouterOS 版本,则必须使用 QoS 配置文件手动创建 VLAN 优先级和 IP DSCP 映射:
/interface/ethernet/switch/qos/map/ip
add dscp=46 profile=voip
/interface/ethernet/switch/qos/map/vlan
add pcp=5 profile=voip
最后,启用 QoS 硬件卸载以使上述设置生效:
/interface/ethernet/switch
set switch1 qos-hw-offloading=yes
您可以使用 print 命令验证端口 QoS 设置:
[admin@MikroTik] /interface/ethernet/switch/qos/port/print
Column: NAME, SWITCH, PROFILE, MAP, TRUST-L2, TRUST-L3
# NAME SWITCH PROFILE MAP TRUST-L2 TRUST-L3 TX-MANAGER
0 ether1 switch1 voip default ignore ignore default
1 ether2 switch1 voip default ignore ignore default
2 ether3 switch1 voip default ignore ignore default
3 ether4 switch1 voip default ignore ignore default
4 ether5 switch1 voip default ignore ignore default
5 ether6 switch1 voip default ignore ignore default
6 ether7 switch1 voip default ignore ignore default
7 ether8 switch1 voip default ignore ignore default
8 ether9 switch1 voip default ignore ignore default
9 ether10 switch1 default default ignore ignore default
10 ether11 switch1 default default ignore ignore default
11 ether12 switch1 default default ignore ignore default
12 ether13 switch1 default default ignore ignore default
13 ether14 switch1 default default ignore ignore default
14 ether15 switch1 default default ignore ignore default
15 ether16 switch1 default default ignore ignore default
16 ether17 switch1 default default ignore ignore default
17 ether18 switch1 default default ignore ignore default
18 ether19 switch1 default default ignore ignore default
19 ether20 switch1 default default ignore ignore default
20 ether21 switch1 default default ignore ignore default
21 ether22 switch1 default default ignore ignore default
22 ether23 switch1 default default ignore ignore default
23 ether24 switch1 default default ignore ignore default
24 sfp-sfpplus1 switch1 default default trust ignore default
25 sfp-sfpplus2 switch1 default default ignore ignore default
26 switch1-cpu switch1
使用此配置,进入端口 ether1 到 ether9 的数据包被标记为优先级代码点(PCP)值 5 和区分服务代码点(DSCP)值 46。进入端口 ether10 到 ether24 的数据包被标记为 PCP 和 DSCP 值 0。当在 sfp-sfpplus1 端口上接收数据包时,任何 PCP 值为 5 的数据包保留其 PCP 值 5 和 DSCP 值 46,而所有其他数据包被标记为 PCP 和 DSCP 值 0。
Dante
从 RouterOS v7.15 开始,所有支持 QoS 的 MikroTik 设备都与 Dante 音频网络兼容。
Dante 硬件使用以下 DSCP/Diffserv 优先级值进行流量优先级排序:
| Dante Priority | Usage | DSCP Label | DSCP Value |
|---|---|---|---|
| High | Time-critical PTP events | CS7 | 56 |
| Medium | Audio, PTP | EF | 46 |
| None | Other traffic | BE | 0 |
此示例假设交换机使用其默认配置,其中包括一个默认网桥接口,所有以太网接口都作为网桥端口添加。这些接口中的任何一个都可用于 Dante。
首先,创建 QoS 配置文件以匹配 Dante 流量类。已经存在一个预先存在的 "default" 配置文件,它对应于 Dante 的 None 优先级。
/interface/ethernet/switch/qos/profile
add name=dante-ptp dscp=56 pcp=7 traffic-class=7
add name=dante-audio dscp=46 pcp=5 traffic-class=5
如果您运行的是 RouterOS 7.23 或更高版本,IP DSCP 映射会自动创建,因此不需要此步骤。如果您使用的是更早的 RouterOS 版本,请创建基于 DSCP 值匹配 QoS 配置文件的 QoS 映射:
/interface/ethernet/switch/qos/map/ip
add dscp=56 profile=dante-ptp
add dscp=46 profile=dante-audio
配置硬件队列以对 Dante 流量强制执行 QoS:
/interface/ethernet/switch/qos/tx-manager/queue
set [find where traffic-class=7] schedule=strict-priority
set [find where traffic-class=5] schedule=strict-priority
Dante 的高和中优先级流量按严格优先级顺序调度。设备会发送时间关键的 PTP 数据包直到 queue7 为空,然后继续处理音频(queue5)。其他流量仅在 PTP 和音频队列为空时才发送。
下一步是为传入的第 3 层数据包(IP DSCP 字段)启用信任模式:
/interface/ethernet/switch/qos/port
set [find] trust-l3=keep
最后,启用 QoS 硬件卸载以使上述设置生效:
/interface/ethernet/switch
set switch1 qos-hw-offloading=yes
在组播模式下使用 Dante 时,在交换机上启用 IGMP snooping 是有益的。此功能仅将流量定向到有订阅设备的端口,防止不必要的泛洪。此外,启用 IGMP 查询器(如果同一 LAN 中另一台设备上尚未启用)、调整查询间隔以及激活 fast-leave 可以进一步优化组播性能。
/interface/bridge
set [find name=bridge] igmp-snooping=yes multicast-querier=yes query-interval=60s
/interface/bridge/port
set [find] fast-leave=yes
RDMA over Converged Ethernet (RoCE)
RoCE 通过以太网网络实现对远程存储系统的直接内存访问,而无需涉及主机 CPU。这显著降低了延迟和 CPU 开销,使 RoCE 成为高性能计算和数据中心环境的理想选择。RoCE 还允许融合网络,其中各种服务(如数据存储、网络和多媒体)在单一的以太网基础设施上运行,简化了网络管理并降低了维护独立网络的成本和复杂性。
RoCE 通过使用 ECN 和 PFC 机制来实现这一点。这些功能有助于防止网络拥塞和丢包,确保可靠的、无损的通信。有关兼容交换机,请参见设备功能表。虽然交换机可以支持 RoCE 环境,但终端主机也必须与 RoCE 协议兼容,并配备支持 RDMA 的网络接口卡(NIC)。
RoCE 有两个主要版本。RoCEv1 作为以太网链路层协议运行,使用 Ethertype 0x8915。RoCEv2 在标准 IP 网络上运行,使用 UDP 目标端口号 4791。IP 报头中的 ECN 位被标记以指示网络拥塞,并使用拥塞通知数据包(CNP)向发送方确认拥塞。对于流量优先级排序,RoCEv2 流量使用 DSCP 26,而 CNP 使用 DSCP 48。
以下示例可用于带 PFC 和 ECN 的无损 RoCEv2,它假设交换机使用其默认配置,其中包括一个默认网桥接口,所有以太网接口都作为网桥端口添加。推荐的最低 RouterOS 版本为 7.17。
首先,配置附加配置文件。非 RoCE 流量将分配给已存在的 "default" 配置文件(traffic-class 1),RoCEv2 分配给 traffic-class 3,CNP 分配给 traffic-class 6。
/interface/ethernet/switch/qos/profile
add dscp=26 name=roce traffic-class=3
add dscp=48 name=cnp traffic-class=6
如果您运行的是 RouterOS 7.23 或更高版本,IP DSCP 映射会自动创建,因此不需要此步骤。如果您使用的是更早的 RouterOS 版本,请创建基于 DSCP 值匹配 QoS 配置文件的 QoS 映射。
/interface/ethernet/switch/qos/map/ip
add dscp=26 profile=roce
add dscp=48 profile=cnp
配置硬件队列和调度器。对 traffic-class 1 和 traffic-class 3 使用 ETS(schedule=high-priority-group),各分配 50% 带宽(weight=1),对 traffic-class 6 使用严格优先级调度。此外,为 traffic-class 3 启用 ECN(ecn=yes),以标记交换机中经历拥塞的 IP 数据包。
/interface/ethernet/switch/qos/tx-manager/queue
set 1 schedule=high-priority-group weight=1
set 3 schedule=high-priority-group weight=1 ecn=yes
set 6 schedule=strict-priority
提示
尽管使用
schedule=low-priority-group允许您为不同的流量类集合创建单独的 ETS 调度和带宽分配,但不建议将此设置与lldp-dcbx=yes一起使用。原因是 ETS Configuration/Recommendation TLV 设计为跨流量类处理单一带宽分配,因此应改用schedule=high-priority-group。 为 traffic-class 3 配置 PFC 配置文件,以确保 RoCEv2 流量的无损环境。
/interface/ethernet/switch/qos/priority-flow-control
add name=pfc-tc3 rx=yes traffic-class=3 tx=yes
在预期有 RoCEv2 流量的交换机端口上设置第 3 层信任模式(trust-l3=keep)。设置 PFC(pfc=pfc-tc3)和 queue3 的出站速率以符合 PFC 要求(egress-rate-queue3=10.0Gbps)。在此示例中,使用 10Gbps SFP+ 接口,出站速率可以设置为匹配接口的物理速率。请根据您的接口速率更改此属性。
/interface/ethernet/switch/qos/port
set sfp-sfpplus1 egress-rate-queue3=10.0Gbps pfc=pfc-tc3 trust-l3=keep
set sfp-sfpplus2 egress-rate-queue3=10.0Gbps pfc=pfc-tc3 trust-l3=keep
set sfp-sfpplus3 egress-rate-queue3=10.0Gbps pfc=pfc-tc3 trust-l3=keep
set sfp-sfpplus4 egress-rate-queue3=10.0Gbps pfc=pfc-tc3 trust-l3=keep
启用 QoS 硬件卸载以使上述设置开始工作。
/interface/ethernet/switch
set switch1 qos-hw-offloading=yes
启用 LLDP 数据中心桥接能力交换协议(DCBX),以与其他相邻设备共享 QoS 设置和能力。
/ip/neighbor/discovery-settings
set lldp-dcbx=yes
作为可选步骤,增大 L2MTU 以容纳更大的数据包。
/interface/ethernet
set [find switch=switch1] l2mtu=9500
QoS 标记
理解映射范围
为了避免逐个定义每个可能的 PCP 和 DSCP 映射,RouterOS 允许您在创建 QoS 配置文件映射时为 PCP 和 DSCP 指定多个值或范围。
在此示例中,PCP 值 0 和 2 使用默认 QoS 配置文件,值 1 和 3-4 使用 streaming 配置文件,值 5 使用 voip 配置文件,值 6-7 使用 control 配置文件:
/interface/ethernet/switch/qos/map/vlan
add pcp=1,3-4 profile=streaming
add pcp=5 profile=voip
add pcp=6-7 profile=control
此方法通过将相关的优先级值分组在一起,而不是为每个单独的值创建单独的映射规则,从而简化了配置。
理解端口、配置文件和映射的关系
每个交换机端口都有第 2 层和第 3 层信任设置,它们将改变入站数据包如何分类到 QoS 配置文件以及使用什么 PCP 和 DSCP 值。以下是描述所有可能选项的表:
| qos-trust-l2 | qos-trust-l3 | Behavior |
|---|---|---|
| ignore | ignore | 端口被视为不受信任。两个报头都被忽略,端口的 profile 被强制应用于所有入站数据包。这是默认设置。 |
| ignore | trust | 信任第 3 层报头。使用入站数据包 IP 报头中的 DSCP 字段进行 QoS 配置文件查找(请参见 /in/eth/sw/qos/map/ip)。如果查找失败(没有 QoS 配置文件映射到给定的 DSCP 值),则使用 default QoS 配置文件(不是交换机端口的 QoS 配置文件)。交换机端口的 profile 字段仅用于非 IP 流量。 |
| ignore | keep | 信任第 3 层报头。使用入站数据包 IP 报头中的 DSCP 字段进行 QoS 配置文件查找(请参见 /in/eth/sw/qos/map/ip)。如果查找失败,则使用 default QoS 配置文件。交换机端口的 profile 字段仅用于非 IP 流量。如果转发/路由的数据包带 VLAN 标签,则其 PCP 值根据所选的 QoS 配置文件设置。但是,数据包的原始 DSCP 值保持不变。 |
| trust | ignore | 信任第 2 层报头,但忽略 L3。如果入站数据包带 VLAN 标签,则使用 VLAN 报头中的 PCP 字段进行 QoS 配置文件查找(请参见 /in/eth/sw/qos/map/vlan)。如果查找失败(没有 QoS 配置文件映射到给定的 PCP 值),则使用 default QoS 配置文件。交换机端口的 profile 字段仅用于未标记流量。 |
| trust | trust | 信任两个报头,但第 3 层具有更高优先级。对于 IP 数据包,使用 DSCP 字段进行 QoS 配置文件查找(请参见 /in/eth/sw/qos/map/ip)。如果 DSCP 到 QoS 的查找失败,则使用 default 配置文件。如果数据包不是 IP 数据包但带 VLAN 标签,则使用 VLAN 报头中的 PCP 字段进行 QoS 配置文件查找(请参见 /in/eth/sw/qos/map/vlan)。如果 VLAN 到 QoS 的查找失败,则使用 default QoS 配置文件。非 IP 未标记数据包使用交换机端口的 profile。 |
| trust | keep | 与 trust+trust 相同,但在转发/路由的数据包中保留原始 DSCP 值。 |
| keep | ignore | 信任第 2 层报头但忽略 L3。如果入站数据包带 VLAN 标签,则使用 VLAN 报头中的 PCP 字段进行 QoS 配置文件查找(请参见 /in/eth/sw/qos/map/vlan)。如果查找失败(没有 QoS 配置文件映射到给定的 PCP 值),则使用 default QoS 配置文件。交换机端口的 profile 字段仅用于未标记流量。如果数据包在入站和出站时都带 VLAN 标签,则保留原始 PCP 值。 |
| keep | trust | 信任两个报头,但第 3 层具有更高优先级。对于 IP 数据包,使用 DSCP 字段进行 QoS 配置文件查找(请参见 /in/eth/sw/qos/map/ip)。如果 DSCP 到 QoS 的查找失败,则使用 default 配置文件。如果数据包不是 IP 数据包但带 VLAN 标签,则使用 VLAN 报头中的 PCP 字段进行 QoS 配置文件查找(请参见 /in/eth/sw/qos/map/vlan)。如果 VLAN 到 QoS 的查找失败,则使用 default QoS 配置文件。非 IP 未标记数据包使用交换机端口的 profile。如果数据包在入站和出站时都带 VLAN 标签,则保留原始 PCP 值。转发/路由数据包中的 DSCP 值根据所选的 QoS 配置文件设置。 |
| keep | keep | 信任两个报头,但第 3 层具有更高优先级。对于 IP 数据包,使用 DSCP 字段进行 QoS 配置文件查找(请参见 /in/eth/sw/qos/map/ip)。如果 DSCP 到 QoS 的查找失败,则使用 default 配置文件。如果数据包不是 IP 数据包但带 VLAN 标签,则使用 VLAN 报头中的 PCP 字段进行 QoS 配置文件查找(请参见 /in/eth/sw/qos/map/vlan)。如果 VLAN 到 QoS 的查找失败,则使用 default QoS 配置文件。非 IP 未标记数据包使用交换机端口的 profile。对于带 VLAN 标签和/或 IP 数据包,分别保留原始 PCP 和/或 DSCP 值不变。 |
| Port settings | The selected QoS profile and the source for PCP / DSCP field values in forwarded/routed packets | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| qos-trust-l2 | qos-trust-l3 | VLAN-Tagged IP | Untagged IP | VLAN-Tagged Non-IP | Untagged Non-IP | ||||||||
| QoS Profile | PCP | DSCP | QoS Profile | PCP <sup>1</sup> | DSCP | QoS Profile | PCP | DSCP | QoS Profile | PCP <sup>1</sup> | DSCP | ||
| ignore | ignore | profile | profile | profile | profile | profile | profile | profile | profile | - | profile | profile | - |
| ignore | trust | map/ip | map/ip | map/ip | map/ip | map/ip | map/ip | profile | profile | - | profile | profile | - |
| ignore | keep | /map/ip | /map/ip | original | /map/ip | /map/ip | original | profile | profile | - | profile | profile | - |
| trust | ignore | map/vlan | map/vlan | map/vlan | profile | profile | profile | map/vlan | map/vlan | - | profile | profile | - |
| trust | trust | /map/ip | /map/ip | /map/ip | /map/ip | /map/ip | /map/ip | /map/vlan | /map/vlan | - | profile | profile | - |
| trust | keep | /map/ip | /map/ip | original | /map/ip | /map/ip | original | /map/vlan | /map/vlan | - | profile | profile | - |
| keep | ignore | map/vlan | original | map/vlan | profile | profile | profile | map/vlan | original | - | profile | profile | - |
| keep | trust | map/ip | original | map/ip | map/ip | profile | map/ip | map/vlan | original | - | profile | profile | - |
| keep | keep | map/ip | original | original | map/ip | profile | original | map/vlan | original | - | profile | profile | - |
<sup>1</sup> 仅当入站流量未标记,但出站接口要求帧带 VLAN 标签时适用。
通过交换机规则(ACL)进行 QoS 标记
从 RouterOS v7.15 开始,您可以使用交换机规则(ACL)为网络流量分配 QoS 配置文件。此方法允许基于各种数据包属性进行灵活的流量分类。
以下示例根据源 MAC 地址分配 QoS 配置文件:
/interface/ethernet/switch/rule
add new-qos-profile=stream port=ether1,ether2 src-mac-address=00:01:02:00:00:00/FF:FF:FF:00:00:00 switch=switch1
add new-qos-profile=voip port=ether1,ether2 src-mac-address=04:05:06:00:00:00/FF:FF:FF:00:00:00 switch=switch1
QoS 强制执行
硬件队列
每个交换机端口有八个硬件传输(Tx)队列(queue0 到 queue7)。每个队列对应一个由 QoS 配置文件定义的流量类(tc0 到 tc7)。当数据包进入交换机时,它会获得一个 QoS 配置文件分配,这决定了流量类,从而选择适当的出站队列进行传输。
硬件队列具有由传输管理器配置的可变大小。此外,多个端口和队列可以通过一种称为*共享缓冲区(Shared Buffers)*的机制相互共享资源。例如,一台具有 25 个端口的设备具有足以排队 1200 个数据包的缓冲内存。如果资源平均分配,每个端口获得 48 个独占缓冲区,每个队列最多 6 个数据包(48 除以 8),这通常不足以吸收哪怕很短的流量突发。但是,分配 50% 的缓冲区用于共享后,每个端口有 24 个独占缓冲区(每队列 3 个),同时允许单个队列增长到最多 603 个缓冲区(3 个独占加上 600 个共享)。
RouterOS 允许为每个队列单独启用或禁用共享池。此功能有助于防止低优先级流量消耗所有可用的硬件内存。此外,端口缓冲区限制可以限制单个低速端口占用整个共享池。有关更多详细信息,请参见 QoS 设置和传输管理器。
信息
默认的尽力而为流量类(PCP=0,DSCP=0)是流量类 1,而最低优先级流量(PCP=1)使用流量类 0。
硬件资源
交换机芯片的硬件资源(内存)有限。与 QoS 操作相关的有两个主要硬件资源:
- 数据包描述符(Packet descriptor) - 包含数据包控制信息,例如目标端口、报头修改和其他元数据。
- 数据缓冲区(Data buffer) - 存储实际数据包有效载荷的内存块。缓冲区大小因交换机芯片型号而异;通常为 256 字节。
一个数据包描述符可能使用多个缓冲区(取决于有效载荷大小),在组播或广播流量的情况下,缓冲区可能由多个描述符共享。如果硬件没有足够的空闲描述符或缓冲区,数据包将被丢弃(尾丢弃)。
硬件资源可以按目标类型(组播/单播)、按端口和按 TX 队列进行限制。当达到任何这些限制时,无法再为传输排队更多数据包,后续数据包将被丢弃。
RouterOS 抽象了底层硬件细节,允许以数据包数量或总量的百分比来配置资源限制。RouterOS 根据用户指定的数据包限制和端口的 MTU 自动计算所需的硬件描述符和缓冲区数量。此外,RouterOS 包含预配置的硬件资源,在常见的 QoS 场景中无需手动配置。
危险
在运行时修改任何硬件资源分配参数会导致设备临时停止,在此期间无法排队或传输任何数据包。在设备转发流量时,预期会有临时的数据包丢失。
资源节省(上一代设备)
信息
本节仅适用于不支持动态缓冲区的设备。 由于硬件资源无法在运行时重新分配,RouterOS 无法自动释放为不活动端口预留的队列缓冲区。这些缓冲区保持未使用状态。但是,如果您知道某个特定端口永远不会被使用(例如,它始终保持物理断开),您可以通过分配具有最少资源的内置 "offline" tx-manager 来手动释放相应的队列资源:
/interface/ethernet/switch/qos/port
set sfp-sfpplus1 tx-manager=offline
set sfp-sfpplus2 tx-manager=offline
危险
不要在 switch-cpu 端口上配置 "offline" tx-manager。 警告
为 QSFP+ 或 QSFP28 接口配置
tx-manager设置时,必须对该端口的所有四个子接口应用相同的配置。例如,如果接口 qsfp28-1-1 处于活动状态并以 100Gbps 链接,而子接口(qsfp28-1-2、qsfp28-1-3、qsfp28-1-4)显示非运行标志,不要将 "offline" tx-manager 分配给这些非运行的子接口。这样做也会影响 100Gbps 链路。但是,如果四个子接口都不在运行,则可以安全地分配 "offline" tx-manager 设置。
流量优先级排序
硬件支持两种类型的流量传输优先级排序:
- 严格优先级(Strict Priority) - 来自更高队列的流量总是首先传输。
- 增强传输选择(Enhanced Transmission Selection,ETS) - 多个队列使用加权轮询同时参与数据包传输调度。
严格优先级排队很简单。如果最高优先级队列(Q7)有数据包,则首先传输这些数据包。当 Q7 为空时,传输来自 Q6 的数据包,依此类推。来自最低优先级队列(Q0)的数据包仅在所有其他队列都为空时才传输。
严格优先级排序的缺点是,在"过度优先"高队列的同时增加了低队列的延迟。假设 TC5 的可接受延迟为 20ms,TC3 为 50ms。出现在 Q5 中的流量由于该队列的严格优先级而立即被传输,给低队列(Q4..Q0)中的每个数据包增加额外延迟。Q5 中的数据包突发(例如语音呼叫的开始)可能临时"瘫痪"Q3,使 TC3 延迟增加到超过可接受的 50ms(甚至由于队列满而导致丢包),而 TC5 数据包以 <1ms 传输(远低于 20ms 限制)。通过在中间传输 TC3 数据包来稍微牺牲 TC5 延迟会让所有人都满意。这就是 ETS 的用途。
**增强传输选择(ETS)**以加权轮询方式调度来自多个队列(组成员)的流量传输。队列的权重设置每轮从该队列传输的数据包数量。例如,如果 Q2、Q1 和 Q0 是组成员,它们的权重分别为 3、2 和 1,则调度器从 Q2 传输 3 个数据包、从 Q1 传输 2 个、从 Q0 传输 1 个。上述示例中每轮的实际传输顺序为 "Q2、Q1、Q0、Q2、Q1、Q2" - 以实现更公平的调度。
有两个硬件组:low-priority-group 和 high-priority-group。两个组之间存在严格优先级排序:low-priority-group 仅当 high-priority-group 中的所有队列都为空时才传输。但是,也可以仅使用一个组用于所有队列。
下面列出了默认(内置)的 RouterOS 队列设置。Q3-Q5 在 high-priority-group 内共享带宽,在 Q6 和 Q7 为空时传输数据包。Q0-Q2 是 low-priority-group 的成员,在 Q3-Q7 为空时传输数据包。
[admin@MikroTik] /interface/ethernet/switch/qos/tx-manager/queue> print
Columns: TX-MANAGER, TRAFFIC-CLASS, SCHEDULE, WEIGHT, QUEUE-BUFFERS, USE-SHARED-BUFFERS
# TX-MANAGER TRAFFIC-CLASS SCHEDULE WEIGHT QUEUE-BUFFERS USE-SHARED-BUFFERS
0 default 0 low-priority-group 1 auto no
1 default 1 low-priority-group 2 auto yes
2 default 2 low-priority-group 3 auto yes
3 default 3 high-priority-group 3 auto yes
4 default 4 high-priority-group 4 auto yes
5 default 5 high-priority-group 5 auto yes
6 default 6 strict-priority auto yes
7 default 7 strict-priority auto yes
提示
建议所有组成员彼此相邻。
主动队列管理(AQM)
加权随机早期检测(WRED)
WRED 是一种按队列运行的拥塞控制机制。它通过在队列溢出之前丢弃数据包来向端点设备发出拥塞事件信号。WRED 依赖于端点中响应丢包的速率节流机制,例如 TCP/IP。
WRED 使用随机丢包算法来预测拥塞事件,并在拥塞实际发生之前通过节流流量速率来响应它们。WRED 的随机性属性防止由 TCP 流的全局同步引起的吞吐量崩溃。
可以在每个 Tx Manager 中按队列启用或禁用 WRED。对于无损流量类禁用 WRED。对于高速端口,本来就不应发生拥塞,也没有理由启用 WRED。
该行为通过 WRED 阈值控制。WRED 阈值定义可以超过队列共享缓冲区限制(上限)的最大数据包或字节数。当队列使用超过其相应容量时,开始随机丢包:
queueX-packet-use > queueX-shared-packet-cap,或queueX-byte-use > queueX-shared-byte-cap。
使用超过容量的程度越高,丢包几率就越大,在 queueX-shared-packet-cap + wred-packet-threshold(或字节等价物)时达到 100%。
RouterOS 根据队列或共享池容量自动选择实际的 WRED 阈值。用户可以通过 QoS 设置调整阈值。
危险
WRED 要求相应的 Tx 队列使用共享缓冲区(use-shared-buffers=yes)。 选择 WRED 阈值涉及拥塞预测和突发吸收之间的权衡。设置较高的 WRED 阈值可能导致更早的流量速率节流,从而解决拥塞。但是,高阈值会在本可由队列缓冲区吸收并无损传输的有限流量突发中导致丢包,如果 WRED 未激活的话。
例如,发起远程数据库连接通常在初始化阶段开始于较重的流量("数据包突发"),然后流量速率降至"合理"水平。初始化阶段的任何丢包都会由于需要重传而导致数据库连接变慢。因此,对此类流量降低 WRED 阈值或完全禁用 WRED 是推荐的。相反的情况是视频流,早期拥塞检测有助于选择舒适的流速率,而不会在重传上损失太多带宽或牺牲质量级别。
信息
使用交换机规则(ACL)或其他 QoS 标记技术来区分流量,并将数据包放入具有所需 WRED 设置的队列中。 以下脚本仅通过将 TCP/IP 流量重定向到 queue2 来对其应用 WRED。UDP 和其他数据包保留在 queue1 中,因为它们的端点通常无法响应早期丢包。Queue1 和 queue2 被平等调度,不优先于另一个队列:
/interface/ethernet/switch/qos/profile
add name=tcp-wred traffic-class=2 pcp=0 dscp=0
# move TCP traffic to queue2
/interface/ethernet/switch/rule
add new-qos-profile=tcp-wred ports=ether1,ether2,ether3,ether4 protocol=tcp switch=switch1
# set the same scheduling priority (weight) between queue1 and queue2
# apply WRED only to queue2 - TCP traffic
/interface/ethernet/switch/qos/tx-manager/queue/
set [find where traffic-class=1] weight=2 schedule=low-priority-group use-shared-buffers=yes wred=no
set [find where traffic-class=2] weight=2 schedule=low-priority-group use-shared-buffers=yes wred=yes
显式拥塞通知(ECN)
某些交换机芯片型号支持符合 RFC 3168 的硬件级 IP 数据包 ECN 标记。此机制的运行方式类似于 WRED,但在拥塞期间不是丢弃数据包,而是用 ECN 字段中的 CE(Congestion Experienced,二进制 11)标志标记它们。只有支持 ECN 的 IP 数据包才能收到此标记 - 即 ECN 字段值设置为 ECT(1) 或 ECT(0)(二进制 01 或 10)的数据包。不支持 ECN 的传输数据包(ECN=00)永远不会被标记。如果数据包已带有 CE 标记(ECN=11),则无论设备是否经历拥塞,它都保留此标记。
通过在所需的 Tx Manager 队列上设置 ecn=yes 来启用 ECN 标记。
危险
ECN 标记机制要求相应的 Tx 队列使用共享缓冲区(use-shared-buffers=yes)。 当所有以下条件都满足时,数据包会收到 CE 标记:
- 数据包是 IPv4 或 IPv6。
- IP 报头中的 ECN 字段值为 ECT(1) 或 ECT(0)。
- 出站端口的 Tx 队列启用了 ecn=yes 并使用共享缓冲区(use-shared-buffers=yes)。
- 队列使用超过共享缓冲区容量:
queueX-packet-use > queueX-shared-packet-cap或queueX-byte-use > queueX-shared-byte-cap。
危险
由于启用 ECN(ecn=yes)会阻止支持 ECN 的数据包被丢弃,如果流量发送方未及时响应拥塞通知,队列使用可能会超过 WRED 阈值。
基于优先级的流控制(PFC)
基于优先级的流控制(PFC)为最多八个流量类实现无损操作,确保一个流量类中的拥塞不会暂停其他流量类中的流量。这允许对丢包敏感的流量类型与可容忍丢包的流量类型在同一网络上共存。
支持 PFC 的交换机芯片符合 IEEE 802.1Qbb PFC 标准,这意味着它们可以生成并响应 PFC 帧。当出站端口发生拥塞时,源端口为受影响的流量类发送 PFC 帧。生成的 PFC 帧使用计时器值 0xFFFF 表示暂停(XOFF),0x0 表示恢复(XON),并在优先级启用向量中设置相应的位。在接收端,PFC 帧将目标端口上的特定优先级队列暂停 PFC 帧中指定的持续时间。
在 RouterOS 中,PFC 配置组织为配置文件。每个端口可以分配给特定的 PFC 配置文件,该配置文件定义要启用 PFC 的流量类、分别用于发送 XOFF 和 XON 帧的暂停和恢复阈值,以及分配的端口应发送和/或接收 PFC 帧。
当出站端口发生拥塞时,PFC 在入站端口上触发。必须使用共享缓冲区将入站流量与 Tx 队列中等待的数据包关联起来。对于每个启用 PFC 的流量类,在相应的 Tx 队列上设置 use-shared-buffers=yes。
信息
RouterOS 在流量类和 Tx 队列之间实现 1:1 映射。流量类为 0 的数据包入队到 queue0,TC1 入队到 queue1,依此类推直到 TC7 入队到 queue7。因此,在本文档中"流量类"和"Tx 队列"这两个术语可互换使用。 在选择暂停和恢复阈值时,请考虑传输和处理 PFC 帧的延迟。例如,设备 A 在时间 T 发生拥塞,向设备 B 发送 PFC 暂停帧,B 在时间 T+D 处理该帧并停止传输。在增量时间 D 期间,设备 B 继续发送流量。如果设备 A 将暂停阈值配置为 100%,则它没有可用缓冲区,数据包可能会丢失,这对于无损流量类是不可接受的。设置较低的暂停阈值(例如 80%)会在仍保留空闲内存以在增量时间 D 期间吸收流量的同时发送 PFC 暂停帧。相同的原理适用于恢复阈值。将其设置为 0% 会使设备在增量时间期间保持空闲,降低整体吞吐量。
PFC 接收需要设置所有相关队列的出站速率以计算暂停时间,即使它与线速匹配。例如,如果 PFC 在流量类 3 上运行,则分配的端口需要 egress-rate-queue3 设置。
/interface/ethernet/switch/qos/priority-flow-control/add name=pfctc3 traffic-class=3 rx=yes
/interface/ethernet/switch/qos/port/set sfp-sfpplus1,sfp-sfpplus2 pfc=pfctc3 egress-rate-queue3=10G