Open vSwitch 出口流量QoS实现

Open vSwitch 出口流量QoS实现

OVS中可以通过创建对应出端口的队列并配置队列最大/最小速率来实现qos操作。以下我们通过mininet中一个最简单的拓扑(一个交换机+两台主机,mininet的默认拓扑,直接运行sudo mn即可)来说明一下这个qos操作。
 

Open vSwitch 出口流量QoS实现_第1张图片

如图,交换机的s1-eth1(ofport=1)连接主机h1,s1-eth2(ofport=2)连接主机h2,h1为数据发送端,h2为数据接收端,所以我们需要对出端口,即与h2相连的s1-eth2作设置:

ovs-vsctl set port s1-eth2 qos=@newqos -- \
--id=@newqos create qos type=linux-htb other-config:max-rate=2000000 queues=123=@q1,456=@q2 -- \
--id=q1 create queue other-config:min-rate=1000000 -- \
--id=q2 create queue other-config:min-rate=400000 other-config:min-rate=2000000

以上针对s1-eth2设置了一个qos操作,其中端口被限速为2Mbits/s,对应设置了两个队列,队列123设置保障速率1 Mbits/s,队列456设置保障速率400 Kbits/s,最高速率2 Mbits/s。若要使这些队列生效,需要设置流表动作将数据包放入队列中:

ovs-ofctl add-flow in_port=1,ip,udp,tp_dst=5001,actions=set_queue:123,output:2

下面我们将用iperf来进行一些带宽实验以测试队列的效果。h1作为数据发送端,将同时向h2发送两个数据流,分别发往h2的udp5001端口和udp5002端口,其中发往5001端口的数据包会被放入队列123,发往5002端口的数据包会被放入队列456:

//iperf操作,以1Mbits/s发往5001端口为例
iperf –s –p 5001 –I 2 –u     //h2 iperf操作
iperf –c 10.0.0.2 –t 20 –I 2 –p 5001 –b 1m –u   //h1 iperf操作

下面进行了几组实验:

1. 设置端口限速2M,队列123 min 600K, 队列456 max 2M

目的端口

设置发送流量/接收到流量        

5001

600k/600k

1.2m/1.2m

2m/1.71m

2m/1.71m

5002

3m/1.35m

3m/750k

2m/240k

500k/240k

2. 设置端口限速2m,队列123 min 2m,队列456 max 2m

目的端口

设置发送流量/接收到流量        

5001

2m/1.95m

2m/1.95m

3m/1.95m

1m/1000k

5002

2m/10k

100k/10k

100k/10k

2m/950k

3. 设置端口限速2m,队列123 min 600k,队列456 min 600k max 2m

目的端口

设置发送流量/接收到流量        

5001

600k/600k

1m/970k

1.2m/970k

2m/970k

200k/200k

5002

3m/1.35m

3m/970k

2m/970k

2m/970k

2m/1.75m

4. 设置端口限速3m,队列123 min 1m,队列456 min 400k max 2m

目的端口

设置发送流量/接收到流量        

5001

1m/1000k

4m/2.52m

2m/2m

2.5m/2.08m

2m/2m

5002

3m/1.9m

400k/400k

2m/920k

2m/830k

5m/920k

通过这几组实验可以得知,队列限速会优先满足设定min保障速率的队列,只要发送速率在设定的保障速率之内,则一定能满足。而超出保障速率的部分或者没有设置保障速率的队列则不一定能保证其速率,其速率按一定的规则分配所得。

附注1:删除QoS设置

若要取消某些QoS设置,可以用下面的命令:

ovs-vsctl clear port s1-eth2 qos    //使端口s1-eth2的qos设置失效

上面这条命令可以使qos失效,如果你在这条命令前后使用 ovs-vsctl list port s1-eth2 查看端口s1-eth2的话,会发现之前端口qos项有一个qosID,而之后没有了。但是虽然端口已经不受这一条qos限制了,但是之前设置的qos和queue还存在系统中,可以用以下命令查看

ovs-vsctl list qos
ovs-vsctl list queue

若要删除这些qos和queue,需要以下命令

ovs-vsctl destroy qos qosID    //qosID 可通过前文list命令查看
ovs-vsctl destroy queue queueID    //queueID 可通过前文list命令查看
ovs-vsctl -- destroy qos s1-eth2 -- clear port s1-eth2 qos    //取消并删除qos一步达成,注意两条命令顺序不能换,不然先clear的话,轮到destroy去找s1-eth2的qos就找不见了
ovs-vsctl -- --all destroy qos -- --all destroy queue    //删除所有qos及queue

附注2:扩展阅读

Open vSwitch之QoS的实现

OpenvSwitch对虚拟机做QOS限速

ovs 发包限速

Quality of Service (QoS)

你可能感兴趣的:(SDN/NFV)