Open vSwitch 实现对虚拟机的上行带宽与下行带宽的限制
一、为什么需要 QoS(服务质量控制)
在 OVS(Open vSwitch)里,网桥上的端口默认不做带宽控制,所有包都是 尽最大可能转发。
- 如果某个虚拟机(VM)占满带宽,其他 VM 可能会被挤压。
- 在云环境(KVM、OpenStack 等)里,必须要做流量限速,保证“多租户公平”。
QoS(Quality of Service)就是用来限制端口的 最大带宽,并且能进行更细粒度的流量调度。
二、OVS 的两种限速方式
1. ingress_policing_rate(简单限速)
- 配置在 interface(接口) 上
- 单位是 kbps
- 只能限制 上行流量(从 VM 发出去的)
- 配置简单,但功能有限(只能设一个速率,没有队列调度)
示例:
ovs-vsctl set interface vnet0 ingress_policing_rate=10000
表示最大上行 10 Mbps。
2. QoS + Queue 模式(高级限速)
QoS 本质上是把端口流量放入队列(queue),然后对队列设置不同的 速率/优先级。
- 配置在 port(端口) 上
- 单位是 bps(bit per second)
- 可以同时限制 下行和上行(取决于配置方向)
- 支持多个队列,可以实现 多等级带宽控制(例如:普通流量 10 Mbps,高优先级流量 50 Mbps)
配置思路
-
创建 QoS 对象:
ovs-vsctl -- set port vnet0 qos=@newqos -- \ --id=@newqos create qos type=linux-htb other-config:max-rate=100000000 queues:0=@q0 -- \ --id=@q0 create queue other-config:max-rate=50000000
linux-htb
→ 使用 Linux 内核的 Hierarchical Token Bucket (HTB) 算法other-config:max-rate=100000000
→ 端口最大带宽 100 Mbpsqueue 0
限速 50 Mbps
-
流量分类到队列(可选):
结合ovs-ofctl add-flow
,把不同流量放到不同的队列:ovs-ofctl add-flow br0 "in_port=1,priority=100,actions=set_queue:0,normal"
三、为什么下行用 QoS + Queue
- 下行流量是 OVS 转发给 VM 的,OVS 可以控制端口发出去的速率,所以适合用 QoS + Queue。
- QoS 支持多个 queue,能区分不同类型的流量(例如:VM 内的管理流量优先级高,普通应用流量低)。
四、为什么上行通常用 ingress_policing_rate
- 上行流量是 VM 发出来的,OVS 在收到包之后再丢弃或限速 → 属于 入口控制。
- QoS 在端口发送时才生效,对 上行流量不太合适。
- 所以 OVS 提供了
ingress_policing_rate
,直接在接口入口就丢弃超额包,减少浪费。
五、总结对比
特性 | ingress_policing_rate | QoS + Queue |
---|---|---|
单位 | kbps | bps |
配置位置 | interface | port |
控制方向 | 上行(VM → OVS) | 下行(OVS → VM),也可做复杂分类 |
粒度 | 简单速率限制 | 多队列,支持优先级、复杂调度 |
适用场景 | 单纯限速 | 精细化 QoS 管理 |
评论区