前言
Openflow1.3以及后续的版本增加了meter表,基于此结构,OpenFlow Switch可以实现各种简单的QoS功能,比如速率限制等,再结合每个端口的队列(queues),可以实现更加复杂的QoS框架,例如DiffServ。
一个meter可以衡量与它关联的数据包的速率,并进而可以控制其聚合速率。任何一个流表项(Flow Entry)都可以在其指令集(Instructions Set)里指定某一个Meter,从而控制与该流表项能够成功匹配的数据包的聚合速率。一条流表只能绑定一条meter表项(Meter Entry),一条meter表项能被多条流表绑定。
本实验环境基于centos7.6,Open vSwitch,ryu控制器和mininet实现
1、Openvswitch对meter表的支持简述
查阅vSwitch官方的文档的Open vSwitch FAQ章节中的问题Does Open vSwitch support OpenFlow meters可知,Open vSwitch2.7版本的userspace datapath实现了对meter表的功能,Open vSwitch2.10版本的linux内核数据路径实现对meter表功能,本文采用当前最新的Open vSwitch版本2.10.1.相关问题的链接地址为:Quality of Service (QoS) — Open vSwitch 2.16.90 documentation
上文中提到两种类型的数据路径(datapath),事实上Open vSwitch 在不同的平台支持不同的数据路径,且不同的数据路径支持不同的功能集合。
目前之前4种数据路径:
- Linux upstream:基于Linux upstream自带的内核模块实现的datapath。由于linux内核版本差异,该类型的openvswitch 支持的功能根据不同发行版Linux 内核版本而不同。
- Linux OVS tree:通过OVS 源代码生成的内核模块实现的。
- Userspace: 也称为DPDK,dpif-netdev 或者dummy datapath。这是NetBSD,FreeBSD 和Mac OSX 仅支持的数据路径。
- Hyper-V:Windows 平台的数据路径。
下面列出不同的数据路径支持的功能:
Feature | Linux upstream | Linux OVS tree | Userspace | Hyper-V |
NAT | 4.6 | YES | Yes | NO |
Connection tracking | 4.3 | YES | PARTIAL | PARTIAL |
Tunnel - LISP | NO | YES | NO | NO |
Tunnel - STT | NO | YES | NO | YES |
Tunnel - GRE | 3.11 | YES | YES | YES |
Tunnel - VXLAN | 3.12 | YES | YES | YES |
Tunnel - Geneve | 3.18 | YES | YES | YES |
Tunnel - GRE-IPv6 | 4.18 | YES | YES | NO |
Tunnel - VXLAN-IPv6 | 4.3 | YES | YES | NO |
Tunnel - Geneve-IPv6 | 4.4 | YES | YES | NO |
Tunnel - ERSPAN | 4.18 | YES | YES | NO |
Tunnel - ERSPAN-IPv6 | 4.18 | YES | YES | NO |
QoS - Policing | YES | YES | YES | NO |
QoS - Shaping | YES | YES | NO | NO |
sFlow | YES | YES | YES | NO |
IPFIX | 3.10 | YES | YES | NO |
Set action | YES | YES | YES | PARTIAL |
NIC Bonding | YES | YES | YES | YES |
Multiple VTEPs | YES | YES | YES | YES |
Meters | 4.15 | YES | YES | NO |
Conntrack zone limit | 4.18 | YES | NO | N |
由表可知,基于linux内核的数据路径在内核版本为4.15以上才支持meter表功能,而centos7.6的内核版本为3.10,显然不支持该实验。为了确定是否支持meter表,可通过命令ovs-dpctl简单确定一下,如图1所示;而linux ovs tree类型的数据路径支持表中的所有功能,因此本文采用linux ovs tree类型的Open vSwitch.具体信息可以查看链接:Releases — Open vSwitch 2.16.90 documentation

2、linux ovs tree类型Open vSwitch安装
- 如果系统之前装过Open vSwitch,需要卸载,具体卸载方法,依据之前的安装方法而定,本博主卸载Open vSwitch采用暴力美学的强删(不到万不得已再用):
- find / -name ovs* 找出所有包含ovs开头文件或文件夹并删掉除安装包以外的所有ovs开头的目录和文件
- find /-name openvswitch* 找出所有包含openvswitch开头的文件或文件夹并删除除安装包外的所有文件夹或文件
- 如果未安装过Open vSwitch则按以下步骤安装:
- 安装依赖:yum install rpm-build autoconf automake libtool systemd-units openssl openssl-devel python python-twisted-core python-zope-interface python-six desktop-file-utils groff graphviz procps-ng libcap-ng libcap-ng-devel dpdk-devel PyQt4 selinux-policy-devel
- rpmbuild –ba -D "kversion 3.10.0-957.el7.x86_64" ~/rpmbuild/SOURCES/openvswitch-2.10.1/rhel/openvswitch-kmod-fedora.spec(如果执行失败,则将下载的Open vSwitch.tar.gz安装包和解压后的安装包复制到~/rpmbuild/SOURCES/目录下重新执行该命令。PS:博主的路径是在root下,读者可自行设定路径)
- 安装依赖:yum install python-sphinx unbound unbound-devel
- rpmbuild –ba –without check -D "kversion 3.10.0-957.el7.x86_64" ~/rpmbuild/SOURCES/openvswitch-2.10.1/rhel/openvswitch- fedora.spec
- 安装新包,cd rpmbuild/RPMS/x86_64,执行命令:
- yum localinstall –y *
- systemctl enable openvswitch
- 更新kernel openvswitch模块,如果安装过openvswitch,则执行1和2,如果新安装则只执行步骤2即可
- mv /lib/modules/3.10.0-957.el7.x86_64/kernel/extra/openvswitch/* /lib/modules/`uname -r`/updates/
- depmod –av
- 创建开机自动加载openvswitch 内核模块
- vim /etc/sysconfig/modules/openvswicth.modules
- 内容如下:modprobe openvswitch
- modprobe vport-geneve
- modprobe vport-gre
- modprobe vport-lisp
- modprobe vport-stt
- modprobe vport-vxlan
-
- 修改权限:chmod 755 /etc/sysconfig/modules/openvswicth.modules
- 重启,查看模块信息,确实已经加载了新版本:modinfo openvswitch
- 验证是否支持meter表功能:
- ovs-vsctl add-br s1
- ovs-dpctl show,无告警信息提示,则可初步确定可支持meter表
- ovs-ofctl –O OpenFlow13 meter-features s1,如果支持meter表,则如图所示:

3、meter表实验
- 启动sdn控制器ryu:ryu-manager –verbose ryu.app.simple_switch_13
- 启动mininet:mn –topo single,2 –switch ovsk,protocols=OpenFlow13 –controller remote –mac
- 建立连接后,查看流表:ovs-ofctl –O OpenFlow13 dump-flows s1,此时只有一条默认流表;
-
- 增加meter表:ovs-ofctl -O OpenFlow13 add-meter br0 meter=1,kbps,band=type=drop,rate=200,即限速为200kbps,无报错则添加成功
- 增加流表项:ovs-ofctl -O OpenFlow13 add-flow br0 in_port=1,actions=meter:1,output:2
- 再次执行查看流表命令,查看s1数据路径类型:ovs-vsctl get bridge s1 datapath_type,为默认的空字符,即system类型
- 查看meter表统计:ovs-ofctl -O OpenFlow13 meter-stats s1,此时除时间外其他为0
- 在mininet中执行xterm h1 h2,
- 测试udp业务,在h1虚拟主机中,执行iperf –u –c 10.0.0.2 –i 1 –t 100 –b 400k;在h2虚拟主机中,执行:iperf –u –s –i 1,再次执行查看meter表统计命令,效果如图1所示,业务效果如图2所示
- 测试tcp业务,在h1虚拟主机中,执行iperf –c 10.0.0.2 –i 1 –t 100 –b 400k;在h2虚拟主机中,执行:iperf –s –i 1,再次执行查看meter表统计命令,效果如图1所示,业务效果如图3所示
-



5、总结
Meter表的限速功能对udp和tcp业务都生效,实现了预期目的
附录:如果是32位系统的话,需要手动rpm包安装dpdk和dpdk-devel,如果非首次安装ovs,需要将/lib/modules/3.10.0-862.el7.centos.plus.i686/extra下的所有文件复制到/lib/modules/3.10.0-862.el7.centos.plus.i686/updata下面