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)

配置思路

  1. 创建 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 Mbps
    • queue 0 限速 50 Mbps
  2. 流量分类到队列(可选):
    结合 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 管理