mininet多数据中心带宽实验(2021.6.27)
目的:创建多数据中心拓扑 iperf使用 通过程序生成真实网络流量
1.mininet创建fattree拓扑。
先进入mininet/custom目录下,这里是存放fattree.py topo文件的地方,然后执行以下命令
sudo mn --custom fattree.py --topo mytopo --controller=remote,ip=192.168.231.131,port=6653
可以通过变更核心交换机L1的个数变更数据中心个数。
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 ) # 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() ) }
2.开启ryu
首先进入ryu/ryu/app目录,然后执行以下命令
sudo ryu-manager --verbose simple_switch_stp_13.py ofctl_rest.py rest_topology.py
注意!:这里为了防止广播风暴,使用了STP协议simple_switch_stp_13.py。
3.验证连通性。
先pingall,打流。
可能刚开始出现丢包情况,等待一会儿,就全部ping得通了。

4.测试h1与其它主机之间的带宽。
这里放上一张topo图,更好理解。


现在有个问题?
mininet里无法所有主机间的带宽测试,需要自定义命令去实现该功能。
5.流量随机模型:所有主机间的随机带宽测试
mininet自定义命令的步骤:

① mininet/net.py定义iperf_single()函数
该函数实现功能:在两个主机间iperf udp测试,并且在server端记录
def iperf_single( self,hosts=None, udpBw='10M', period=60, port=5001): 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/horizon/log/' + filename + '&') print "***start client***" client.cmd( iperfArgs + '-t '+ str(period) + ' -c ' + server.IP() + ' ' + bwArgs +' > /home/horizon/log/' + 'client' + filename +'&')
如图所示,其中home/horizon/log目录需要是真实存在的路径
所以使用命令cd home ; sudo mkdir horizon; sudo mkdir log 创建目录

上面的iperf_single函数只是两个主机之间的测试,下面进入主题,多个主机间测试函数iperfmulti()
②net.py中添加自定义的iperfmulti()函数
依次为每一台主机随机选择另一台主机作为iperf的服务器端,通过调用iperf_single,自身以客户端按照指定参数发送UDP流。
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"
如图所示

③mininet/cli.py中注册iperfmulti命令
解析用户输入的命令,net.py定义的iperfmulti命令需要在CLI类中注册。
def do_iperfmulti( self, line ): 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')
如图所示

④bin/mn中加入iperfmulti可执行命令
将iperfmulti加入到对应的列表中。修改代码,不是添加代码。
# optional tests to run TESTS = [ 'cli', 'build', 'pingall', 'pingpair', 'iperf', 'all', 'iperfudp', 'none', 'iperfmulti'] ALTSPELLING = { 'pingall': 'pingAll', 'pingpair': 'pingPair', 'iperfudp': 'iperfUdp', 'iperfUDP': 'iperfUdp', 'iperfmulti': 'iperfMulti' }
如图所示。

⑤重新编译mininet
进入mininet/util目录,重新编译安装mininet.
./install.sh -n

代表成功的截图

=================================================================
重新创建网络,如mn,输入iperf,可用table补全iperfmulti(补全可能会卡住,知道就行。还是打全iperfmulti命令把),从而可使用iperfmulti进行流量随机模型的测试。

使用iperfmulti 命令
命令格式:iperfmulti <带宽>
如 图示

随后在/home/horizon/log/目录下生成 5个文件

分别对应server1,server2,client1,client2的带宽测试输出文件。输出4个文件是由于作者使用了mininet默认的网络拓扑做实验,网络中只有两台主机,这两台主机分别各当了一次server、client,因此共有两组输出文件。
查看iperf测试结果
(1)10.0.0.1当主机,10.0.0.2当服务器

(2)10.0.0.1当服务器,10.0.0.2当主机


浙公网安备 33010602011771号