8.16 详解 Neutron 的 QoS

QoS 的全称是 Quality of Service,也就是服务质量。

Neutron 支持的 QoS 类型有

  • bandwidth_limit(带宽限速):实现带宽速速

  • DSCP(差分服务代码点):给网络流量包添加一个 DSCP 标记,以此实现流量的优先级

  • minimum_bandwidth:暂时没用过

1. 开户 QoS 支持

在控制节点上执行两条命令修改配置

$ openstack-config --set /etc/neutron/neutron.conf DEFAULT service_plugins neutron.services.qos.qos_plugin.QoSPlugin

$ openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 extension_drivers port_security,qos

然后重启 neutron-server

$ crm resource cleanup openstack-neutron-server-clone

在计算节点上执行命令修改配置

$ openstack-config --set /etc/neutron/plugins/ml2/openvswitch_agent.ini agent extensions qos

然后重启对应的 neutron-agent 服务

$ systemctl restart neutron-openvswitch-agent

DSCP 差分服务代码点

DSCP 大小为 6 个 bit,也就是最大可表示 64 个分类。

但在 Neutron 里可用的标记只有这些

0, 8, 10, 12, 14, 16, 18, 20,
22, 24, 26, 28, 30, 32, 34, 36,
38, 40, 46, 48, 56

可以看到,它们都是0-56 间的偶数,但是排除 2-6, 42, 44 和 50-54。

image0

原理

在 IP 协议分组里有一个 ToS(服务类型) 的字段,就是用来表示 ToS 的。

ToS 字段,总共 8 个 bit

image1

前面 3 个 bit

为优选权子字段,现在已经废弃,这个字段默认值是000,从wireshark抓包结果看,表示的是:

image2

但是在某些协议中仍然是有用的,比如 OSPFv2 协议

image3

关于 Precedence (优先级),有如下几种

111 - Network Control
110 - Internetwork Control
101 - CRITIC/ECP
100 - Flash Override
011 - Flash
010 - Immediate
001 - Priority
000 – Routine

中间 4 个bit

这四个 bit 组合在一起,表示了该数据报对应的服务类别,这个应用层的服务类别是不同的。这里所说的服务类别,是指:

1000 -- minimize delay          最小延迟
0100 -- maximize throughput     最大吞吐量
0010 -- maximize reliability    最高可靠性
0001 -- minimize monetary cost  最小费用
0000 -- normal service          一般服务

IP首部中的ToS字段,只能表示一种服务类别,也就是:这4bit字段中,最多只能有一个bit字段为1。

看下不同应用下该4bit字段对应的值: image4 翻译过来就是: image5 最小延迟,对应于对延迟敏感的应用,如telnet和人login等。 最大吞吐量,对应于对吞吐量要求比较高的应用,如FTP文件应用,对文件传输吞吐量有比较高的要求。 最高可靠性,对网络传输可靠性要求高的应用,如使用SNMP的应用、路由协议等等。 最小费用,如NNTP这种用户网络新闻等。

最后 1 个bit

这个1bit末尾,没有被使用,必须强制设置为0

最后,很重要的一点,只有当网络设备(如交换机等)能够支持(能够识别IP首部中的ToS字段)识别ToS字段时,这给字段设置才有意义。

创建 policy

$ neutron qos-policy-create qos-dscp --shared
Created a new policy:
+-----------------+--------------------------------------+
| Field           | Value                                |
+-----------------+--------------------------------------+
| created_at      | 2020-07-01T06:43:23Z                 |
| description     |                                      |
| id              | ee7e7a83-c67d-4f27-b77c-3345553e5abe |
| name            | qos-dscp                             |
| project_id      | 2ac17c7c792d45eaa764c30bac37fad9     |
| revision_number | 1                                    |
| rules           |                                      |
| shared          | True                                 |
| tenant_id       | 2ac17c7c792d45eaa764c30bac37fad9     |
| updated_at      | 2020-07-01T06:43:23Z                 |
+-----------------+--------------------------------------+

创建 rule

创建时需要指定 QOS_POLICY,创建完后,就会自动添加到 QOS_POLICY

$ neutron  qos-dscp-marking-rule-create --dscp-mark 14 ee7e7a83-c67d-4f27-b77c-3345553e5abe
Created a new dscp_marking_rule:
+-----------+--------------------------------------+
| Field     | Value                                |
+-----------+--------------------------------------+
| dscp_mark | 14                                   |
| id        | 1d045cf3-eb31-440b-9a74-a9d5fea6a7e0 |
+-----------+--------------------------------------+

绑定policy到 port

$ neutron port-update <port_id> --qos-policy qos-dscp

关闭 QoS

$ neutron port-update <port_id> --no-qos-policy

查看规则

过滤出 tos 后就能看到 ToS(Type of Service) 的值

$ ovs-ofctl dump-flows br-int | grep tos

然后再对照这个表,找到对应的 DSCP 的 decimal ,如果 tos 是 64,那么 DSCP mark 就是 16,其实除以 4 就可以了,也不用对照表。其中这个 16 需要跟交换上支持的一样。

image6

其他

DSCP 是以集群为粒度,一个集群只要创建一个就行,需要的时候将其绑定到 port 上就可以。

2. bandwidth_limit 带宽限速

华云 QoS :https://support.huawei.com/enterprise/zh/doc/EDOC1100055155/101c0e7b

http://blog.chinaunix.net/uid-20530497-id-2490382.html

https://www.zhihu.com/question/21053403

qos 查询命令

$ neutron qos-policy-list
$ neutron qos-bandwidth-limit-rule-list 16fbb0c2-b7ac-4053-a85f-75fb72c3ab55

在 dpdk 宿主机上查询限速

# 查询 ingress(宿主机角度)
$ virsh dumpxml 4f6a0708-aeb8-4208-bea8-2c51e6a94948

# 查询 egress(虚拟机角度)
$ ovs-vsctl list interface vhu198063e9-97

# 查询 ingress(虚拟机角度)
$ ovs-appctl -t ovs-vswitchd qos/show vhu198063e9-97

image7

测试限速

average: 100M

# burst:50
$ nova meta b1575f81-0a33-4872-995e-2c2dd48d52c8 set __system__vif_inbound_average=12500 __system__vif_inbound_burst=7500 __system__vif_outbound_average=12500 __system__vif_outbound_burst=6000


# burst:60
$ nova meta b1575f81-0a33-4872-995e-2c2dd48d52c8 set __system__vif_inbound_average=12500 __system__vif_inbound_burst=7500 __system__vif_outbound_average=12500 __system__vif_outbound_burst=7500

# burst:70
$ nova meta b1575f81-0a33-4872-995e-2c2dd48d52c8 set __system__vif_inbound_average=12500 __system__vif_inbound_burst=8750 __system__vif_outbound_average=12500 __system__vif_outbound_burst=8750

# burst:80
$ nova meta b1575f81-0a33-4872-995e-2c2dd48d52c8 set __system__vif_inbound_average=12500 __system__vif_inbound_burst=10000 __system__vif_outbound_average=12500 __system__vif_outbound_burst=10000

3. 带宽单位换算

带宽,英文名 Bandwidth,在不同领域的含义各不相同,而在网络服务中,带宽是指单位时间内的流经数据量。

数据量的单位一般有两种:bit 和 Byte。

因此,带宽的单位即为,b/s 或者 B/s,如果数值较大,可以使用 K 表示千(Kb/s 或者 KB/s),M 表示 百万(Mb/s 或者 MB/s)。

  • Mb/s:Million bits per second的缩写,是一种传输速率单位,指每秒传输的位(比特)数量。通常用于运营商带宽速率的计量。

  • MB/s:Million Bytes per second的缩写,是一种传输速率单位,指每秒传输的字节数量。即是我们平时说的下载速度。

Byte 和 bit 是不一样的,Byte = 8 bit,而不同的地方单位不同,需要进行换算,下表整理了在 VMP 中的各个位置的单位

type

cloud

meta

xml

qos rule

ovs-vsctl/ovs-appctl

ovs

bit

Byte

Byte

dpdk

bit

Byte

bit

bit

4. 带宽限制效果

CentOS 安装 iperf3

源码编译安装 iperf3

yum -y install gcc make wget
cd /tmp
wget https://iperf.fr/download/source/iperf-3.1.3-source.tar.gz
tar zxvf iperf-3.1.3-source.tar.gz
cd iperf-3.1.3
./configure
make
make install

使用 rpm 包安装(更简单,推荐)

$ rpm -ih ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora/linux/updates/24/x86_64/i/iperf3-3.1.3-1.fc24.x86_64.rpm

Windows 安装 iperf3

所有的 windows 可用的 iperf3 安装包都可以从这个页面下载:https://iperf.fr/iperf-download.php

这里直接给出两个 windows 常用的

下载到电脑到,并解压后,会得到两个文件:cygwin1.dlliperf3.exe,将这两个文件拷贝到 c:\windows 目录下。

最后打开 cmd,执行 iperf3 --version ,若安装成功,会打印出版本信息。

iperf3 使用前关闭防火墙

CentOS 关闭防火墙,只要一条命令

$ systemctl stop firewalld
$ systemctl stop iptables

windows 10 手动设置一下

image8

iperf3 的使用

iperf3 有客户端 和 服务端之别:

  • 服务端:收包,使用 -s 参数指定

$ iperf3 -s
  • 客户端:发包,使用 -c xx.xx.xx.xx 来指定要往哪个服务端发包

$ iperf3 -c 172.20.20.200

iperf3 还有更多的参数,其中有一些是客户端专用的,有一些是服务端专用的,也有一些是二者共用的。

具体可以前往这个地址,进行查阅:https://www.cnblogs.com/yingsong/p/5682080.html

常用的参数有

  • -u:发送 UDP 包,仅客户端 可用

  • -p:后接服务端监听的端口

  • -i:设置带宽报告的时间间隔,单位为秒

  • -t:设置测试的时长,单位为秒

  • -w:设置tcp窗口大小,一般可以不用设置,默认即可

5. 注意事项

1、vm 在 host1 上,从host2 上 iperf 比在 host1 上限速效果更好

2、udp 包限速效果差异很大。