Notice: Constant WP_DEBUG already defined in /var/www/html/wordpress/wp-content/plugins/changyan/sohuchangyan.php on line 12

Notice: Constant WP_DEBUG_LOG already defined in /var/www/html/wordpress/wp-content/plugins/changyan/sohuchangyan.php on line 13

Notice: Constant WP_DEBUG_DISPLAY already defined in /var/www/html/wordpress/wp-content/plugins/changyan/sohuchangyan.php on line 14
Open vSwitch之QoS的实现【zoues.com】 – zoues

LOADING

Follow me

Open vSwitch之QoS的实现【zoues.com】
五月 12, 2017|ITPaaSSDN

Open vSwitch之QoS的实现【zoues.com】

Open vSwitch之QoS的实现【zoues.com】

作者简介:刘成天,就职于赛特斯信息科技股份有限公司,高级工程师,目前工作地点南京,主要从事vCPE和路由器相关的研发工作

1 引言

本文主要介绍OVS中QoS的应用和实现方法,因为QoS技术在传统网络中应用较为成熟和广泛,所以本文不赘述QoS的相关原理和算法,只关注OVS如何使用QoS,有需要深入了解QoS的读者可自行学习,这里推荐一个相对经典的文献《Linux的高级路由和流量控制HOWTO》。

本文OVS的源码分析和测试版本基于2.3.90版本,对OVS源码结构感兴趣的读者可以参见本文作者的另一篇文章《OpenvSwitch源码阅读笔记》。

本文的测试组网和功能验证均在个人搭建的环境中完成,不涉及任何商用环境和业务方案,读者可以自由参考。同时感谢作者的同事王凯忠在虚拟机环境搭建和组网方案中给出的指导和帮助。

2 OVS的QoS应用

QoS在OVS中的使用和传统网络一样,主要分为如下两种:

  • Policing管制

Policing用于控制接口上接收分组(ingress)的速率,是一种简单的QoS的功能,通过简单的丢包机制实现接口速率的限制,它既可以作用于物理接口,也可以作用于虚拟接口;

  • Shaping整形

Shaping是作用于接口上的出口流量(egress)策略,可以实现多个QoS队列,不同队列里面处理不同策略;

3 OVS的QoS实现

OVS自身并不实现QoS功能,QoS功能的实现是在linux内核中,OVS只是能够配置部分OVS支持的QoS类型。如果需要一些OVS不支持的QoS类型,可以通过patch来支持这些配置,也可以通过传统的TC工具直接进行QoS的策略配置。

4 policing的实现

policing在OVS中采用ingress_policing_rate和ingress_policing_burst两个字段完成ingress入口限速功能,该两个字段放在Interface表中,由于QoS的内核实现都是原有的linux的sch_xx模块,所以这里不分析内核实现。

4.1 policing配置命令

入口限速直接配置在网络接口上,命令示例如下:

Java

1
2
# ovsvsctl set interface eth1 ingress_policing_rate=1000
# ovsvsctl set interface eth1 ingress_policing_burst=100

eth1:加入ovs桥端口的网络接口名称;
ingress_policing_rate:为接口最大收包速率,单位kbps,超过该速度的报文将被丢弃,默认值为0表示关闭该功能;
ingress_policing_burst:为最大突发流量大小,单位kb。默认值0表示1000kb,这个参数最小值应不小于接口的MTU,通常设置为ingress_policing_rate的10%更有利于tcp实现全速率;

通过命令ovs-vsctl list interface eth1可以查看配置
Open vSwitch之QoS的实现

4.2 policing配置流程

命令配置到ovs数据库的代码流程如下:
Open vSwitch之QoS的实现
运行配置命令的代码流程如下:
Open vSwitch之QoS的实现

5 shaping的实现

shaping用于实现出口流量的控制,使用了队列queue,可以缓存和调度数据包发送顺序,比policing更加精确和有效,在OVS的数据表中主要使用QoS和Queue两张表。

5.1 QoS创建命令

Java

1
2
3
ovsvsctl set port eth1 qos=@newqos   /
id=@newqos create qos type=linuxhtb queues=0=@q0 /
id=@q0 create queue otherconfig:maxrate=100000000

创建Queue

Java

1
id=@q0 create queue otherconfig:maxrate=100000000

创建q0队列,设置最大速率100M,通过ovs-vsctl查看配置的Queue表内容如下:
Open vSwitch之QoS的实现
创建Qos规则

Java

1
id=@newqos create qos type=linuxhtb queues=0=@q0

创建qos规则newqos,类型为linux-htb,并连接key值为0的队列q0,通过ovs-vsctl查看配置的Qos表内容如下:
Open vSwitch之QoS的实现
创建接口QoS

Java

1
set port eth1 qos=@newqos

设置接口eth1的qos为newqos,通过ovs-vsctl list port查看配置的port表内容如下:
Open vSwitch之QoS的实现

5.2 QoS配置流程

命令配置到ovs数据库的流程和4.1章节类似,其中”–”用于把命令分割成单独解析的命令行,这里主要配置了Queue、QoS和port三个表的内容,该命令的代码执行流程如下:
Open vSwitch之QoS的实现

6 应用举例

本章节介绍QoS在vCPE网络环境中的验证测试情况,考虑到vCPE的不同使用场景,这里vCPE1采用运行OVS的linux虚拟机,vCPE2采用运行openwrt系统的硬件路由器,组网如下图所示:
Open vSwitch之QoS的实现
PC1和PC2通过接入vCPE1和vCPE2实现虚拟二层网络的互通,其中vCPE1和vCPE2基于internet网络建立点到点的vxlan隧道。

PC1采用虚拟机运行,通过内部网络接入运行vCPE1的虚拟机;PC2采用普通电脑接入运行vCPE2的路由器,PC1和PC2使用的网络性能测试工具为iperf3。

6.1 vCPE网络结构

vCPE内部两个网络接口eth0、eth1分别作为WAN口和LAN口,其中eth1作为桥端口加入OVS的桥,同时创建vxlan作为OVS的桥端口。vCPE1和vCPE2之间的vxlan通过点到点的方式连接,vxlan的配置命令如下:

Java

1
#ovsvsctl addport br vxlan set interface vxlan type=vxlan options:remote_ip=x.x.x.x options:key=100

其中:remote_ip表示对端WAN接口的IP地址;

key表示vxlan隧道的VNI值;

我们这里仅仅为了测试验证QoS的业务应用,因此OVS使用默认的switch模式即可,可以省略OVS的流表和controller的配置,所以OVS的fail-mode使用默认的standalone。
Open vSwitch之QoS的实现

6.2 policing测试

在vCPE1的eth1桥端口上配置policing配置(这里注意vxlan端口不能配置QoS策略,因为OVS的QoS策略配置等同于TC的配置,而vxlan端口在OVS之外是不可见的)。

Java

1
2
# ovsvsctl set interface eth1  ingress_policing_rate=1000
# ovsvsctl set interface eth1  ingress_policing_burst=100

分别在pc1上和pc2上运行iperf3
pc2作为服务器的命令:

Java

1
> iperf3 s p 12345

pc1作为客户端的命令:

Java

1
> iperf3 c 192.168.0.2 p 12345 t 500

测试结果如下:
Open vSwitch之QoS的实现

6.3 queue测试

在vCPE1上eth1桥端口上创建htb算法的QoS策略,同时创建两个队列q0和q1,其中q0限速1Mbps,q1限速100Kbps,命令如下:
#ovs-vsctl set port eth1 qos=@newqos — /

Java

1
2
3
id=@newqos create qos type=linuxhtb queues=0=@q0,1=@q1 /
id=@q0 create queue otherconfig:maxrate=1000000 /
id=@q1 create queue otherconfig:maxrate=100000

分别在pc1上和pc2上运行iperf3
pc1作为服务器的命令:

Java

1
> iperf3 s p 12345

pc2作为客户端的命令:

Java

1
> iperf3 c 192.168.0.1 p 12345 t 300

测试结果如下所示,可以看出,设置两个队列后,默认走了第一个q0队列(1Mkbps限速的测试误差较大,可能是由于软件和网络环境问题引起,暂时忽略这些误差)
Open vSwitch之QoS的实现
接下来根据数据包条件选择不同队列,这里指定源地址为192.168.0.2的数据走q1队列,通过配置OVS流表完成队列设置,命令如下:

Java

1
2
#ovsofctl addflow br priority=5, ip,nw_src=192.168.0.2, /
actions= set_queue:1,normal

再次运行iperf3,测试结果如下,可以看出测试数据按照q1队列进行了限速处理。
Open vSwitch之QoS的实现

6.4 priority测试

priority主要用来指定队列的优先级,可以用来保证重要的数据进入优先队列而优先发送,下面给出测试priority的配置方法(配置在vCPE1上):
面给出测试priority的配置方法(配置在vCPE1上):

  • 创建QoS策略newqos并限速1Mbps,创建两个队列q0和q1并分别指定优先级(值越小优先级越高)

Java

1
2
3
4
5
# ovsvsctl set port eth1 qos=@newqos /
id=@newqos create qos type=linuxhtb /
otherconfig:maxrate=1000000 queues=0=@q0,1=@q1 /
id=@q0 create queue otherconfig:priority=0 /
id=@q1 create queue otherconfig:priority=1

  • 配置OVS流表,源地址为192.168.0.2的进入队列q0,源地址为192.168.0.3的报文进入队列q1(组网参见vCPE网络结构章节)

Java

1
2
3
4
# ovsofctl addflow br priority=5,ip,nw_src=192.168.0.2, /
actions=set_queue:0,normal
# ovsofctl addflow br priority=5,ip,nw_src=192.168.0.3, /
actions=set_queue:1,normal

  • PC1作为服务器启动两个进程分别监听不同端口:

Java

1
2
> iperf3 s p 12345
> iperf3 s p 54321

  • PC2和PC3作为客户端同时发起测试,其中PC2命令为

Java

1
> iperf3 c 192.168.0.1 p 12345 t 500

测试结果如下:
Open vSwitch之QoS的实现
PC3命令为

Java

1
> iperf3 c 192.168.0.1 p 54321 t 500

测试结果如下:
Open vSwitch之QoS的实现
从上面的测试结果可以看出,在vCPE1上,在eth1端口上,从PC2发送过来的数据根据流表进入了队列q0,从PC3发送过来的数据根据流表进入了队列q1,由于q0的优先级高于q1,所以优先转发PC2过来的数据到PC1,因此PC2和PC1之间的测速带宽远远高于PC1和PC3。

7 总结

通过上述针对OVS中QoS的相关功能测试可以得出,如果仅仅是想针对OVS中的桥端口进行限速,最简单的方法就是使用policing策略;如果想根据不同条件进行不同级别的限速(比如根据IP地址、port、协议等条件),可以创建不同队列queue,然后采用OVS中的流表条件指定数据到不同的队列,从而完成不同业务数据的限速策略;如果想对重要的业务数据进行质量保证,可以设置队列的priority,这样在网络拥塞的时候就会优先发送高优先级队列中的数据。

no comments
Share