3. 流量调度模型差异(CBS vs Qbv)
好,咱们来聊聊TSN里最核心的一个话题——流量调度。工业场景和车载场景,虽然都叫TSN,但调度逻辑完全是两套思路。我最早接触车载TSN时,就踩过这个坑,以为工业那套CBS直接搬过去就行,结果发现根本跑不通。
为什么会这样?说白了,工业网络追求的是“公平”,车载网络追求的是“确定”。一个像公交车,大家排队上车;另一个像高铁,准时准点发车。咱们今天就把这两个模型掰开揉碎讲清楚。
3.1 工业CBS(Credit-Based Shaper)原理
CBS,全称Credit-Based Shaper,基于信用的整形器。我习惯叫它“积分调度”。
它的核心思想很简单:每个流都有一个“信用值”。发送数据时,信用值减少;等待时,信用值增加。信用值不能为负,也不能超过上限。说白了,就是谁攒的积分多,谁就先发。
关键参数:
- idleSlope:空闲时信用值增加的速度(单位:bits/s)
- sendSlope:发送时信用值减少的速度(单位:bits/s)
- hiCredit:信用值上限
- loCredit:信用值下限(通常为0)
我在一个工业视觉检测项目中遇到过这种情况:多台相机同时上传图像,如果不用CBS,带宽全被一台相机抢走,其他相机直接超时。用了CBS后,每台相机都能分到合理的带宽,虽然单台速度慢了,但整体系统稳定了。
CBS的数学模型是这样的:
// 信用值更新逻辑(简化版)
if (队列非空 && 信用值 >= 0) {
发送一个帧;
信用值 -= sendSlope * 帧长;
} else {
信用值 += idleSlope * 时间间隔;
信用值 = min(信用值, hiCredit);
}
嗯,这里要注意:CBS只保证带宽分配,不保证延迟上限。你想想看,如果多个CBS流同时竞争,高优先级的流可能会让低优先级的流等很久。所以工业场景里,CBS通常配合优先级队列一起用。
避坑指南:我曾经把CBS的idleSlope设得太大,结果信用值涨得飞快,发送时又降不下来,导致网络抖动特别大。建议idleSlope和sendSlope的比例控制在1:2到1:4之间。
3.2 车载Qbv(Time-Aware Shaper)门控调度
车载场景就不一样了。你想想,自动驾驶的刹车指令,能等吗?不能。所以车载TSN用了另一种思路——Qbv,也叫时间感知整形器。
Qbv的核心是“门控列表”(Gate Control List,GCL)。每个队列前面有个门,门开才能发,门关就等着。门什么时候开?由GCL精确控制,精度能达到纳秒级。
我参与过一个ADAS项目,要求摄像头数据从采集到显示,延迟不能超过2毫秒。用CBS根本做不到,因为CBS的延迟是统计意义上的。但Qbv可以——只要把摄像头流的发送时间窗精确排好,延迟就是确定的。
GCL的配置示例:
// GCL配置(8个队列,周期100μs)
// 时间单位:纳秒
GCL = [
{ time: 0, gates: [1,0,0,0,0,0,0,0] }, // 队列0开门,发控制流
{ time: 20000, gates: [0,1,1,0,0,0,0,0] }, // 队列1和2开门,发传感器流
{ time: 50000, gates: [0,0,0,1,1,1,1,1] }, // 其他队列开门,发尽力而为流
{ time: 100000, gates: [1,0,0,0,0,0,0,0] }, // 周期结束,回到起点
];
说白了,Qbv就是把时间切成片,每个时间片只允许特定类型的流量通过。这样做的好处是延迟完全确定,坏处是带宽利用率可能不高——如果某个时间片里没有数据,那段时间就浪费了。
注意:Qbv要求全网所有设备的时钟必须同步,误差不能超过1微秒。我曾经在测试时发现,两台交换机的时钟偏差了500纳秒,结果门控时间错位,数据全丢了。所以802.1AS(gPTP)时间同步是Qbv的前提,千万别忽略。
3.3 混合流量调度策略
现实中的网络,往往是工业流和车载流混在一起的。比如一个智能工厂里,既有工业控制流(需要CBS的公平性),又有车载AGV的导航流(需要Qbv的确定性)。怎么办?
我个人习惯的做法是:分层调度。
第一层:Qbv做时间隔离。先把时间切成大块,比如前30%的时间给车载流,后70%的时间给工业流。这样两类流量在时间上就不冲突了。
第二层:CBS做带宽分配。在工业流的时间片里,再用CBS给不同的工业流分配带宽。在车载流的时间片里,可以用优先级队列或者CBS进一步细分。
我做过一个混合调度的项目,配置大概是这样的:
| 时间片 | 时长 | 允许的流量 | 内部调度 |
|---|---|---|---|
| 时间片0 | 30μs | 车载控制流(Qbv) | 严格优先级 |
| 时间片1 | 50μs | 工业传感器流(CBS) | CBS + 优先级 |
| 时间片2 | 20μs | 尽力而为流 | 无调度 |
你想想看,这样做的好处是什么?车载流得到了确定的延迟,工业流得到了公平的带宽,两者互不干扰。当然,代价是配置复杂度上去了——你得同时懂Qbv和CBS,还得会调GCL和信用参数。
我的经验:混合调度时,建议先用仿真工具(比如OMNeT++或ns-3)跑一遍,看看有没有时间片重叠或者信用值溢出的情况。我曾经直接在硬件上调试,结果烧了一块交换机的FPGA配置,教训深刻。
最后总结一下:CBS适合带宽敏感、延迟不敏感的场景;Qbv适合延迟敏感、带宽可以牺牲的场景。混合调度时,用Qbv做宏观时间隔离,用CBS做微观带宽分配。嗯,这个思路基本能覆盖90%的工业与车载融合场景。