1.7Mininet多数据中心网络拓扑流量带宽实验
Mininet多数据中心网络拓扑流量带宽实验
实验目的
1、掌握多数据中心网络拓扑的构建。
2、熟悉网络性能测试工具Iperf,根据实验测试SDN网络的性能。
实验环境
Mininet多数据中心网络拓扑流量带宽实验的拓扑如下图所示。
设备名称 | 软件环境 | 硬件环境 |
---|---|---|
主机 | Ubuntu 14.04桌面版 Mininet 2.2.0 | CPU:1核 内存:2G 磁盘:20G |
控制器 | Ubuntu 14.04桌面版 OpenDaylight碳版本 | CPU:4核 内存:8G 磁盘:20G |
注:系统默认的账户为:
管理员权限用户名:root,密码:root@openlab;
普通用户用户名:openlab,密码:user@openlab。
可查看当前实验环境右侧“钥匙” 按钮获取对应的密码。
任务内容
1、通过Mininet模拟搭建基于不同数据中心的网络拓扑。
2、通过程序生成真实网络流量。
实验原理
使用mininet中的iperf工具在网络中生成UDP流量,iperf客户端传送数据流到iperf的服务端,由服务端接收并记录相关信息。网络性能评估中一个巨大的挑战就是如何生成真实的网络流量,可以通过程序来创造人工的网络流量,通过建立测试环境来模拟真实的状况。此应用主要以数据中心网络为目标场景,在mininet仿真环境中尽可能地还原数据中心内部的真实流量情况。
Mininet数据中心应用价值:
- 树状拓扑结构容错能力强
- 降低数据中心成本消耗
- 提供重新排列的全带宽无阻碍路径
- 提高带宽利用率
- 分析数据中心网络流量性能
- 为真实数据中心和仿真测试床提供有用信息
在mininet中进行自定义命令iperfmulti功能拓展主要分为4步:
1.修改mininet/net.py
2.修改mininet/cli.py
3.修改bin/mn
4.重新安装Mininet核心文件:~/mininet/util/install.sh -n
操作步骤
一、编写网络带宽测试程序
步骤1
登录Mininet所在虚机主机,打开命令行执行终端。
步骤2
执行sudo mkdir -p /home/sdnlab/log
命令添加目录/home/sdnlab/log。
步骤3
执行命令sudo vi openlab/mininet/mininet/net.py
打开net.py文件。
步骤4
在Mininet类中添加定义iperf_single()函数,实现在两个主机间进行iperf udp测试,并且在server端记录,具体代码如下,建议将代码放置在“def iperf”下。
def iperf_single( self,hosts=None, udpBw='10M', period=60, port=5001):
"""Run iperf between two hosts using UDP.
hosts: list of hosts; if None, uses opposite hosts
returns: results two-element array of server and client speeds"""
if not hosts:
return
else:
assert len( hosts ) == 2
client, server = hosts
filename = client.name[1:] + '.out'
output( '*** Iperf: testing bandwidth between ' )
output( "%s and %s\n" % ( client.name, server.name ) )
iperfArgs = 'iperf -u '
bwArgs = '-b ' + udpBw + ' '
print "***start server***"
server.cmd( iperfArgs + '-s -i 1' + ' > /home/sdnlab/log/' + filename + '&')
print "***start client***"
client.cmd(
iperfArgs + '-t '+ str(period) + ' -c ' + server.IP() + ' ' + bwArgs
+' > /home/sdnlab/log/' + 'client' + filename +'&')
说明:为方便用户实验,该段代码在/home/ftp/iperf_single.txt文件中已预置。
步骤5
在Mininet类中添加自定义命令iperfmulti()函数,iperfmulti函数主要是实现依次为每一台主机随机选择另一台主机作为iperf的服务器端,通过调用iperf_single,自身以客户端身份按照指定参数发送UDP流,服务器生成的报告以重定向的方式输出到文件中,使用iperfmulti命令,主机随机地向另一台主机发起一条恒定带宽的UDP数据流。具体代码如下所示,建议将代码放置在“def iperf_single”下。
def iperfMulti(self, bw, period=60):
base_port = 5001
server_list = []
client_list = [h for h in self.hosts]
host_list = []
host_list = [h for h in self.hosts]
cli_outs = []
ser_outs = []
_len = len(host_list)
for i in xrange(0, _len):
client = host_list[i]
server = client
while( server == client ):
server = random.choice(host_list)
server_list.append(server)
self.iperf_single(hosts = [client, server], udpBw=bw, period= period, port=base_port)
sleep(.05)
base_port += 1
sleep(period)
print "test has done"
说明:为方便用户实验,该段代码在/home/ftp/iperfmulti.txt文件中已预置。
步骤6
执行如下命令,打开cli.py文件。
$ sudo vi openlab/mininet/mininet/cli.py
步骤7
在cli.py中添加如下代码,注册iperfmulti命令。
def do_iperfmulti( self, line ):
"""Multi iperf UDP test between nodes"""
args = line.split()
if len(args) == 1:
udpBw = args[ 0 ]
self.mn.iperfMulti(udpBw)
elif len(args) == 2:
udpBw = args[ 0 ]
period = args[ 1 ]
err = False
self.mn.iperfMulti(udpBw, float(period))
else:
error('invalid number of args: iperfmulti udpBw period\n' +
'udpBw examples: 1M 120\n')
说明:为方便用户实验,该段代码在/home/ftp/do_iperfmulti.txt文件中已预置。
步骤8
执行命令sudo vi openlab/mininet/bin/mn
打开mn文件,在mn中加入iperfmulti可执行命令,如下所示。
步骤9
执行如下命令,重新编译Mininet。
$ cd openlab/mininet/util
$./install.sh -n
步骤10
执行sudo mn
命令创建一个topo,查看是否存在iperfmulti命令,以此验证iperfmulti是否成功。
步骤11
执行exit
命令退出Mininet。
二、构建多数据中心网络拓扑
步骤1
执行如下命令,创建多数据中心拓扑创建脚本。
$ cd /home/openlab/openlab/mininet/custom
$ sudo vi fattree.py
步骤2
添加如下内容,通过python脚本自定义拓扑,创建包含两个数据中心的网络拓扑。
#!/usr/bin/python
"""Custom topology example
Adding the 'topos' dict with a key/value pair to generate our newly defined
topology enables one to pass in '--topo=mytopo' from the command line.
"""
from mininet.topo import Topo
from mininet.net import Mininet
from mininet.node import RemoteController,CPULimitedHost
from mininet.link import TCLink
from mininet.util import dumpNodeConnections
class MyTopo( Topo ):
"Simple topology example."
def __init__( self ):
"Create custom topo."
# Initialize topology
Topo.__init__( self )
L1 = 2
L2 = L1 * 2
L3 = L2
c = []
a = []
e = []
# add core ovs
for i in range( L1 ):
sw = self.addSwitch( 'c{}'.format( i + 1 ) )
c.append( sw )
# add aggregation ovs
for i in range( L2 ):
sw = self.addSwitch( 'a{}'.format( L1 + i + 1 ) )
a.append( sw )
# add edge ovs
for i in range( L3 ):
sw = self.addSwitch( 'e{}'.format( L1 + L2 + i + 1 ) )
e.append( sw )
# add links between core and aggregation ovs
for i in range( L1 ):
sw1 = c[i]
for sw2 in a[i/2::L1/2]:
# self.addLink(sw2, sw1, bw=10, delay='5ms', loss=10, max_queue_size=1000, use_htb=True)
self.addLink( sw2, sw1 )
# add links between aggregation and edge ovs
for i in range( 0, L2, 2 ):
for sw1 in a[i:i+2]:
for sw2 in e[i:i+2]:
self.addLink( sw2, sw1 )
#add hosts and its links with edge ovs
count = 1
for sw1 in e:
for i in range(2):
host = self.addHost( 'h{}'.format( count ) )
self.addLink( sw1, host )
count += 1
topos = { 'mytopo': ( lambda: MyTopo() ) }
Mininet创建网络拓扑的代码中,可以通过改变代码中定义的L1变量来设置核心交换机的数量,并通过添加额外的交换机和链路来构成更复杂的数据中心网络拓扑。随着边缘交换机的增加,主机个数也随之增长,利用Mininet的易用性和扩展性,可以创建基于多种数据中心场景下的网络拓扑,达到更好更全面的实验效果。
说明:为方便用户实验,该段代码在/home/ftp/fattree.py文件中已预置。
步骤3
登录控制器主机,打开命令行执行终端,执行ifconfig命令查看主机的IP地址。
说明:本实验中主机的IP地址为30.0.1.69,具体实验根据实际情况为准。
步骤4
切换到Mininet主机,执行如下命令,启动Mininet,生成测试拓扑结构。
# sudo mn --custom fattree.py --topo mytopo --controller=remote,ip=30.0.1.69,port=6653
步骤5
执行pingall
命令,验证主机间的连通性。
步骤6
登录控制器,打开浏览器,输入URL地址:http://30.0.1.69:8181/index.html 查看ODL控制器Web页面拓扑,用户名密码分别为admin/admin,结果如下所示。
三、测试TCP网络带宽
步骤1
切换到Mininet主机,执行命令iperf h1 h2
在h1和h2之间进行iperf操作,测试同一交换机内部的主机间连通性及通信带宽。
步骤2
执行命令iperf h1 h3
在h1和h3之间进行iperf操作,测试相同汇聚交换机下不同机架的主机间连通性及通信带宽。
步骤3
执行命令iperf h1 h5
在h1和h5之间进行iperf操作,测试相同核心交换机不同汇聚交换机下的主机间连通性及通信带宽。
步骤4
执行命令iperfmulti 0.025M
设置带宽参数为0.025M,将能看到8台主机随机地向另外一台主机发送数据包。
步骤5
打开新的命令行执行窗口,执行如下命令查看数据记录,如下所示。
$ cd /home/sdnlab/log
$ ll
步骤6
执行命令sudo vi 1.out
打开服务端数据记录,如下所示。
步骤7
执行命令sudo vi client1.out
打开客户端数据记录,如下所示。