3. QoS核心机制:分类与标记、监管与整形、拥塞管理、拥塞避免

好,咱们今天聊聊QoS的四大核心机制。说实话,这四块东西就像是交换芯片的交通警察、收费站、红绿灯和限流闸。我做了十几年芯片设计,见过太多因为QoS没做好导致整板挂掉的案例。嗯,咱们一个一个来拆。

3.1 分类与标记:给报文贴标签

分类是QoS的第一步。说白了,你得先认出这个报文是谁,才能决定怎么对待它。

我个人习惯把分类分成两层:

  • 粗分类:看IP五元组、DSCP、VLAN优先级。硬件上做个TCAM查找,一拍子搞定。
  • 细分类:深度包检测,看应用层特征。这个费资源,我一般只在入口做一次。

标记呢,就是把分类结果写进报文内部。常见的有:

  • 修改DSCP字段(IP层)
  • 修改802.1p优先级(二层)
  • 打上内部优先级标签(芯片内部用)

重要:标记一定要在入方向做。我曾经见过一个方案,在出方向才做标记,结果内部调度全乱套了。你想想看,调度器都不知道这个包是什么优先级,怎么调度?

3.2 监管与整形:管住流量别越界

监管和整形,很多人搞混。我简单说:

  • 监管:超了就丢,或者降级。像交警开罚单,当场处理。
  • 整形:超了就缓存,等带宽空闲再发。像收费站排队,慢慢过。

硬件实现上,最经典的是令牌桶算法。我画个图给你看:

令牌桶 容量 CIR 令牌生成速率 CBS 报文 有令牌? 转发 丢弃/降级 图:令牌桶监管模型

代码实现上,我习惯用这种伪代码描述硬件逻辑:

// 令牌桶更新(每个时钟周期执行)
if (token_count + rate_increment <= bucket_size) {
    token_count += rate_increment;
} else {
    token_count = bucket_size;  // 桶满了,令牌溢出
}

// 报文到达时判断
if (packet_length <= token_count) {
    token_count -= packet_length;  // 消耗令牌,放行
    forward_packet();
} else {
    drop_or_mark(packet);  // 令牌不够,处理
}

实战技巧:我在做100G芯片时,发现令牌桶的更新频率很关键。如果更新太慢,流量会忽大忽小。我建议用每拍更新一次,而不是每包更新一次。这样精度高很多。

3.3 拥塞管理:排队是个技术活

拥塞管理,说白了就是怎么排队。硬件上最常用的是:

  • 严格优先级:高优先级的先走,低优先级的饿死。适合控制面流量。
  • 加权轮询:每个队列按权重分带宽。适合数据面流量。
  • 混合调度:先严格优先级,再加权轮询。我大部分项目都用这个。

举个例子,8个队列的调度器:

队列 优先级 权重 典型用途
Q7 最高 - 控制面协议报文
Q6 50% 视频/语音
Q5 30% 关键数据
Q4-Q0 20% 尽力而为

你想想看,如果不用权重,低优先级流量可能永远发不出去。我在一个数据中心项目里就吃过这个亏——背景流量被饿死,导致监控系统收不到数据。

3.4 拥塞避免:在崩溃前踩刹车

拥塞避免和拥塞管理不一样。管理是已经堵了怎么办,避免是快堵了怎么办。

最经典的算法是WRED(加权随机早期检测)。它的逻辑是:

  • 队列深度越深,丢包概率越大
  • 不同优先级,丢包曲线不同
  • 高优先级队列,丢包阈值更高

注意:WRED的参数调不好,反而会出问题。我曾经遇到一个案例,WRED阈值设得太低,导致正常流量也被随机丢弃,业务直接降级。后来我把最小阈值从40%改到70%,问题就解决了。

硬件实现上,WRED需要维护每个队列的平均深度。我一般用指数加权移动平均:

// 平均队列深度更新
avg_q_depth = (1 - 1/2^n) * avg_q_depth + (1/2^n) * current_q_depth;

// 丢包概率计算
if (avg_q_depth > min_th) {
    drop_prob = (avg_q_depth - min_th) / (max_th - min_th) * max_drop_prob;
    if (random() < drop_prob) {
        drop_packet();
    }
}

嗯,这里要注意:随机数生成器在硬件里很贵。我一般用LFSR(线性反馈移位寄存器)来模拟随机,面积小,够用。

小结

这四大机制,环环相扣。分类标记是基础,监管整形是入口控制,拥塞管理是调度策略,拥塞避免是最后的防线。我做过的芯片里,QoS模块往往占整个流水线逻辑的30%以上。别小看它,调好了能让芯片性能翻倍,调不好就是灾难。

下次咱们聊聊具体的硬件流水线设计,怎么把这些机制串起来。


专注资料整理