使用 FlowVisor 和 OpenVswitch 配置 QoS 时出现问题

网络工程 服务质量 开放流 迷你网
2022-02-15 21:57:49

我正在运行一个小型实验,以使用 flowvisor(1.4 版,openflow 1.0 版)实现基于端口的切片来隔离带宽。使用 mininet,我创建了一个由主机 h1 ( 10.0.0.1) 组成的拓扑,连接到称为 s3 的交换机,连接到另一个主机 h2 ( 10.0.0.2),这样:

h1 ----- s3 ------ h2

为了实现这一点,我使用这个 mininet 命令来运行我的自定义拓扑(称为 simpletopo.py):sudo mn --custom simpletopo.py --topo mytopo --switch ovsk --controller remote --mac --arp --link tc

我希望666从 h1 到 h2(反之亦然)端口的所有流量都具有 1Mbps 的带宽,并且555从 h1 到 h2(反之亦然)端口的所有流量都具有 1Gbps 的带宽。为此,我在交换机 s3、q0 和 q1 中创建了两个队列。q0 用于 1Mbps 流量,q1 用于 1Gbps 流量。

首先,我创建了两个切片:

fvctl add-slice slice1 tcp:127.0.0.2:6643 generic@email.com
fvctl add-slice slice2 tcp:127.0.0.3:6653 generic@email.com

然后,我分配流空间:

fvctl -f pass add-flowspace --queues=1 --forced-queue=1 flow1 3 100 in_port=2,tp_dst=666 slice1=7
fvctl -f pass add-flowspace --queues=1 --forced-queue=1 flow2 3 100 in_port=1,tp_src=666 slice1=7
fvctl -f pass add-flowspace --queues=1 --forced-queue=1 flow3 3 100 in_port=1,tp_dst=666 slice1=7
fvctl -f pass add-flowspace --queues=1 --forced-queue=1 flow4 3 100 in_port=2,tp_src=666 slice1=7
fvctl -f pass add-flowspace --queues=0 --forced-queue=0 flow5 3 100 in_port=2,tp_dst=555 slice2=7
fvctl -f pass add-flowspace --queues=0 --forced-queue=0 flow6 3 100 in_port=1,tp_src=555 slice2=7
fvctl -f pass add-flowspace --queues=0 --forced-queue=0 flow7 3 100 in_port=1,tp_dst=555 slice2=7
fvctl -f pass add-flowspace --queues=0 --forced-queue=0 flow8 3 100 in_port=2,tp_src=555 slice2=7

我使用 queue 选项告诉 flowvisor 哪些切片可用于每个 flowspace,并使用强制队列选项来强制 flowvisor 更改指定队列中入队操作的输出操作。

然后我运行两个 POX 控制器,每个切片一个:

./pox.py --verbose pox.openflow.of_01 --address=127.0.0.2 --port=6643 pox.forwarding.l2_learning
./pox.py --verbose pox.openflow.of_01 --address=127.0.0.3 --port=6653 pox.forwarding.l2_learning

现在,我使用 mininet 运行拓扑。此时,两个切片工作正常,每个切片都控制其流量。流量使用所有带宽。

现在我想限制带宽。为了实现这一点,我创建了上面提到的队列。

我创建这样的队列:

sudo ovs-vsctl -- set Port s3-eth1 qos=@newqos -- set Port s3-eth2 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=1000000 other-config:max-rate=1000000 -- --id=@q1 create Queue other-config:min-rate=1000000000 other-config:max-rate=1000000000

当我使用 iperf 运行测试时,我将所有流量限制为 1 Mbps。当我运行时sudo ovs-ofctl queue-stats s3,我看到所有流量都通过queue 0(openflow 的默认队列)并且没有流量通过queue 1

怎么了?flowvisor 或队列的创建是否有问题?

非常感谢。

1个回答

最后我弄清楚出了什么问题:

创建 qos 和队列后,需要定义流,如下所示:

sudo ovs-ofctl add-flow s3 in_port=1,dl_type=0x0800,nw_proto=6,tp_dst=666,priority=100,actions=set_queue:1,normal

sudo ovs-ofctl add-flow s3 in_port=1,dl_type=0x0800,nw_proto=6,tp_dst=555,priority=100,actions=set_queue:0,normal

sudo ovs-ofctl add-flow s3 in_port=2,dl_type=0x0800,nw_proto=6,tp_dst=666,priority=100,actions=set_queue:1,normal

sudo ovs-ofctl add-flow s3 in_port=2,dl_type=0x0800,nw_proto=6,tp_dst=555,priority=100,actions=set_queue:0,normal

通过这种方式,我们告诉 openflow 哪些流量必须通过每个队列。但是,通过这个过程,我发现没有必要使用 flowvisor 的选项队列和强制队列。

来源:

ovs-ofctl add-flow<bridge><match-field>actions=set_queue:<queue>

通过采取这个动作,从端口输出的数据包将被输出到指定的队列中。不同的交换机有不同数量的支持队列。http://www.pica8.com/document/v2.3/html/ovs-commands-reference/