基于Open vSwitch的传统限速和SDN限速

作者简介:好好先生

QoS(Quality of Service)即服务质量。指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力。当网络过载或拥塞时,QoS能确保重要业务量不受延迟或丢弃,同时保证网络的高效运行。对于网络业务,服务质量包括传输的带宽、传送的时延、数据的丢包率、网络抖动等。在网络中可以通过保证传输的带宽、降低传送的时延、降低数据的丢包率、降低网络抖动值等措施来提高服务质量。限流是Qos中常用的一种技术手段,本文基于开源交换机Open vSwitch,从传统网络模式和SDN模式完成限流的功能,对比出各种方式的特点。

本次实验需要指定版本的ovs交换机为2.8.1及以上,所以先安装2.8.1版本的ovs,然后安装mininet网络仿真器。通过网卡限速,队列限速,meter表限速,从三个角度分析限流实现并对比其限速性能表现。

一、安装指定版本ovs

从Open vswitch官网下载安装包,版本为2.8.1。
http://www.openvswitch.org/

图 1 Open vSwitch

图 2 ovs版本

安装python
apt install python

安装pip
apt install python-pip

生成make文件
./configure

生成makefile文件
make

make install 安装
make install

检查模块
make modules_install

载入ovs模块到内核中
/sbin/modprobe openvswitch
/sbin/lsmod | grep openvswitch

启动
$ export PATH=$PATH:/usr/local/share/openvswitch/scripts
$ ovs-ctl start

启动ovs-vswitchd
$ ovs-ctl —no-ovs-vswitchd start

启动ovsdb-server
$ ovs-ctl —no-ovsdb-server start

配置ovsdb的数据库

$ mkdir -p /usr/local/etc/openvswitch
$ ovsdb-tool create /usr/local/etc/openvswitch/conf.db \
vswitchd/vswitch.ovsschema
$ mkdir -p /usr/local/var/run/openvswitch
$ ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock \
--remote=db:Open_vSwitch,Open_vSwitch,manager_options \
--private-key=db:Open_vSwitch,SSL,private_key \
--certificate=db:Open_vSwitch,SSL,certificate \
--bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert \
--pidfile --detach --log-file

使用ovs-vsctl初始化数据库
$ ovs-vsctl —no-wait init
$ ovs-vswitchd —pidfile —detach —log-file

二、基于ovs安装mininet

1.安装git
apt install git

2.下载mininet源码
git clone git://github.com/mininet/mininet

3.安装mininet
到/mininet/util目录下

执行命令 ./install.sh -3n。如果有报错,不用管

三、创建拓扑

1.设计拓扑

图 3 实验拓扑
设计上图的拓扑,设备分工如下:

表 1 设备信息列表

搭建一个上图的拓扑,使用mininet命令:
mn —topo single,6

2.使用虚拟主机

mininet的强大之处,每一个设备都能打开命令行,可以当做Linux系统的命令行去使用。使用命令xterm h1,打开h1的操作界面。

同理打开h2的操作界面。

查看两个主机h1和h2的ip地址。

3.iperf测试带宽

在没有限流的情况下,测试网络带宽。iperf是一款常用的网络带宽测试工具,分为客户端和服务端。服务端首先开启监听,客户端发送流量,最后测得带宽的大小。以h1为服务端,以h2为客户端。

h1:
iperf -s

h2
iperf -c 10.0.0.1

最后测得在正常情况下,本环境中的网络带宽是16.7M。(每个实验环境数据都不太一样,跟硬盘有关)

四、网卡限速

1.简单介绍

Open vSwitch本身并不具备QoS功能,网卡限速是基于Linux内核来完成,而Open vSwitch所做的是对Linux内核的限速功能进行配置。Linux内核中接收数据包使用的方法叫策略(policing),用于限制网卡上接收分组(ingress)的速率,当速率超过了配置速率,就简单的把数据包丢弃。Policing通过简单的丢包机制实现接口速率的限制,它既可以作用于物理接口,也可以作用于虚拟接口。

2.实验过程

1.查看h1和h2的网卡

2.对两个网卡做策略
当两个网卡接收到的数据包超过5000kb时,数据包就直接丢弃掉
ovs-vsctl set interface s1-eth1 ingress_policing_rate=5000
ovs-vsctl set interface s1-eth2 ingress_policing_rate=5000

ingress_policing_rate:为接口最大收包速率,单位kbps,超过该速度的报文将被丢弃,默认值为0表示关闭该功能

3.验证带宽
以h1为服务端,以h2为客户端,通过iperf打流,测网络带宽。打流选择UDP传输,客户端以10M的带宽去发送流量,由于网卡被限速,服务端会显示相应的带宽。
h1
iperf -u -s

h2
iperf -u -c 10.0.0.1 -b 10M

带宽:5.57 M
抖动:15.61 ms
丢包率:43%

五、队列限速

1.简单介绍

图 4 队列原理图

数据包队列是任何一个网络栈的核心组件,数据包队列实现了异步模块之间的通讯,提升了网络性能。Linux可以将网络数据包缓存起来,然后根据用户的设置,在尽量不中断连接(如 tcp)的前提下来平滑网络流量。内核通过某个网络接口发送数据包,它都需要按照这个接口的队列规则把数据包加入队列。由于Linux对接收队列的控制不够好,所以一般只用发送队列,即”控发不控收”。shaping用于实现出口流量的控制,使用队列queue,可以缓存和调度数据包发送顺序,比policing更加精确和有效。在ovs的数据表中主要使用QoS和Queue两张表。

2.实验过程

1.在网卡s1-eth4上限制创建队列

ovs-vsctl set port s1-eth4 qos=@newqos — \
—id=@newqos create qos type=linux-htb queues=0=@q0 — \
—id=@q0 create queue other-config:max-rate=5000000

  • 为s1-eth4创建qos,名称为newqos
  • 创建qos,名称为newqos,类型为linux-htb,指定处理队列为q0
  • 创建队列q0,设置最大的速率为5000000bps,即5M

2.查看队列具体信息

  • 查看网卡s1-eth4上的qos
  • qos的参数信息,最重要的是处理队列的uuid
  • 队列的信息,最重要的是队列的最大速度

3.验证带宽

带宽:4.86 M
抖动:0.124 ms
丢包率:40%

六、Meter表限速

1.原理简介

Meter表限速是SDN的限速方式。OpenFlow 1.3版本中增加了对单个数据流的计量功能,使得OpenFlow能够实现简单的QoS服务(例如流量限速),并且可以结合每个端口队列来实现更复杂的QoS框架(例如DiffServ)
Meter表的字段

图 5 Meter表

  • Meter Identifier 32位的无符号整数,用来唯一识别该计量表项
  • Merter Bands 由计量带组成的无序列表,其中每个计量带都指明了其速率及处理数据包的方式
  • Counters 用于在报文被计量表项处理时更新相关计数

每个计量表项可能具有有一个或多个计量带,每个计量带都指定了其所适用的速率和数据被处理的方式。每个Meter Band指明了带宽速率以及对数据包的处理行为。数据包基于其当前的速率会被其中一个Meter Band来处理。
Meter Band详细字段:

图 6 meter表计量带表

  • Band Type 定义了数据包怎样被处理(drop,dscp remark)
  • Rate 用于选择计量带,定义了带可以运行的最高速率
  • Counters 当数据报文被计量带处理时,更新计数器
  • Type specific arguments 带类型的可选参数

Band Type

  • Drop 通过丢弃数据包,定义带宽速率限制
  • Dscp remark 降低数据包的IP头中的DSCP字段丢弃的优先级

2.实验过程

1.查看交换机中的流表

2.设置交换机的工作模式和协议版本
ovs-vsctl set bridge s1 datapath_type=netdev
ovs-vsctl set bridge s1 protocols=OpenFlow13

3.下发meter表并查看
ovs-ofctl add-meter s1 meter=1,kbps,band=type=drop,rate=5000 -O OpenFlow13

Meter表名称:s1
Meter表id:1
Rate:最大速率
Band=type=drop:超出速率处理方式丢弃

4.查看流表转发端口,为下发流表准备
ovs-ofctl show s1


图 7 拓扑端口连接图

5.下发流表并查看
ovs-ofctl add-flow s1 in_port=5,action=meter:1,output:6 -O openflow13
ovs-ofctl dump-flows s1 -O openflow13

in_port=5:进端口为5
action=meter:1,output:6:匹配的动作为先交给meter表1处理,然后转发给端口6
流表的意思是将进端口为5的流量使用meter表限速,然后转发给6端口。

6.验证带宽
打开h5、h6终端,打流查看带宽

带宽:5.22 M
抖动:15.68 ms
丢包率:47%

七、三种方式数据对比

表 2 三种限速方式数据表

图 8 带宽对比图

图 9 误差对比图

从数据来看,队列限速的表现最好,首先是带宽限制精确值,队列误差率2.8%,其次抖动最小,最后丢包率也是最少的。当然丢包率小并不能说明表现就好,因为发送为10M的带宽,接收为5M,大量的数据包要丢弃。表现最不好的是网卡限速,带宽误差率最高,抖动也很高,这是与网卡限速的实现方式有关,其控制精度比较粗。

Meter表作为SDN模式限速的代表,表现中规中矩,这可能和ovs交换的流表控制能力有关。交换机中流表的匹配,数据流计数,动作的执行等都是影响其控制力度的原因。软件实现的交换机对流表的控制肯定比不上硬件交换机,如果使用硬件交换机,其效率表现应该有所提高。


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/23289.html
分享到:
相关文章
条评论

登录后才可以评论

hhulk 发表于19-06-10
2