4. 流量调度与时间感知整形器

在工业现场,周期控制流量的确定性时延不能依赖“尽力而为”的排队转发。IEEE 802.1Qbv 时间感知整形器(Time-Aware Shaper, TAS)的核心思想是:把出端口队列的“开门/关门”动作绑定到全局时间轴上,让关键周期帧只在被分配的时间窗口内发送,从而避免与突发流量争抢链路。理解 TAS,关键是理解三个对象:门控列表(Gate Control List, GCL)、周期时间(Cycle Time)和各队列的门状态。

一、门控列表的结构与时间语义

每个出端口有 8 个队列(Traffic Class 0~7)。TAS 为每个队列维护一个门,门只有“开(o)”和“关(C)”两种状态。GCL 是一张按时间顺序排列的条目表,每条目包含:时间间隔和8 个门的状态位图。交换机按周期循环执行 GCL,周期起点由 gPTP 同步的全局时间对齐。

例如一个 1 ms 的调度周期,可划分为三个窗口:

  • 0~300 μs:仅队列 7 开门,用于最高优先级周期控制帧;
  • 300~700 μs:仅队列 6 开门,用于次高优先级周期帧;
  • 700~1000 μs:队列 0~5 开门,承载非周期/尽力而为流量。

这样,队列 7 的帧不会因为队列 0~5 的长帧正在发送而被阻塞——因为当队列 7 的门打开时,其它门是关闭的,链路只服务于队列 7。这就是 TAS 消除排队抖动的机制。

二、保护带与“帧不能跨窗口”约束

门关闭时,若链路上正在发送一个低优先级长帧,该帧不会被打断,会继续占用链路直到发送完毕,从而侵占下一个高优先级窗口。为避免这种侵占,需要在窗口切换前插入保护带(Guard Band)。保护带长度至少等于最大帧的传输时间。以 100 Mbps 链路、1500 字节最大帧为例,传输时间约 123 μs。因此实际可用窗口 = 分配窗口 − 保护带。

若保护带不足,高优先级窗口会被上一窗口的残余帧“吃掉”,表现为周期流量时延出现周期性尖峰。设计 GCL 时必须先算最大帧传输时间,再确定保护带。

三、Intel 平台上的 TAS 配置路径

在 Intel 以太网控制器(如 i225/i226、E810 系列)上,TAS 通常通过 tc 的 taprio qdisc 配置。以下示例在 enp3s0 上建立一个 1 ms 周期、三个窗口的调度:

tc qdisc replace dev enp3s0 parent root handle 100 taprio \
  num_tc 3 \
  map 0 0 0 0 0 0 1 2 \
  queues 1@0 1@1 1@2 \
  base-time 0 \
  sched-entry S 0x80 300000 \
  sched-entry S 0x40 400000 \
  sched-entry S 0x3F 300000 \
  flags 0x2

其中 map 把优先级 0~5 映射到 TC0、优先级 6 映射到 TC1、优先级 7 映射到 TC2;sched-entry S 0x80 300000 表示门位图 0x80(仅 bit7 开)持续 300000 ns;0x40 仅 bit6 开;0x3F 低 6 位开。flags 0x2 启用保护带。配置后可用 tc qdisc show dev enp3s0 查看 GCL 是否生效。

四、测量确定性时延

测量需要发送端与接收端共享 gPTP 时间。常用做法:发送端用 SO_TXTIME 在指定时刻发送带时间戳的 UDP 帧,接收端记录到达时间,计算单向时延。判断 TAS 是否有效的关键指标不是平均时延,而是时延抖动(jitter)和最大时延。若抖动从数百微秒降到几微秒,说明周期帧已落在专属窗口内。

IEEE 802.1Qbv 门控列表与周期窗口示意(1 ms 周期) 0 μs 300 μs 700 μs 1000 μs 队列7 开门 300 μs 周期控制帧 队列6 开门 400 μs 次高优先级周期帧 队列0~5 开门 300 μs 尽力而为流量 保护带 保护带 门状态位图(GCL 条目) 时间窗口 门位图 队列7 队列6 队列0~5 0~300 μs 0x80 开 关 关 300~700 μs 0x40 关 开 关 700~1000 μs 0x3F 关 关 开

五、配置检查与常见问题

配置完成后,建议按以下顺序验证:

  1. 确认 gPTP 已同步:pmc -u -b 0 'GET TIME_STATUS_NP' 查看 offset 是否在亚微秒级;
  2. 确认 taprio 已挂载:tc qdisc show dev enp3s0 应显示 taprio 及 GCL 条目;
  3. 用 ethtool -S enp3s0 观察各队列发送计数,确认高优先级队列只在对应窗口增长;
  4. 用接收端时间戳统计时延分布,重点看 P99 与最大值。
若发现高优先级帧仍被延迟,优先检查三点:保护带是否足够覆盖最大帧、gPTP 是否稳定、以及 map 是否把关键优先级正确映射到了独立 TC。TAS 的效果高度依赖时间同步质量,同步抖动会直接转化为窗口错位。

总结来说,TAS 不是“调优先级”,而是“按时间开门”。GCL 是调度契约,保护带是安全边界,gPTP 是时间基准,三者缺一不可。在 Intel 平台上用 taprio 落地后,通过时延抖动而非平均时延来判断确定性是否真正达成。