输出调度功能可确保订阅严重超载时,接口出口不会出现丢弃重要数据流的情况。本文档讨论 Cisco Catalyst 3550 交换机输出调度功能所涉及的全部技术和算法。本文也着重讨论在 Catalyst 3550 交换机上如何配置和验证输出调度操作。
本文档没有任何特定的要求。
本文档中的信息是基于运行 Cisco IOS® 软件版本 12.1(12c)EA1 的 Catalyst 3550。
本文档中的信息都是基于特定实验室环境中的设备编写的。本文档中使用的所有设备最初均采用原始(默认)配置。如果您使用的是真实网络,请确保您已经了解所有命令的潜在影响。
有关文档规则的详细信息,请参阅 Cisco 技术提示规则。
3550 交换机有两种类型的端口:
千兆位端口
非千兆位端口(10/100 Mbps 端口)
这两种端口具有不同功能。本部分的其余内容将概要介绍这些功能。本文档的其他部分对这些功能进行了更详细的说明。
3550 上的每个端口都有四个不同输出队列。您可以将其中一个队列配置为严格优先队列。其余每个队列都配置为非严格优先级队列,并使用加权轮询(WRR)进行服务。 在所有端口上,根据服务类别(CoS),数据包将分配到四个可能队列之一。
千兆位端口还支持在每个队列内使用一种队列管理机制。您可以配置每个队列,使其使用加权随机早期检测(WRED)或带有两个阈值的尾部丢弃。此外,您还可以调整每个队列的大小(分配给每个队列的缓冲区)。
非千兆位端口没有任何排队机制,例如 WRED 或带有两个阈值的尾部丢弃。它只支持 10/100 Mbps 端口上的 FIFO 排队。您不能改变这些端口上四个队列中每个端口的大小。但是,您可以为每个队列分配最小(最小)保留大小。
本部分讨论 3550 决定将各数据包放置在一个队列中的方法。数据包将根据 CoS 放在队列中。使用 CoS 到队列映射接口命令,八个可能 CoS 值中的每个值都将映射到四个可能队列之一,如下面的示例所示:
(config-if)#wrr-queue cos-map queue-id cos1... cos8
示例如下:
3550(config-if)#wrr-queue cos-map 1 0 1 3550(config-if)#wrr-queue cos-map 2 2 3 3550(config-if)#wrr-queue cos-map 3 4 5 3550(config-if)#wrr-queue cos-map 4 6 7
在此示例中:
CoS 0 和 1 放在队列 1 (Q1) 中
CoS 2 和 3 放在 Q2 中
CoS 4 和 5 放在 Q3 中
CoS 6 和 7 放在 Q4 中
您可以发出以下命令验证端口的 CoS 到队列映射:
cat3550#show mls qos interface gigabitethernet0/1 queueing GigabitEthernet0/1 ...Cos-queue map: cos-qid 0 - 1 1 - 1 2 - 2 3 - 2 4 - 3 5 - 3 6 - 4 7 - 4...
严格优先队列始终会首先清空。因此,只要严格优先队列中有数据包,就会立即转发它。在每个数据包从 WRR 队列转发后,如有必要,请检查并清空严格优先级队列。
严格优先队列是专为延迟/抖动敏感数据流设计(例如语音)。严格优先队列会最终导致其他队列出现耗竭。如果严格优先队列中有等待的数据包,那么放在其他三个 WRR 队列中的数据包将永远不会转发。
要避免其他队列出现耗竭,请特别注意放在优先队列中的是什么数据流。该队列通常用于语音数据流,其流量通常不是很高。但是,如果某人能够使用 CoS 优先级向严格优先队列中发送高流量数据流(例如大文件传输或备份),则可能导致其他数据流出现耗竭。要避免此问题,需要在分类/准入中放置特殊数据流并在网络中标记该数据流。例如,可以采取下列预防措施:
为所有不受信任的源端口使用不可信端口 Qos 状态。
为 Cisco IP 电话端口使用可信边界功能以确保没有在为另一项应用的 IP 电话配置的信任状态中使用它。
为进入严格优先队列的数据流制定策略。在千兆位端口上为 CoS 为 5(差分服务代码点 [DSCP] 46)的流量策略设置一个限制 (100 MB)。
有关这些主题的详细信息,请参阅下列文档:
在 3550 上,可以将一个队列配置为优先队列(始终为 Q4)。 请在接口模式下使用以下命令:
3550(config-if)#priority-queue out
如果未在接口中配置优先队列,则会将 Q4 视为标准 WRR 队列。本文档的 Catalyst 3550 上的加权轮询部分提供了更多详细信息。通过发出以下 Cisco IOS 命令可以验证接口上是否配置了严格优先队列:
NifNif#show mls qos interface gigabitethernet0/1 queueing GigabitEthernet0/1 Egress expedite queue: ena
WRR 是在 3550 上的输出调度中使用的一种机制。WRR 可在三个或四个队列之间工作(如果没有严格优先队列)。 WRR 中使用的队列将以轮询方式进行清空,您可以为每个队列配置权重。
例如,可以配置权重以便按不同方式为队列提供服务,如下面的列表所示:
服务 WRR Q1:10% 的时间
服务 WRR Q2:20% 的时间
服务 WRR Q3:60% 的时间
服务 WRR Q4:10% 的时间
对于每个队列,可以在接口模式下发出以下命令以配置四个权重(每个队列关联一个权重):
(config-f)#wrr-queue bandwidth weight1 weight2 weight3 weight4
示例如下:
3550(config)#interface gigabitethernet 0/1
3550(config-if)#wrr-queue bandwidth 1 2 3 4
注意:权重是相对的。我们使用下列值:
Q1 = 权重 1/(权重 1 + 权重 2 + 权重 3 + 权重 4) = 1/(1+2+3+4) = 1/10
Q2 = 2/10
Q3 = 3/10
Q4 = 4/10
可以按照以下两种方式实现 WRR:
基于带宽的 WRR:每个权重表示允许发送的一个特定带宽。权重 Q1 允许使用大约 10% 的带宽,Q2 获得 20% 的带宽,等等。目前这种方案只能在 Catalyst 6500/6000 系列中实现。
基于数据包的 WRR:这是在 3550 交换机中实现的算法。每个权重表示要发送的一定数量的数据包,而不管其大小如何。
由于 3550 可实现基于数据包的 WRR,因此下列行为将适用于本部分中的配置:
Q1 传输 10 个数据包中的 1 个数据包
Q2 传输 10 个数据包中的 2 个数据包
Q3 传输 10 个数据包中的 3 个数据包
Q4 传输 10 个数据包中的 4 个数据包
要传输的数据包的大小可以完全相同。这时四个队列仍然可以获得预期的带宽份额。但是,如果队列间的平均数据包大小不同,则在拥塞情况下,这会对什么应该传输以及什么应该丢弃产生巨大影响。
例如,假设交换机中只有两个流。同时我们假设处于以下情况:
CoS 为 3 的 1 Gbps 小型交互式应用数据流(80 字节 [B] 帧)放在 Q2 中。
CoS 为 0 的 1 Gbps 大文件传输数据流(1518-B 帧)放在 Q1 中。
交换机中的两个队列将承载 1 Gbps 数据进行传送。
这两个流需要共享相同的输出千兆位端口。假设在Q1和Q2之间配置了等权重。WRR应用于每个数据包,并且每个队列传输的数据量在两个队列之间不同。从每个队列转发出去的数据包的数量是相同的,但交换机实际发送的数据量如下所示:
第2季度的77700个每秒数据包数(pps)=(77700 x 8 x 64)位/秒(bps)(约52 Mbps)
从 Q1 发出 77700 pps = (77700 x 8 x 1500) bps(大约 948 Mbps)
如果您想在网络中为每个队列提供公平访问,请考虑每个数据包的平均大小。各数据包都期望放在一个队列中,并对权值作相应的修改。例如,如果要为四个队列中的每个队列提供相等的接入能力,以使每个队列获得 1/4 的带宽,则流量将如下所示:
在 Q1 中:尽量为 Internet 流量。假设数据流的平均数据包大小为 256 B。
在 Q2 中:由文件传输组成的备份,数据包主要为 1500 B。
在 Q3 中:视频流,放在 192 B 的数据包中。
在 Q4 中:交互式应用,主要由 64 B 的数据包组成。
这将导致如下情况:
Q1 消耗的带宽是 Q4 的 4 倍。
Q2 消耗的带宽是 Q4 的 24 倍。
Q3 消耗的带宽是 Q4 的 3 倍。
要以相等的带宽接入网络,可进行如下配置:
Q1 的权重为 6
Q2 的权重为 1
Q3 的权重为 8
Q4 的权重为 24
如果这样分配权重,当出现拥塞时四个队列将分享相等的带宽。
如果启用了严格的优先级队列,WRR 加权将在剩余的三个队列中重新分配。如果启用了严格优先队列并且没有配置 Q4,则权重为 1、2、3、4 的第一个示例将变为:
Q1 = 1/(1+2+3) = 6 个数据包中的 1 个数据包
Q2 = 6 个数据包中的 2 个数据包
Q3 = 6 个数据包中的 3 个数据包
您可以发出以下 Cisco IOS 软件 show 命令以验证队列权重:
NifNif#show mls qos interface gigabitethernet0/1 queueing GigabitEthernet0/1 QoS is disabled. Only one queue is used When QoS is enabled, following settings will be applied Egress expedite queue: dis wrr bandwidth weights: qid-weights 1 - 25 2 - 25 3 - 25 4 - 25
如果启用快速优先队列,则只有在禁用快速队列的情况下才会使用 Q4 权重。示例如下:
NifNif#show mls qos interface gigabitethernet0/1 queueing GigabitEthernet0/1 Egress expedite queue: ena wrr bandwidth weights: qid-weights 1 - 25 2 - 25 3 - 25 4 - 25 !--- The expedite queue is disabled.
WRED 只在 3550 系列交换机的千兆位端口上可用。WRED是随机早期检测(RED)的修改,用于避免拥塞。RED 定义了以下参数:
最小阈值:表示队列中的一个阈值。不会丢弃低于此阈值的数据包。
最大(最大)阈值:表示队列中的另一个阈值。高于最大阈值的所有数据包都将丢弃。
坡度:丢弃介于最小和最大阈值之间的数据包的概率。丢弃概率随数据包大小的增加呈线性(以一定斜率)增长趋势。
下图显示了 RED 队列中的掉包概率:
注意:实施RED的所有Catalyst交换机都允许您调整斜率。
在 WRED 中,会为不同服务设置权重。您可以定义标准服务和高级服务。每个服务将采用一组不同的阈值。当达到最小阈值 1 时,只会丢弃分配给标准服务的数据包。只有在达到最小阈值 2 时才开始丢弃高级服务的数据包。如果最小阈值 2 高于最小阈值 1,则所丢弃的标准服务数据包将多于高级服务的数据包。下图显示的是 WRED 的每项服务的丢弃概率示例:
注意: 3550交换机不允许您调整最小阈值,但只允许调整最大阈值。最小阈值始终硬设置为0。这会给出表示当前在3550中实施的丢弃概率。
在 3550 上启用了 WRED 的任何队列将始终具有一个非零丢弃概率,并且始终会丢弃数据包。这是因为最小阈值始终为0。如果需要避免在最大值时丢包,请使用加权尾部丢弃,Catalyst 3550交换机上的尾部丢弃部分对此进行了说明。
提示:思科漏洞ID CSCdz73556 (仅注册客户)记录了配置最小阈值的增强请求。
有关 RED 和 WRED 的详细信息,请参阅避免拥塞概述。
在 3550 上,可以使用两个不同的最大阈值配置 WRED,以提供两种不同的服务。每个阈值将分配不同类型的数据流,并且仅取决于内部 DSCP。这与只取决于数据包的 CoS 的队列分配不同。DSCP 到阈值表的映射将决定每个 64 DSCP 所对应的阈值。您可以发出以下命令查看和修改此表:
(config-if)#wrr-queue dscp-map threshold_number DSCP_1 DSCP_2 DSCP_8
例如,以下命令将 DSCP 26 分配给阈值 2:
NifNif(config-if)#wrr-queue dscp-map 2 26 NifNif#show mls qos interface gigabitethernet0/1 queueing GigabitEthernet0/1 Dscp-threshold map: d1 : d2 0 1 2 3 4 5 6 7 8 9 --------------------------------------- 0 : 01 01 01 01 01 01 01 01 01 01 1 : 01 01 01 01 01 01 02 01 01 01 2 : 01 01 01 01 02 01 02 01 01 01 3 : 01 01 01 01 01 01 01 01 01 01 4 : 02 01 01 01 01 01 02 01 01 01 5 : 01 01 01 01 01 01 01 01 01 01 6 : 01 01 01 01
在定义了 DSCP 到阈值的映射后,您选择的队列上将启用 WRED。发出以下命令:
(config-if)#wrr-queue random-detect max-threshold queue_id threshold_1 threshold_2
该示例将进行如下配置:
为 Q1 配置阈值 1 = 50%;阈值 2 = 100%
为 Q2 配置阈值 1 = 70%;阈值 2 = 100%
3550(config)#interface gigabitethernet 0/1 3550(config-if)#wrr-queue random-detect max-threshold 1 50 100 3550(config-if)#wrr-queue random-detect max-threshold 2 70 100 3550(config-if)#wrr-queue random-detect max-threshold 3 50 100 3550(config-if)#wrr-queue random-detect max-threshold 4 70 100
您可以发出以下命令以验证每个队列的排队类型(是否为 WRED):
nifnif#show mls qos interface gigabitethernet0/1 buffers GigabitEthernet0/1 .. qid WRED thresh1 thresh2 1 dis 10 100 2 dis 10 100 3 ena 10 100 4 dis 100 100
ena 表示启用,即队列使用 WRED。dis 表示禁用,即队列使用尾部丢弃。
您还可以监控每个阈值所丢弃的数据包数。发出以下命令:
show mls qos interface gigabitethernetx/x statistics
WRED drop counts:
qid thresh1 thresh2 FreeQ
1 : 327186552 8 1024
2 : 0 0 1024
3 : 37896030 0 1024
4 : 0 0 1024
尾部丢弃是 3550 的千兆位端口的默认机制。每个千兆位端口可以有两个尾部丢弃阈值。使用本文档的 Catalyst 3550 交换机上的 WRED 部分所定义的相同 DSCP 阈值映射,为每个尾部丢弃阈值分配一组 DSCP。当达到某个阈值时,将丢弃具有分配给该阈值的 DSCP 的所有数据包。您可以发出以下命令以配置尾部丢弃阈值:
(config-if)#wrr-queue threshold queue-id threshold-percentage1 threshold-percentage2
该示例将进行如下配置:
为 Q1 配置尾部丢弃阈值 1 = 50%;阈值 2 = 100%
为 Q2 配置阈值 1 = 70%;阈值 2 = 100%
Switch(config-if)#wrr-queue threshold 1 50 100 Switch(config-if)#wrr-queue threshold 2 70 100 Switch(config-if)#wrr-queue threshold 3 60 100 Switch(config-if)#wrr-queue threshold 4 80 100
3550 交换机使用中央缓冲。这意味着每个端口没有固定的缓冲区大小。但是,在千兆位端口上有固定数量的可排队数据包。该固定数量为 4096。默认情况下,不管数据包大小如何,千兆位端口中的每个队列最多可以有 1024 个数据包。不过,您可以修改这 4096 个数据包在四个队列中的拆分方式。发出以下命令:
wrr-queue queue-limit Q_size1 Q_size2 Q_size3 Q_size4
示例如下:
3550(config)#interface gigabitethernet 0/1 3550(config-if)#wrr-queue queue-limit 4 3 2 1
这些队列大小参数是相对的。该示例显示:
Q1 是 Q4 的四倍。
Q2 是 Q4 的三倍。
Q3 是 Q4 的两倍。
4096 个数据包将重新分配如下:
Q1 = [4 / (1+2+3+4)] * 4096 = 1639 个数据包
Q2 = 0.3 * 4096 = 1229 个数据包
Q3 = 0.2 * 4096 = 819 个数据包
Q4 = 0.1 * 4096 = 409 个数据包
使用以下命令可以查看拆分缓冲区在四个队列中的相对权重:
cat3550#show mls qos interface buffers GigabitEthernet0/1 Notify Q depth: qid-size 1 - 4 2 - 3 3 - 2 4 - 1 ...
您还可以发出以下命令以查看每个队列仍然可以保留的自由数据包数:
(config-if)#show mls qos interface gigabitethernetx/x statistics
WRED drop counts:
qid thresh1 thresh2 FreeQ
1 : 0 0 1639
2 : 0 0 1229
3 : 0 0 819
4 : 0 0 409
FreeQ 计数参数是动态的。FreeQ 计数器可给出最大队列大小减去队列中当前数据包数之后的值。例如,如果当前 Q1 中有 39 个数据包,则 FreeQ 计数中有 1600 个自由数据包。示例如下:
(config-if)#show mls qos interface gigabitethernetx/x statistics
WRED drop counts:
qid thresh1 thresh2 FreeQ
1 : 0 0 1600
2 : 0 0 1229
3 : 0 0 819
4 : 0 0 409
10/100-Mbps 端口上没有可用的队列管理方案(没有 WRED 或带有两个阈值的尾部丢弃)。 四个队列都是 FIFO 队列。也没有为每个千兆位端口预留 4096 个数据包的最大队列大小。10/100-Mbps 端口将在每个队列中存储数据包,直到由于缺乏资源而填满。您可以为每个队列预留一个最小数据包数。默认情况下,每个队列的最小数据包数设置为 100。如果定义了不同的最小预留值并为每个队列分配其中的一个值,则可以修改每个队列的最小预留值。
要进行此项修改,请完成下列步骤:
为每个全局最小预留值分配一个缓冲区大小。
最多可以配置八个不同的最小预留值。发出以下命令:
(Config)# mls qos min-reserve min-reserve-level min-reserve-buffersize
这些最小预留值是交换机的全局参数。默认情况下,所有最小预留值都设置为 100 个数据包。
例如,要配置 150 个数据包的最小预留级别 1 和 50 个数据包的最小预留级别 2,请发出以下命令:
nifnif(config)#mls qos min-reserve ? <1-8> Configure min-reserve level nifnif(config)#mls qos min-reserve 1 ? <10-170> Configure min-reserve buffers nifnif(config)#mls qos min-reserve 1 150 nifnif(config)#mls qos min-reserve 2 50
为每个队列分配其中一个最小预留值。
必须为每个队列分配其中一个最小预留值,以了解此队列可确保获得多少缓冲区。默认情况下,具体分配将如下所示:
Q1 分配给最小预留级别 1。
Q2 分配给最小预留级别 2。
Q3 分配给最小预留级别 3。
Q4 分配给最小预留级别 4。
默认情况下,所有最小预留值均为 100。
您可以发出以下接口命令为每个队列分配不同的最小预留值:
(config-if)#wrr-queue min-reserve queue-id min-reserve-level
例如,要为 Q1 分配最小预留级别 2,为 Q2 分配最小预留级别 1,请发出以下命令:
nifnif(config)#interface fastethernet 0/1 nifnif(config-if)#wrr-queue min-reserve ? <1-4> queue id nifnif(config-if)#wrr-queue min-reserve 1 ? <1-8> min-reserve level nifnif(config-if)#wrr-queue min-reserve 1 2 nifnif(config-if)#wrr-queue min-reserve 2 1
您可以发出以下命令以验证所获得的最小预留分配情况:
nifnif#show mls qos interface fastethernet0/1 buffers FastEthernet0/1 Minimum reserve buffer size: 150 50 100 100 100 100 100 100 !--- This shows the value of all eight min reserve levels. Minimum reserve buffer level select: 2 1 3 4 !--- This shows the min reserve level that is assigned to !--- each queue (from Q1 to Q4).
3550 上的端口的排队和调度涉及以下步骤:
为每个队列分配一个 CoS。
需要时启用严格优先队列。
分配 WRR 权重,并考虑队列中的预期数据包大小。
修改队列大小(仅限千兆位端口)。
启用队列管理机制(尾部丢弃或 WRED,仅限千兆位端口)。
正确的排队和调度可以减少语音/视频数据流的延迟/抖动,并避免关键任务数据流损失。请确保遵循下列指导原则以获得最佳调度性能:
使用信任或特定标记将网络中的数据流划分为不同类别。
监察超额流量。