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

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

编者按:在网络性能评估中一个巨大的挑战就是如何生成真实的网络流量,还好可以通过程序来创造人工的网络流量,通过建立测试环境来模拟真实的状况。本文就以数据中心网络为目标场景,来在mininet仿真环境中尽可能地还原数据中心内部的真实流量情况。目前有两种常用的流量模型:

  • 随机模型:主机向在网络中的另一任意主机以等概率发送数据包
  • 概率模型:在网络中,编号为m的主机分别以概率Pt 、Pa 、Pc 、向主机编号为(m+i)、(m+j)、(m+k)的主机发送数据包

data center two model in mininet realized

data center two model in mininet realized

我们使用mininet中的iperf工具在网络中生成UDP流量,iperf客户端传送数据流到iperf的服务端,由服务端接收并记录相关信 息。mininet自带控制台可供使用的命令虽然已经比较丰富,但却并未给出较为明确的API接口来支持用户自定义命令。在诸如数据中心这样复杂、网络节 点较多的仿真环境中做一些批处理的工作就需要非常大的,比如通过iperf在所有主机之间发生流量。所以我们需要将自定义命令添加到mininet中,在 mininet中完成新命令的拓展。

一、 mininet功能拓展

在mininet中进行功能拓展主要分为3步:
1. 修改mininet/net.py: net模块实现Mininet类,是仿真平台mininet的主体类,该类完成节点添加配置、网络基本功能和一些选项功能的实现。我们需要将我们自定义的函数定义在该类中。

  1. classMininet(object):
    deffunction(self,**kwargs):
    #functioncode

2. 修改mininet/cli.py: cli模块定义了CLI类,为米你呢他提供命令行接口,用于解析用户输入的命令,之前定义的自定义命令需要在CLI类中通过注册函数注册这条自定义命令。

  1. classCLI(Cmd):
    defdo_function(self,line):
    #do_function code

完成命令注册与绑定。

3. 修改bin/mn: 在完成命令注册与绑定后,需要在mininet执行解释器中注册命令与对应执行函数的映射关系。

  1. ALTSPELLING={'pingall':'pingAll',
    'pingpair':'pingPair',
    'iperfudp':'iperfUdp',
    'function':'function'}

net.py和cli.py均在mininet/mininet目录,mn文件在在mininet/bin目录中。在代码修改完成后需要重新编译安装一遍mininet,即运行:

  1. $~/mininet/util/install.sh-n

二、 两种流量模型在mininet中的实现

2.1 随机模型

任意一台主机以等概率随机地向另外一台主机发起一条UDP数据流。

修改mininet/net.py

首先,先在两个主机之间进行iperf测试,并且在server端记录,实现iperf_single函数:

  1. defiperf_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"""
           ifnothosts:
               return
           else:
               assertlen(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/zg/log/'+filename+'&')
           print"***start client***"
            client.cmd(
                iperfArgs+'-t '+str(period)+' -c '+server.IP()+' '+bwArgs
               +' > /home/zg/log/'+'client'+filename+'&')

着为mininet添加自定义命令iperfmulti,依次为每一台主机随机选择另一台主机作为iperf的服务器端,通过调用 iperf_single,自身以客户端身份按照指定参数发送UDP流,服务器生成的报告以重定向的方式输出到文件中,使用iperfmulti命令,主 机随机地向另一台主机发起一条恒定带宽的UDP数据流。

  1. defiperfMulti(self,bw,period=60):
        base_port=5001
        server_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=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

  1. defdo_iperfmulti(self,line):
       """Multi iperf UDP test between nodes"""
        args=line.split()
       iflen(args)==1:
            udpBw=args[0]
           self.mn.iperfMulti(udpBw)
       eliflen(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

在mininet/bin目录下修改mn文件,将iperfpb加入到对应的列表中。

  1. ALTSPELLING={'pingall':'pingAll',
               'pingpair':'pingPair',
               'iperfudp':'iperfUdp',
               'iperfUDP':'iperfUdp',
               'iperfpb':'iperfPb'}

最后,进入mininet/util目录,重新编译安装mininet

  1. $~/mininet/util/install.sh-n

重启mininet,输入iperf,可用table补全iperfpb,从而可使用iperfpb进行流量随机模型的测试。

2.2 概率模型

为mininet添加自定义命令iperfpb,依次为每一台主机(编号为m)分别以概率Pt 、Pa 、Pc 向主机编号为(m+i)、(m+j)、(m+k)的主机发送数据包,通过调用iperf_single,自身以客户端身份按照指定参数发送UDP流,服务 器生成的报告以重定向的方式输出到文件中,使用iperfpb命令,主机按概率向其他被选择的主机发起一条恒定带宽的UDP数据流。

概率选择函数

为完成以一定概率选择主机,我们需要实现一个概率选择函数randompick,这个函数可用于以不同的概率从一个列表中随机地选择一些元素。下面为randompick的实现过程:

  1. defrandom_pick(self,_list,probabilities): 
        x=random.uniform(0,1) 
        p=None
        cumulative_probability=0.0 
       foritem,item_probabilityinzip(_list,probabilities): 
            cumulative_probability+=item_probability
            p=item
           ifx<cumulative_probability:break
       returnp

修改mininet/net.py

  1. base_port=5001
  2. server_list=[]
  3. client_list=[]
  4. client_list=[hforhinself.hosts]
  5. cli_outs=[]
  6. ser_outs=[]
  7. host_list=[]
  8. host_list=[hforhinself.hosts]
  9. pc=1-pt-pa
  10. p_list=[pt,pa,pc]
  11. _len=len(self.hosts)
  12. forkeyinxrange(_len):
  13. client=host_list[key]
  14. access_host=[host_list[(key+i)%_len],host_list[(key+j)%_len],host_list[(key+k)%_len]]
  15. server=self.random_pick(access_host,p_list)
  16. server_list.append(server)
  17. self.iperf_single(hosts=[client,server],udpBw=bw,port=base_port)
  18. sleep(.05)
  19. sleep(period)
  20. print"test has done"

修改mininet/cli.py

  1. defdo_iperfpb(self,line):
    """Multi iperf UDP test with probablity"""
  2. args=line.split()
  3. iflen(args)==1:
  4. udpBw=args[0]
  5. self.mn.iperfMulti(udpBw)
  6. eliflen(args)==2:
  7. udpBw=args[0]
  8. period=args[1]
  9. err=False
  10. self.mn.iperfPb(udpBw,float(period))
  11. else:
  12. error('invalid number of args: iperfmulti udpBw period\n'+
  13. 'udpBw examples: 1M 120\n')

修改bin/mn

在mininet/bin目录下修改mn文件,将iperfpb加入到对应的列表中。

  1. ALTSPELLING={'pingall':'pingAll',
  2. 'pingpair':'pingPair',
  3. 'iperfudp':'iperfUdp',
  4. 'iperfUDP':'iperfUdp',

最后,进入mininet/util目录,重新编译安装mininet:

  1. $~/mininet/util/install.sh-n

重启mininet,输入iperf,可用table补全iperfpb,从而可使用iperfpb进行流量的概率模型的测试。

原文发布时间:2015-04-30

本文来自云栖合作伙伴“linux中国”