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

编者按:在网络性能评估中一个巨大的挑战就是如何生成真实的网络流量,还好可以通过程序来创造人工的网络流量,通过建立测试环境来模拟真实的状况。本文就以数据中心网络为目标场景,来在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***"

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数据流。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,642评论 18 139
  • 一、Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows、Linux和Uni...
    1b3bd36d9d21阅读 8,149评论 3 13
  • NAME dnsmasq - A lightweight DHCP and caching DNS server....
    ximitc阅读 2,822评论 0 0
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,561评论 1 118
  • 什么是黑茶? 黑茶是中国六大茶类之一。是因为安化黑茶通过高温火焙后,其色泽变得黑褐油润,其色如铁,故称“安化黑茶”...
    新茶商之旅阅读 184评论 0 0