neutron的QOS

neutron关于QOS的调研

官方对QOS的支持

Openstack官方关于qos的blueprint:


ml2-qos是基于openvswitch的,下面看下底层是怎么实现的:

https://blueprints.launchpad.net/neutron/+spec/ml2-qos

https://review.openstack.org/#/c/59971/4/neutron/services/qos/drivers/openflow.py

neutron的QOS_第1张图片

neutron的QOS_第2张图片

         核心的就是上面两个函数,可以看出底层是使用的mod_nw_tos的功能,通过man ovs-ofctl:

mod_nw_tos:tos

    Sets the IPv4 ToS/DSCP field to tos, which must be a multiple of 4 between 0 and 255.  This action  does  not  modify  the  two

    least significant bits of the ToS field (the ECN bits).

可以看出这个qos的功能是通过添加流表修改数据包的tos来实现的,那么看下什么是tos(这里用的dscp):

DSCP由RFC2474定义,它重新命名了IPv4报头中TOS使用的那1字节和IPv6报头中数据类(Traffic Class)那1字节,新的名字称为DS字段(Differentiated Services Field)。该字段的作用没有变,仍然被QoS工具用来标记数据。不同的是IPv4使用3比特,而DSCP使用6比特,最低2比特不用。RFC2474 定义最高3比特为级别/类别选择代码(Class Selector Codepoints,CS),其意义和IPv4报头中IP优先级的定义是相同的,CS0 ~ CS7的级别相等于IP优先级0 ~ 7。但它并没有定义第3到第5比特的具体含义以及使用规则。DSCP使用6比特,可以定义64个优先级(0-63)。

         所以这个ml2-qos实现的是根据业务的不同,为业务对应的数据包打上优先级的标签。并不能实现限制流量的目的。

Openvswitch对QOS的支持

Openvswitch本身是支持端口流量的限制功能的,主要采用如下命令:

ovs-vsctl set Interface tap1 ingress_policing_rate=10000

ovs-vsctl set Interface tap1 ingress_policing_burst=1000

下面在openstack环境中做实验:

创建两台虚拟机:


网络拓扑如下:

neutron的QOS_第3张图片

其中qvoa41e04a2-27和qvoacbc5fc7-94分别是两台虚拟机的veth接口。

先来测下不做任何限制的速度:

neutron的QOS_第4张图片


neutron的QOS_第5张图片

大概速度达到280Mb/s

对其中一台做限速:

ovs-vsctl set Interface qvoa41e04a2-27 ingress_policing_burst=1000

ovs-vsctl set Interface qvoa41e04a2-27 ingress_policing_rate=10000

限制为10Mb/s

测试如下:

neutron的QOS_第6张图片

可以看出这种方案是可行的。

这种方式有个问题就是上下行总流量只有10Mb/s,而不是分开进行限制。如果要分开限制需要修改底层网桥结构。

你可能感兴趣的:(Neutron,nova)