2. Arista EOS QoS核心组件

在 Arista EOS 中,QoS 并不是一个单一开关,而是由一组彼此协作的对象共同构成的策略链。理解这条链上每个对象的职责、配置入口以及它们之间的先后关系,是后续做拥塞治理和队列调优的基础。本节围绕六个核心对象展开:队列(Queue)、调度器(Scheduler)、缓存管理(Buffer / WRED)、流分类(Class Map)、标记与重标记(Mark / Remark),以及把它们串起来的 Policy Map。

一、EOS QoS 的处理链与对象关系

数据包进入 EOS 交换芯片后,QoS 处理遵循一条固定的方向链:先分类,再标记或重标记,然后按映射关系进入某个出口队列,最后由调度器和缓存管理决定“谁先发、发多少、满了怎么办”。这条链的方向性非常重要——分类和标记发生在入向或策略入口,队列和调度发生在出向,缓存管理则作用于队列的排队过程。

EOS QoS 对象处理链(入向 → 出向) 入向报文 DSCP / CoS / 五元组 流分类 Class Map match dscp / cos / acl class-map type qos 标记 / 重标记 set dscp / set cos policy-map type qos 队列映射 qos map cos-dscp → 出口 Queue 0-7 出口端口 egress 调度器 Scheduler strict-priority / WRR bandwidth / shape 缓存管理 Buffer queue-limit / WRED threshold / drop-prob 出口队列 Queue 0-7 每队列独立缓存 Policy Map 绑定入口:service-policy type qos input / output 接口 / 全局 / 控制平面 三种挂载位置决定策略生效范围

图中虚线表示“策略对象定义”与“出向执行对象”之间的关联:Class Map 和 Policy Map 负责定义规则,Scheduler、Buffer、Queue 负责在出向真正执行。理解这一点,就能明白为什么只配了 class-map 却没有效果——策略没有被 service-policy 挂载到接口上。

二、队列与调度器:决定“谁先发”

EOS 每个物理端口通常提供 8 个单播出口队列(Queue 0~7),队列号越大优先级越高。队列本身只是缓冲区,真正决定发送顺序的是调度器。EOS 支持两类主要调度方式:严格优先级(Strict Priority)和加权轮询(WRR / DWRR)。严格优先级保证高优先级队列只要非空就优先发送,适合承载控制平面和低时延业务;WRR 按权重比例分配带宽,避免低优先级队列被饿死。

调度器的配置入口是 policy-map type queuing,在 class 内使用 priority 或 bandwidth 声明。例如把 Queue 7 设为严格优先级并限速,把 Queue 0~3 设为 WRR 权重 10:20:30:40:

policy-map type queuing QOS-OUT
   class class-default
      bandwidth percent 40
   class Q7-PRIORITY
      priority level 1
      shape rate 2 gbps
   class Q0-Q3-WRR
      bandwidth remaining percent 10

这里 priority level 1 表示第一级严格优先级,shape rate 对高优先级队列做速率整形,防止它无限制抢占。WRR 权重之和不必等于 100,EOS 会按相对比例换算。

三、缓存管理与 WRED:决定“满了怎么办”

队列缓存是共享资源。如果某个队列无限占用缓存,其他队列就会丢包。EOS 通过 queue-limit 限制单队列缓存上限,通过 WRED(加权随机早期检测)在队列尚未完全满时按概率提前丢弃低优先级流量,从而让 TCP 有机会降速,避免全局同步。

WRED 的关键参数是最小阈值、最大阈值和最大丢弃概率。当队列深度低于最小阈值时不丢包;介于两阈值之间时按线性递增概率丢弃;超过最大阈值时全部丢弃。示例配置:

policy-map type queuing QOS-OUT
   class Q0-Q3-WRR
      bandwidth remaining percent 10
      random-detect
      random-detect ecn
      queue-limit 2048 packets

其中 random-detect ecn 表示对支持 ECN 的流量做标记而非直接丢弃,这对 RoCE 等无损网络尤为关键。

四、流分类与标记/重标记:决定“谁进哪个队列”

流分类使用 class-map type qos 定义匹配条件,常见匹配字段包括 DSCP、CoS、ACL、VLAN、协议端口等。标记与重标记在 policy-map type qos 中通过 set dscp、set cos 完成。典型场景是:信任边缘设备已标记的 DSCP,对不可信流量重新标记,再映射到出口队列。

class-map type qos match-any VOICE
   match dscp ef
class-map type qos match-any BULK
   match dscp af11

policy-map type qos QOS-IN
   class VOICE
      set dscp ef
      set cos 5
   class BULK
      set dscp af11
      set cos 1

配置完成后,用 show qos maps 查看 DSCP 到队列的映射关系,用 show policy-map interface 查看各 class 的匹配计数和丢弃统计。如果匹配计数为 0,说明分类条件没有命中,需要检查 ACL 或 DSCP 值是否与实际上送报文一致。

EOS 中 QoS 策略的生效顺序是:接口入向 service-policy → 分类/标记 → 队列映射 → 出向调度/缓存 → 接口出向 service-policy。排查时按这个顺序逐段确认,比盲目改配置更高效。

五、六个对象的配置入口速查

对象配置入口关键命令
流分类class-map type qosmatch dscp / cos / acl
标记/重标记policy-map type qosset dscp / set cos
队列映射qos map cos-dscp / dscp-cosshow qos maps
调度器policy-map type queuingpriority / bandwidth / shape
缓存管理policy-map type queuingqueue-limit / random-detect
策略挂载interface / system qosservice-policy type qos input/output

掌握这六个对象及其入口后,后续做具体队列调优时就能快速定位:是分类没命中、标记被覆盖、队列映射错位,还是调度权重和缓存阈值设置不合理。建议在实验环境中先用 show policy-map interface 和 show queue 观察基线,再逐步调整参数并对比丢弃计数变化。