2、OVS QoS架构:Ingress与Egress策略、QoS与Queue的关系

好,咱们进入第二章。这一章我打算把OVS的QoS架构彻底讲透。说实话,很多新手甚至老手,在配置QoS时都容易搞混一个概念——Ingress和Egress到底怎么区分?QoS和Queue又是什么关系?

我记得刚接触OVS那会儿,也在这上面栽过跟头。明明配了限速,结果流量还是跑得飞起。后来一查,原来是策略方向搞反了。嗯,今天咱们就把这些坑一个个填平。

2.1 什么是Ingress和Egress?

先看两个基本概念。Ingress,指的是流量进入交换机的方向。Egress,是流量离开交换机的方向。你想想看,一个数据包从物理网卡进来,经过OVS处理,再从另一个端口出去——进来的方向就是Ingress,出去的方向就是Egress。

在OVS里,这两个方向的处理方式完全不同。

  • Ingress策略:在数据包进入OVS端口时生效。说白了,就是限制“谁可以进来,进来多少”。
  • Egress策略:在数据包离开OVS端口时生效。说白了,就是控制“出去的速度和优先级”。

我个人习惯把Ingress比作“门卫”,Egress比作“交警”。门卫管你能不能进门,交警管你出门后怎么走、走多快。

核心要点:OVS的QoS限速主要针对Egress方向。Ingress方向虽然也有策略,但功能相对有限,通常用police( policing)来实现。

2.2 Ingress策略:police机制

Ingress方向,OVS用的是police机制。它不像Egress那样有复杂的队列调度,而是简单粗暴——超过速率,直接丢包或标记。

我曾经在一个数据中心项目里,遇到过虚拟机疯狂发包导致宿主机CPU飙升的问题。排查了半天,发现是Ingress方向没有做任何限制。后来加了police规则,问题立刻解决。

配置示例:

# 创建一个ingress policing规则,限制入方向速率100Mbps
ovs-vsctl set Interface eth0 ingress_policing_rate=100000
ovs-vsctl set Interface eth0 ingress_policing_burst=10000

这里要注意两个参数:

  • ingress_policing_rate:速率限制,单位Kbps。100000就是100Mbps。
  • ingress_policing_burst:突发大小,单位Kb。允许短时间超过限制的流量。

避坑指南:我曾经遇到过一个问题——配置了ingress_policing_rate,但流量还是能超过限制。后来发现,burst值设得太大了。burst相当于一个“缓冲池”,如果设得太大,短时间内的突发流量就能绕过限制。建议burst设为rate的10%左右。

2.3 Egress策略:QoS与Queue

Egress方向才是OVS QoS的重头戏。这里涉及两个核心概念:QoSQueue

说白了,QoS是一个“容器”,Queue是容器里的“格子”。一个QoS可以包含多个Queue,每个Queue有不同的优先级和带宽保证。

概念 作用 类比
QoS 定义端口的流量整形策略 交通规则
Queue 定义具体的队列参数(速率、优先级) 车道

我习惯这样理解:QoS就像一条高速公路的管理规则,Queue就是上面的快车道、慢车道、应急车道。每条车道有各自的限速和通行权限。

2.4 QoS的类型

OVS支持两种主要的QoS类型:

  • linux-htb:层级令牌桶(Hierarchical Token Bucket)。支持多层队列,可以精细控制带宽分配。我个人最常用这个。
  • linux-hfsc:分层公平服务曲线(Hierarchical Fair Service Curve)。延迟控制更好,但配置复杂一些。

配置示例:

# 创建一个HTB QoS,限制总带宽为1Gbps
ovs-vsctl set Port br0 qos=@newqos \
  -- --id=@newqos create QoS type=linux-htb \
     other-config:max-rate=1000000000 \
     queues=0=@q0,1=@q1 \
  -- --id=@q0 create Queue other-config:min-rate=500000000 \
  -- --id=@q1 create Queue other-config:min-rate=200000000

这段代码做了三件事:

  1. 创建了一个QoS对象,类型是linux-htb,总带宽1Gbps。
  2. 创建了两个Queue:q0最小保证500Mbps,q1最小保证200Mbps。
  3. 把这两个Queue绑定到QoS上。

小技巧:min-rate是最小保证带宽,max-rate是最大限制带宽。如果你只设min-rate不设max-rate,队列可以借用空闲带宽。这在流量波动大的场景下很实用。

2.5 QoS与Queue的关系

这个关系其实很简单:一个QoS管理多个Queue。QoS负责整体调度,Queue负责具体执行。

你想想看,如果没有Queue,QoS就是一个空壳子,没法区分不同流量。如果没有QoS,Queue就是散兵游勇,没有统一调度。

我记得有一次帮客户排查网络延迟问题。他们配置了QoS,但所有流量都走同一个Queue。结果视频会议和文件下载互相抢带宽,延迟高得离谱。后来我把流量分到不同Queue,视频走高优先级队列,下载走低优先级,问题立刻解决。

映射关系如下:

Port (br0)
  └── QoS (linux-htb, max-rate=1Gbps)
        ├── Queue 0 (min-rate=500Mbps, 高优先级)
        ├── Queue 1 (min-rate=200Mbps, 中优先级)
        └── Queue 2 (min-rate=100Mbps, 低优先级)

然后通过流表规则,把不同流量映射到不同Queue:

# 把视频流量映射到Queue 0
ovs-ofctl add-flow br0 "priority=100,udp,tp_dst=3478,actions=set_queue:0,normal"

# 把文件下载流量映射到Queue 1
ovs-ofctl add-flow br0 "priority=50,tcp,tp_dst=80,actions=set_queue:1,normal"

2.6 实战中的选择建议

说了这么多,到底什么时候用Ingress,什么时候用Egress?

  • 限制虚拟机发出来的流量:用Egress。因为流量从虚拟机出来,经过OVS端口出去,Egress正好管这个方向。
  • 限制外部进入的流量:用Ingress。但要注意,Ingress只能做简单的速率限制,不能做复杂的队列调度。
  • 需要区分不同业务优先级:必须用Egress + 多个Queue。Ingress做不到。

一句话总结:Ingress是“限速门卫”,Egress是“调度交警”。QoS是“交通规则”,Queue是“具体车道”。搞清楚了这四者的关系,OVS QoS你就掌握了八成。

下一章,我会带大家实战配置一个完整的QoS限速方案。到时候咱们手把手操作,把今天讲的理论落地。嗯,今天就到这里,有问题随时交流。