4. 队列调度机制深入
队列调度决定的是“当多个队列同时有报文等待发送时,谁先出、谁出多少”。在 Arista EOS 上,调度器挂在每个出接口的队列组上,配合整形器(shaper)和缓存门限共同决定实际转发行为。理解 SP、WRR、DWRR 以及混合调度的差异,是设计存储、计算、管理三类流量策略的基础。
一、四种调度机制的行为本质
SP(Strict Priority,严格优先级):调度器永远先服务最高优先级的非空队列,只有高优先级队列为空时才向下服务。它的优点是时延确定、抖动小;缺点是低优先级队列可能被持续压制,出现“饿死”。在 Arista 上,SP 通常用于承载控制平面、存储同步确认这类对时延极敏感的流量。
WRR(Weighted Round Robin,加权轮询):调度器按权重比例轮流从各队列取报文。权重 3:1 表示每轮队列 A 取 3 个报文、队列 B 取 1 个。WRR 的缺陷在于它按“报文个数”轮询,若各队列平均报文长度差异大,实际带宽比例会偏离权重设定。
DWRR(Deficit Weighted Round Robin,差额加权轮询):DWRR 引入“差额计数器(deficit)”,按字节而非报文数计量。每轮给队列增加与其权重成正比的信用值,队列发送报文时按字节扣减信用,信用不足则等待下一轮。这样即使报文长度不一,长期带宽比例仍能贴合权重,是数据中心最常用的公平调度方式。
混合调度:Arista 允许在同一接口上把部分队列设为 SP、其余设为 WRR/DWRR。典型做法是把最高优先级队列(如存储确认、控制协议)设为 SP,其余业务队列用 DWRR 按权重分配剩余带宽。这样既保证关键流量低时延,又避免普通流量被完全饿死。
二、Arista 上的配置落点
在 EOS 中,调度策略通过 qos profile 或接口级 tx-queue 配置实现。以下示例把 Q7 设为 SP,Q5/Q3/Q0 设为 DWRR,权重分别为 4/2/1,并给 Q7 加一个 2 Gbps 的整形上限,防止存储确认流量突发挤占全部带宽:
interface Ethernet1
tx-queue 7
priority strict
shape rate 2 gbps
tx-queue 5
bandwidth percent 40
tx-queue 3
bandwidth percent 20
tx-queue 0
bandwidth percent 10
no shutdown
这里的 bandwidth percent 在 EOS 中即映射为 DWRR 权重比例。注意:当接口同时存在 SP 和 DWRR 队列时,SP 队列先被服务,DWRR 队列共享剩余带宽。因此权重百分比是“剩余带宽中的相对比例”,不是接口总带宽的绝对比例。
三、三类流量的调度策略设计
存储流量:NVMe over RoCE、iSCSI 等存储流量对丢包和时延敏感,但数据面本身吞吐大。建议把存储确认/控制类小包放入 SP 队列(Q7),存储数据面放入 DWRR 高权重队列(Q5 或 Q3)。SP 队列必须配整形,否则存储确认突发会压制所有其他队列。
计算流量:东西向计算流量(如 RDMA、分布式训练)通常是大象流,适合 DWRR 中等权重。若计算流量与存储流量共享接口,建议计算权重略低于存储数据面,避免计算突发影响存储同步。
管理流量:SSH、SNMP、Syslog、带外管理对带宽需求小,但对可用性要求高。放入最低权重 DWRR 队列(Q0),权重 1 即可。关键是保证它不会被完全饿死——DWRR 的信用机制天然提供了最低带宽保障。
tx-queue 统计:若低优先级队列的 out-discards 持续增长而高优先级队列空闲,说明权重或整形设置过紧;若 SP 队列长期占满且低队列几乎无输出,说明 SP 队列缺少整形约束。四、参数关系与调优判断
调度效果不是孤立的,它和整形器、缓存门限共同作用。一个实用的检查顺序是:先确认 SP 队列是否有 shape rate 上限,再看 DWRR 权重之和是否与预期带宽比例一致,最后检查各队列的 tx-queue 丢弃计数。若某队列持续丢弃但接口总带宽未跑满,通常是该队列的缓存门限或权重过低,而不是物理带宽不足。
举例来说,假设接口 10 Gbps,Q7 SP 整形 2 Gbps,剩余 8 Gbps 由 Q5/Q3/Q0 按 4:2:1 分配,则 Q5 约 4.57 Gbps、Q3 约 2.29 Gbps、Q0 约 1.14 Gbps。这个计算是设计阶段的合理估算,实际值会因报文长度、突发和缓存行为略有偏差,应以接口计数器为准。
总结来看,SP 解决“谁最急”,DWRR 解决“谁分多少”,混合调度解决“既要急又要公平”。在 Arista 上落地时,先给最敏感的存储确认和控制协议留出 SP 通道并整形,再用 DWRR 权重把剩余带宽按存储数据面 > 计算 > 管理的顺序分配,最后用队列计数验证是否出现异常丢弃或饿死,就能形成一套可运行、可观察、可调整的调度策略。