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

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

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

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

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. class Mininet(object):
    def function(self,**kwargs):
    #function code

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


  1. class CLI(Cmd):
    def do_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. 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/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. 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


  1. 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')

修改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. def random_pick( self, _list, probabilities):  
        x = random.uniform(0,1)  
        p = None
        cumulative_probability = 0.0  
        for item, item_probability in zip(_list, probabilities):  
            cumulative_probability += item_probability
            p = item
            if x < cumulative_probability:break
        return p

修改mininet/net.py


  1. base_port = 5001
  2. server_list = []
  3. client_list = []
  4. client_list = [h for h in self.hosts]
  5. cli_outs = []
  6. ser_outs = []
  7. host_list = []
  8. host_list = [h for h in self.hosts]
  9. pc = 1 - pt - pa
  10. p_list = [pt,pa,pc]
  11. _len = len(self.hosts)
  12. for key in xrange(_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. def do_iperfpb(self, line):
    """Multi iperf UDP test with probablity"""
  2. args = line.split()
  3. if len(args) == 1:
  4. udpBw = args[ 0 ]
  5. self.mn.iperfMulti(udpBw)
  6. elif len(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中国”

时间: 2024-08-03 20:20:32

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

Android之Intent附加数据的两种实现方法

本文实例讲述了Android之Intent附加数据的两种实现方法.分享给大家供大家参考.具体如下: 第一种写法,用于批量添加数据到Intent: Intent intent = new Intent(); Bundle bundle = new Bundle(); //该类用作携带数据 bundle.putString("name", "林计钦"); intent.putExtras(bundle); //为意图追加额外的数据,意图原来已经具有的数据不会丢失,但ke

Silverlight实用窍门系列:37.Silverlight和ASP.NET相互传参的两种常用方式(QueryString,Cookie)【附带实例源码】

在本节中将讲述Silverlight和ASP.NET页面的相互传参的两种常用方式:Cookie和QueryString.首先我们新建一个名为SLConnectASP.NET的Silverlight应用程序,然后在SLConnectASP.NET.web项目中添加一个Index.aspx的页面. 一.Silverlight和ASPX页面的QueryString传参 实现思路:在Silverlight端跳转到页面到Index.aspx并且传递一个QueryString参数ID,在该Index.asp

Windows校验文件哈希的两种常用方式

大家经常都到哪儿去下载软件和应用程序呢?有没想过下载回来的软件.应用程序或资源是否安全呢?在 Windows 10 和 Office 2016 发布当初,很多没权限的朋友都使用第三方网站去下载安装映像.而大家如何保证自己下载回来的映像或软件就是官方版本,而没有被别人篡改过呢? 很多朋友会想到将下载回来的资源校验 MD5 或 SHA1 与官方版哈希值进行对比,如果无误则表示未被篡改.大家平常在 Windows 中都使用何种工具算校验值呢?本文向大家推荐 Windows 校验文件哈希的两种常用方式.

使用Java构造和解析Json数据的两种方法(详解二)_java

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Json数据的方法

PHP实现更新中间关联表数据的两种方法_php技巧

本文以示例形式展示了PHP实现更新中间关联表数据的两种方法.分享给大家供大家参考之用.具体方法如下: 首先,中间关联表:这里的中间表只存表1的主键和表2的主键,即多对多的形式. 执行数据添加和删除为框架内部方法,不属于思路部分. 方法一:先全部删除旧数据,后添加新数据 $res = $this->classes->classEdit($id, $data); //修改主表数据 if($res) { //先删除关联表数据 $bool = $this->lesson_classes->

Python 多线程开发的两种常用方式

目前python 提供了几种多线程实现方式 thread,threading,multithreading ,其中thread模块比较底层,而threading模块是对thread做了一些包装,可以更加方便的被使用. 2.7版本之前python对线程的支持还不够完善,不能利用多核CPU,但是2.7版本的python中已经考虑改进这点,出现了multithreading  模块.threading模块里面主要是对一些线程的操作对象化,创建Thread的class.一般来说,使用线程有两种模式: A

Android 中倒计时验证两种常用方式实例详解

Android 中倒计时验证两种常用方式实例详解 短信验证码功能,这里总结了两种常用的方式,可以直接拿来使用.看图: 说明:这里的及时从10开始,是为了演示的时间不要等太长而修改的. 1.第一种方式:Timer /** * Description:自定义Timer * <p> * Created by Mjj on 2016/12/4. */ public class TimeCount extends CountDownTimer { private Button button; //参数依

为提升在线语音识别效率,他创造了两种升级版算法模型

近日,阿里算法专家坤承携<使用改进版本的LATENCY-CONTROLLED BLSTM 算法模型提升在线语音识别效率>(IMPROVING LATENCY-CONTROLLED BLSTM ACOUSTIC MODELS FOR ONLINE SPEECH RECOGNITION)参与ICASSP2017大会. 论文作者坤承与参会者交流 论文研究的出发点在于,为了能够取得更好的语音识别准确率,在声学模型建模中使用了Latency-controlled BLSTM 模型. 详见95188:BL

认识数据中心两个关键指标RTO和RPO

用来描述和评价数据中心有很多专有参数和指标,通过这些数据可以反映出数据中心的各种运行状态,其中有两个关键指标必须有所了解: RTO和RPO.RTO和RPO是数据中心灾难恢复方面的重要参考指标.现在的数据中心对业务的连续性有苛刻要求,但是故障不可避免,一旦发生了故障就需要启动备份机制,确保业务的连续性,所以现在数据中心都有较为完善的容灾机制,RTO和RPO可以很好地反映出数据中心容灾性能如何.这两个参数是数据中心在运维过程中,一定要重点关注的指标.这个指标的好与差,是基于数据中心现有的各种综合运行