数据中心两种常用流量模型运用mininet的实现
为什么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的实现相关推荐
- 【NLP-NER】命名实体识别中最常用的两种深度学习模型
命名实体识别(Named Entity Recognition,NER)是NLP中一项非常基础的任务.NER是信息提取.问答系统.句法分析.机器翻译等众多NLP任务的重要基础工具. 上一期我们介绍了N ...
- 归一化mysql函数_数据归一化和两种常用的归一化方法
数据归一化和两种常用的归一化方法 一.总结 一句话总结: min-max标准化:x* =(x-min)/(max-min):新数据加入,需重新计算max和min Z-score标准化:x* =(x-μ ...
- 数据归一化及两种常用归一化方法
数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可 ...
- 数据归一化和两种常用的归一化方法
数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可 ...
- 数据归一化:两种常用的归一化方法
数据归一化:不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据归一化处理,以解决数据指标之间的可比性.原始数据经过数据归一化处理后,各 ...
- Java程序员需要了解的两种服务器设计模型
我们在IO模型和Java网络编程模型中,对IO有了一定的理解.这一篇,主要讲解基于事件驱动的两种是在原来基础上的扩展.在基于事件驱动的网络编程模型中,Reactor和Proactor模型是两种常用的I ...
- Spring Cloud Config采用Git存储时两种常用的配置策略
由于Spring Cloud Config默认采用了Git存储,相信很多团队在使用Spring Cloud的配置中心时也会采用这样的策略.即便大家都使用了Git存储,可能还有各种不同的配置方式,本文就 ...
- Netty之四种常用 IO 模型
四种常用 IO 模型: 同步阻塞 BIO: 最简单的 IO 模型,用户线程在读写时被阻塞. 数据拷贝指请求到的数据先存放在内核空间, 然后从内核空间拷贝至程序的缓冲区. 用户线程在 IO 过程中被阻塞 ...
- 获得GPS数据的两种方法 1读串口
获得GPS数据的两种方法 1读串口 - [技术] 版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://memset.blogbus.com/logs/17801310.ht ...
最新文章
- HihoCoder - 1828 Saving Tang Monk II(bfs+动态规划/bfs+优先队列)
- JAVA标识符中含小数点可以吗_数值类型小数点后是否可以接零问题
- project ‘org.springframework.boot:spring-boot-starter-parent:2.1.4.RELEASE‘ not found
- kali linux wps 2019 删除_良心推荐!Linux系统下常用办公软件大盘点
- c语言求前缀后缀大全,温故而知新_C语言_前缀++(--)和后缀++(--)
- (原创)一步一步学ZedBoard Zynq(一):ZedBoard的第一个工程Helloworld
- c语言加密字母向右移两位,C语言二进制除法用左右移位来表示
- SWFUpload 2.5.0版 官方说明文档 中文翻译版
- c语言5的阶乘流程图_求n流程图(求n的阶乘的算法框图)
- xshell官网下载及安装(免费版本)
- 树莓派做无线打印服务器,用树莓派和 CUPS 打印服务器将你的打印机变成网络打印机...
- FIR内插滤波器的FPGA实现(一)-matlab实现
- 【Linux】Linux input子系统之Input event codes
- 吕本富:中国Web2.0缺乏创新 与美国差距拉大
- 支付宝扫码验签实例php,PHP 支付宝支付,支付宝回调
- Linux程序设计 读笔2 Shell脚本
- RealFlow在线教程翻译(2)——Foam with SPH Fluids(基于平滑粒子流体动力学算法(SPH)的流体泡沫)
- 苹果cmsv10白色简约好看的影视站自适应模板源码
- 华为裁员34岁以上程序员?90后的中年危机,即将到来!
- 米思齐按键的花样玩法(8种方式)
热门文章
- Python之路【第十篇】:索引与切片的不同
- js简单验证码的生成和验证
- springcloud(二):注册中心Eureka
- PHP函数——urlencode() 函数
- SAP 中如何寻找增强
- 分享一个HTML5画布实现的超酷文字弹跳球效果
- Activity service 通信
- JavaScript深入浅出第1课:箭头函数中的this究竟是什么鬼?
- FastDfs上传图片时报错configparser.NoOptionError: No option ‘connect_timeout‘ in section: ‘__config__‘
- 利用datagrip从hive导入csv数据(还没整理完)