4. 策略映射与队列调度

在 Nexus 平台上,QoS 的执行核心是 policy-map。它把前面分类阶段打上的标记(DSCP、CoS、ACL 结果)翻译成对队列的具体动作:哪些流量进哪个队列、队列之间如何分配带宽、谁先被调度、超出速率后是丢弃还是缓存。理解 policy-map 的关键,是把它看成“队列调度策略的声明”,而不是单纯的匹配规则集合。

policy-map 的三种类型与作用位置

Nexus 的 policy-map 按作用对象分为三类:type qos 用于分类与标记,type queuing 用于队列带宽与调度,type network-qos 用于全局队列行为(如队列数量、缓冲、PFC)。本节聚焦 queuing 类型,它通过 class-map type queuing 匹配系统内部队列(如 class-default、q1~q7),再在 policy-map 中为每个队列指定调度方式。

一个典型的 queuing policy-map 结构如下:

policy-map type queuing QUEUE-SCHED
  class type queuing c-out-q1
    priority level 1
  class type queuing c-out-q2
    bandwidth remaining percent 30
  class type queuing c-out-q3
    bandwidth remaining percent 20
  class type queuing c-out-q4
    bandwidth remaining percent 50
  class type queuing class-default
    bandwidth remaining percent 0

这里 c-out-q1 是系统队列 1,通常承载控制面或低时延业务;priority level 1 表示把它设为严格优先级队列(PQ)。其余队列使用 bandwidth remaining percent,即“剩余带宽百分比”,这是 Nexus 队列调度中最常用的带宽保障方式。

优先级队列:严格优先与低时延保障

优先级队列(PQ)的调度逻辑是:只要 PQ 中有报文,调度器就优先发送它,其他队列必须等 PQ 清空后才能获得服务。这带来两个直接后果:一是时延和抖动极低,适合语音、存储控制、FCoE 等对时延敏感的业务;二是如果 PQ 流量不加限制,会饿死其他队列。因此 Nexus 在配置 PQ 时通常要求配合 priority level 和队列限速,或使用 bandwidth remaining percent 为 PQ 之外的队列保留最低份额。

在 Nexus 9000 的默认模板中,队列 1 常被预留给控制流量,队列 7 或队列 3 用于优先级业务。实际部署时,建议只设置一个严格优先级队列,避免多个 PQ 之间互相抢占导致调度行为不可预测。

加权轮询与剩余带宽分配

非优先级队列之间采用加权轮询(WRR 或 DWRR)。权重由 bandwidth remaining percent 决定,含义是:在满足 PQ 和最小带宽保障后,剩余带宽按各队列的百分比权重分配。例如上例中 q2、q3、q4 的权重为 30:20:50,若剩余带宽为 10 Gbps,则三者分别获得 3 Gbps、2 Gbps、5 Gbps 的调度份额。

需要注意,bandwidth remaining percent 是相对权重,不是绝对限速。如果某个队列没有流量,它的份额会被其他有流量的队列按比例占用,这正是“剩余带宽”动态分配的意义。若希望某队列获得固定下限,应使用 bandwidth percent 或 bandwidth guaranteed 类配置,但 Nexus 上更常见的是 remaining 方式。

整形与限速:把突发流量管住

调度解决的是“谁先发”,整形和限速解决的是“发多快”。整形(shaping)对超出速率的报文进行缓存,等令牌桶恢复后再发送,因此会引入额外时延但减少丢弃;限速(policing)对超出速率的报文直接丢弃或降级标记,时延小但可能丢包。Nexus 的 queuing policy 中常用 shape 对队列做整形,例如:

policy-map type queuing SHAPE-Q
  class type que queuing c-out-q3
    shape min 500 mbps max 2 gbps

这表示队列 3 的发送速率被限制在 500 Mbps 到 2 Gbps 之间,突发时最多缓存到 2 Gbps 对应的令牌桶深度。对于跨数据中心互联或租户带宽隔离场景,整形比限速更友好,因为它保留了 TCP 的突发特性,减少不必要的重传。

带宽保障与剩余带宽的配合关系

一个完整的队列调度策略通常同时包含三类动作:PQ 保障低时延、bandwidth remaining 保障各队列的相对份额、shape 限制单队列最大速率。三者配合时,调度顺序是:先满足 PQ,再按 remaining 权重分配剩余带宽,最后对每个队列施加整形上限。下图展示了这一调度关系与数据流向。

Nexus 队列调度与带宽分配关系 入向流量 语音 / 控制 存储 / FCoE 业务应用 普通数据 默认流量 系统队列 q1 PQ 严格优先 q2 remaining 30% q3 remaining 20% q4 remaining 50% default remaining 0% 队列调度器 1. PQ 优先发送 2. 剩余带宽按权重 3. 每队列整形上限 WRR / DWRR + Shaping + Priority 出向接口 按调度结果 发送报文 总速率 ≤ 接口带宽 调度顺序:PQ 优先 → 剩余带宽按 remaining 权重分配 → 每队列整形限制最大发送速率

图中可以看到,PQ 队列在调度器中拥有最高优先级,但它的发送速率仍受整形约束;非 PQ 队列按 remaining 百分比分享剩余带宽;默认队列权重为 0,意味着它只在其他队列空闲时才能发送,适合承载尽力而为流量。

配置检查与结果判断

配置完成后,可用以下命令验证队列调度是否生效:

show policy-map type queuing QUEUE-SCHED
show interface ethernet 1/1 queuing
show queuing interface ethernet 1/1

重点观察每个队列的 tx 计数、丢弃计数和当前速率。如果 PQ 队列持续满速而其他队列几乎无发送,说明 PQ 流量过大,需要检查分类是否把过多流量误标为高优先级;如果某队列丢弃计数持续增长,说明整形上限偏低或该队列权重不足,需要调整 shape 或 bandwidth remaining 参数。

建议在变更前先用 show queuing interface 记录基线,变更后再对比各队列的发送速率和丢弃计数,避免仅凭配置回显判断效果。

总结来说,policy-map 是 Nexus QoS 的执行入口,优先级队列负责低时延,加权轮询负责带宽公平,整形负责速率上限,三者共同构成队列调度的完整闭环。理解它们之间的先后关系,比记住单条命令更重要。