为什么80%的码农都做不了架构师?>>>   

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

■随机模型:主机向在网络中的另一任意主机以等概率发送数据包

■概率模型:在网络中,编号为m的主机分别以概率Pt 、Pa 、Pc 、向主机编号为(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的主体类,该类完成节点添加配置、网络基本功能和一些选项功能的实现。我们需要将我们自定义的函数定义在该类中。

class Mininet(object):

def function(self, **kwargs):

#function code

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

class CLI(Cmd):

def do_function(self, line):

#do_function code

完成命令注册与绑定。

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 -n

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

2.1 随机模型

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

修改mininet/net.py

首先,先在两个主机之间进行iperf测试,并且在server端记录,实现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 + ' '

print "***start server***"

serverNaNd( iperfArgs + '-s -i 1' + ' > /home/zg/log/' + filename + '&')

print "***start client***"

clientNaNd(

iperfArgs + '-t '+ str(period) + ' -c ' + server.IP() + ' ' + bwArgs

+' > /home/zg/log/' + 'client' + filename +'&')

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

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加入到对应的列表中。

ALTSPELLING = { 'pingall': 'pingAll',

'pingpair': 'pingPair',

'iperfudp': 'iperfUdp',

'iperfUDP': 'iperfUdp',

'iperfpb':'iperfPb' }

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

$~/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的实现过程:

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

def iperfPb (self, bw, period = 60, i = 1,j = 4,k = 64,pt = 0.5,pa = 0.3):

base_port = 5001

server_list = []

client_list = []

client_list = [h for h in self.hosts]

cli_outs = []

ser_outs = []

host_list = []

host_list = [h for h in self.hosts]

pc = 1 - pt - pa

p_list = [pt,pa,pc]

_len = len(self.hosts)

for key in xrange(_len):

client = host_list[key]

access_host = [host_list[(key+i)%_len],host_list[(key+j)%_len],host_list[(key+k)%_len]]

server = self.random_pick(access_host,p_list)

server_list.append(server)

self.iperf_single(hosts = [client, server], udpBw=bw, port=base_port)

sleep(.05)

sleep(period)

print "test has done"

修改mininet/cli.py

def do_iperfpb(self, line):

"""Multi iperf UDP test with probablity"""

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.iperfPb(udpBw, float(period))

else:

error('invalid number of args: iperfmulti udpBw period\n' +

'udpBw examples: 1M 120\n')

修改bin/mn

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

ALTSPELLING = { 'pingall': 'pingAll',

'pingpair': 'pingPair',

'iperfudp': 'iperfUdp',

'iperfUDP': 'iperfUdp',

'iperfpb':'iperfPb' }

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

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

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

作者简介:

张歌,2014/09-至今,北京邮电大学网络技术研究院 网络与交换技术国家重点实验室攻读硕士研究生

本文转载自SDNLAB

转载于:https://my.oschina.net/sdnlab/blog/408054

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

  1. 【NLP-NER】命名实体识别中最常用的两种深度学习模型

    命名实体识别(Named Entity Recognition,NER)是NLP中一项非常基础的任务.NER是信息提取.问答系统.句法分析.机器翻译等众多NLP任务的重要基础工具. 上一期我们介绍了N ...

  2. 归一化mysql函数_数据归一化和两种常用的归一化方法

    数据归一化和两种常用的归一化方法 一.总结 一句话总结: min-max标准化:x* =(x-min)/(max-min):新数据加入,需重新计算max和min Z-score标准化:x* =(x-μ ...

  3. 数据归一化及两种常用归一化方法

    数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可 ...

  4. 数据归一化和两种常用的归一化方法

    数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可 ...

  5. 数据归一化:两种常用的归一化方法

    数据归一化:不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据归一化处理,以解决数据指标之间的可比性.原始数据经过数据归一化处理后,各 ...

  6. Java程序员需要了解的两种服务器设计模型

    我们在IO模型和Java网络编程模型中,对IO有了一定的理解.这一篇,主要讲解基于事件驱动的两种是在原来基础上的扩展.在基于事件驱动的网络编程模型中,Reactor和Proactor模型是两种常用的I ...

  7. Spring Cloud Config采用Git存储时两种常用的配置策略

    由于Spring Cloud Config默认采用了Git存储,相信很多团队在使用Spring Cloud的配置中心时也会采用这样的策略.即便大家都使用了Git存储,可能还有各种不同的配置方式,本文就 ...

  8. Netty之四种常用 IO 模型

    四种常用 IO 模型: 同步阻塞 BIO: 最简单的 IO 模型,用户线程在读写时被阻塞. 数据拷贝指请求到的数据先存放在内核空间, 然后从内核空间拷贝至程序的缓冲区. 用户线程在 IO 过程中被阻塞 ...

  9. 获得GPS数据的两种方法 1读串口

    获得GPS数据的两种方法 1读串口 - [技术] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://memset.blogbus.com/logs/17801310.ht ...

最新文章

  1. HihoCoder - 1828 Saving Tang Monk II(bfs+动态规划/bfs+优先队列)
  2. JAVA标识符中含小数点可以吗_数值类型小数点后是否可以接零问题
  3. project ‘org.springframework.boot:spring-boot-starter-parent:2.1.4.RELEASE‘ not found
  4. kali linux wps 2019 删除_良心推荐!Linux系统下常用办公软件大盘点
  5. c语言求前缀后缀大全,温故而知新_C语言_前缀++(--)和后缀++(--)
  6. (原创)一步一步学ZedBoard Zynq(一):ZedBoard的第一个工程Helloworld
  7. c语言加密字母向右移两位,C语言二进制除法用左右移位来表示
  8. SWFUpload 2.5.0版 官方说明文档 中文翻译版
  9. c语言5的阶乘流程图_求n流程图(求n的阶乘的算法框图)
  10. xshell官网下载及安装(免费版本)
  11. 树莓派做无线打印服务器,用树莓派和 CUPS 打印服务器将你的打印机变成网络打印机...
  12. FIR内插滤波器的FPGA实现(一)-matlab实现
  13. 【Linux】Linux input子系统之Input event codes
  14. 吕本富:中国Web2.0缺乏创新 与美国差距拉大
  15. 支付宝扫码验签实例php,PHP 支付宝支付,支付宝回调
  16. Linux程序设计 读笔2 Shell脚本
  17. RealFlow在线教程翻译(2)——Foam with SPH Fluids(基于平滑粒子流体动力学算法(SPH)的流体泡沫)
  18. 苹果cmsv10白色简约好看的影视站自适应模板源码
  19. 华为裁员34岁以上程序员?90后的中年危机,即将到来!
  20. 米思齐按键的花样玩法(8种方式)

热门文章

  1. Python之路【第十篇】:索引与切片的不同
  2. js简单验证码的生成和验证
  3. springcloud(二):注册中心Eureka
  4. PHP函数——urlencode() 函数
  5. SAP 中如何寻找增强
  6. 分享一个HTML5画布实现的超酷文字弹跳球效果
  7. Activity service 通信
  8. JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼?
  9. FastDfs上传图片时报错configparser.NoOptionError: No option ‘connect_timeout‘ in section: ‘__config__‘
  10. 利用datagrip从hive导入csv数据(还没整理完)