[环境搭建]mininet中实现随机流量模型,20180130
[环境搭建]mininet中实现随机流量模型
本文记录了如何实现“mininet拓扑中任意一台主机以等概率随机向另外一台主机发送一条UDP数据流,并将iperf测试结果自动保存到文件”的方法,概括来说则是“为mininet设置一条可实现上述功能的自定义命令‘iperfmulti’”。
1.添加自定义函数及自定义命令
使用nano编辑器打开并编辑“***/mininet/net.py”文件,输入命令:
nano ***/mininet/net.py
注:由于个人的mininet文件夹所在目录不同,故后文都用“***”表示该部分路径。
在“Mininet”类的类体中添加自定义函数“iperf_single”:
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 + ' ' """ 设置UDP模式发送的带宽大小 """
print "***start server***"
server.cmd( iperfArgs + '-s -i 1' + ' > /home/zg/log/' + filename + '&') """ 1.在此编辑服务器端的iperf命令,添加需要的参数;2.设置iperf命令的输出结果被保存到的路径 """
print "***start client***"
client.cmd(
iperfArgs + '-t '+ str(period) + ' -c ' + server.IP() + ' ' + bwArgs
+' > /home/zg/log/' + 'client' + filename +'&') """ 1.在此编辑客户端的iperf命令,添加需要的参数;2.设置iperf命令的输出结果被保存到的路径 """
“def”前应有4个空格,同时,“def”下面的语句也应保持正确的缩进。
在“Mininet”类的类体中添加自定义命令代码“iperfmulti”:
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"
仍需注意的是Python语句的缩进。
添加代码后如图所示:
保存“***/mininet/net.py”文件,退出nano编辑器
在键盘上按“CTRL+X”,编辑器下方显示出“是否需要保存”的提示信息,如图:
2.在CLI类中令注册自定义命
修改“***/mininet/mininet/cli.py”文件
使用nano编辑器打开并编辑“***/mininet/mininet/cli.py”文件,输入命令:
nano ***/mininet/mininet/cli.py
在nano编辑器中添加代码:
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')
注:代码需要添加在“CLI”类的类体中。
在键盘上依次按下“CTRL+X”、“Y”键、“ENTER”键,即可保存“***/mininet/mininet/cli.py”文件同时退出nano编辑器。
3.在mininet执行解释器中注册自定义命令与对应执行函数的映射关系
修改“***/mininet/bin/mn”文件
使用nano编辑器打开并编辑“***/mininet/bin/mn”文件,输入命令:
nano ***/mininet/bin/mn
找到“ALTSPELLING”,添加“iperfmulti”及“iperfMulti”如图红框部分:
4.重新编译mininet
输入命令:
/***/mininet/util/install.sh -n
5.如何使用自定义命令“iperfmulti”
命令格式: iperfmulti <带宽>
例如:
iperfmulti 150M
输入命令并观察到终端输出“test has done”后(如上图),可查看测试结果,由前文自定义函数“iperf_single”的代码可知,测试结果保存在目录"/home/zg/log"下。
观察"/home/zg/log"目录下有什么文件,使用以下2条命令:
cd /home/zg/log
ls
由上图知,输出了4个文件,分别对应server1,server2,client1,client2的带宽测试输出文件。输出4个文件是由于作者使用了mininet默认的网络拓扑做实验,网络中只有两台主机,这两台主机分别各当了一次server、client,因此共有两组输出文件。
查看iperf测试结果,使用命令“cat <文件名>”,例如:
cat 1.out
观察到输出结果: