当前位置: 首页 > 科技观察

使用mininet实现数据中心两种常用流量模型

时间:2023-03-13 05:52:32 科技观察

编者按:网络性能评估的一个巨大挑战是如何生成真实的网络流量。幸运的是,可以通过程序创建人工网络流量。通过建立测试环境来模拟真实情况。本文以数据中心网络为目标场景,在mininet模拟环境中尽可能还原数据中心内部的真实流量。目前常用的流量模型有两种:随机模型:一台主机以等概率向网络中的另一台任意主机发送数据包;主机号为(m+i)、(m+j)、(m+k)的主机发送数据包。我们使用mininet中的iperf工具在网络中产生UDP流量,iperf客户端将数据流发送给iperf服务器,服务器接收并记录相关信息。mininet内置的控制台虽然有丰富的可用命令,但是并没有提供清晰的API接口来支持用户自定义命令。在网络节点很多的数据中心这样复杂的模拟环境中做一些批处理工作需要非常大的工作量,比如流量通过iperf在所有主机之间流动。所以我们需要给mininet添加自定义命令,完成mininet新命令的扩展。一、mininet功能扩展mininet中的功能扩展主要分为3步:1、修改mininet/net.py:net模块实现了Mininet类,该类是仿真平台mininet的主类。该类完成节点添加配置和基本网络功能以及一些选项功能的实现。我们需要在这个类中定义我们的自定义函数。Mininet类(对象):def函数(self,**kwargs):#functioncode2。修改mininet/cli.py:cli模块定义了CLI类,为Mininet提供命令行接口解析用户输入的命令,之前定义的自定义命令需要通过注册函数在CLI类中注册这个自定义命令。classCLI(Cmd):defdo_function(self,line):#do_function代码完成命令注册和绑定。3、修改bin/mn:完成命令注册绑定后,需要在mininet执行解释器中注册命令与对应执行函数的映射关系。ALTSPELLING={'pingall':'pingAll','pingpair':'pingPair','iperfudp':'iperfUdp','function':'function'}net.py和cli.py都在mininet/mininet目录下,mn文件在mininet/bin目录下。代码修改完成后,需要重新编译安装mininet,即运行:$~/mininet/util/install.sh-n2.mininet中两种流量模型的实现2.1随机模型任意主机随机与等概率向另一台主机发起UDP数据流。修改mininet/net.py首先在两台主机之间进行iperf测试,在server端记录实现iperf_single函数:defiperf_single(self,hosts=None,udpBw='10M',period=60,port=5001):"""使用UDP在两个主机之间运行iperf。主机:主机列表;如果没有,则使用相反的主机返回:结果服务器和客户端速度的二元数组"""如果不是主机:返回else:assertlen(hosts)==2client,server=hostsfilename=client.name[1:]+'.out'output('***Iperf:testingbandwidthbetween')output("%sand%s\n"%(client.name,server.name))iperfArgs='iperf-u'bwArgs='-b'+udpBw+''打印“***启动服务器***”server.cmd(iperfArgs+'-s-i1'+'>/home/zg/log/'+文件名+'&')print"***startclient***"client.cmd(iperfArgs+'-t'+str(period)+'-c'+server.IP()+''+bwArgs+'>/home/zg/log/'+'client'+filename+'&')为mininet添加自定义命令iperfmulti,依次为每个主机随机选择另一个rhost作为iperf的服务器端,通过调用iperf_single,作为客户端根据指定的参数发送一个UDP流,将服务器生成的报告以重定向的方式输出到文件中。使用iperfmulti命令,主机随机发起一个带宽恒定的UDP数据流给另一台主机defiperfMulti(self,bw,period=60):base_port=5001server_list=[]client_list=[hforhinself.hosts]host_list=[]host_list=[hforhinself.hosts]cli_outs=[]ser_outs=[]_len=len(host_list)foriinxrange(0,_len):client=host_list[i]server=clientwhile(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+=1sleep(period)print"testhasdone"修改mininet/cli.pydefdo_iperfmulti(self,line):"""MultiiperfUDPtestbetweennodes"""args=line.split()iflen(args)==1:udpBw=args[0]self.mn.iperfMulti(udpBw)eliflen(args)==2:udpBw=args[0]period=args[1]err=Falseself.mn.iperfMulti(udpBw,float(period))else:error('无效的参数数量:iperfmultiudpBwperiod\n'+'udpBwexamples:1M120\n')修改bin/mn在mininet/bin目录下修改mn文件,将ipe将rfpb添加到相应的列表**,进入mininet/util目录,重新编译安装mininet$~/mininet/util/install.sh-nrestartmininet,进入iperf,使用table完成iperfpb,这样iperfpb就可以用来随机测试流量了模型。#p#2.2概率模型为mininet添加一个自定义命令iperfpb,发送每台主机(编号m)向主机编号(m+i),(m+j),(m+k)的主机发送数据包。通过调用iperf_single,作为客户端根据指定的参数发送UDP流,将服务器生成的报告以重定向的方式输出到文件中。使用iperfpb命令,主机根据概率将数据发送给其他主机。选定的主机发起一个恒定带宽的UDP流。概率选择函数为了完成一定概率的主机选择,我们需要实现一个概率选择函数randompick,可以用来从一个列表中以不同的概率随机选择一些元素。下面为randompick的实际过程:defrandom_pick(self,_list,probabilities):x=random.uniform(0,1)p=Nonecumulative_probability=0.0foritem,item_probabilityinzip(_list,probabilities):cumulative_probability+=item_probabilityp=itemifx