編者按:在網(wǎng)絡(luò)性能評(píng)估中一個(gè)巨大的挑戰(zhàn)就是如何生成真實(shí)的網(wǎng)絡(luò)流量缀磕,還好可以通過(guò)程序來(lái)創(chuàng)造人工的網(wǎng)絡(luò)流量,通過(guò)建立測(cè)試環(huán)境來(lái)模擬真實(shí)的狀況。本文就以數(shù)據(jù)中心網(wǎng)絡(luò)為目標(biāo)場(chǎng)景刹缝,來(lái)在mininet仿真環(huán)境中盡可能地還原數(shù)據(jù)中心內(nèi)部的真實(shí)流量情況笛谦。目前有兩種常用的流量模型:
■隨機(jī)模型:主機(jī)向在網(wǎng)絡(luò)中的另一任意主機(jī)以等概率發(fā)送數(shù)據(jù)包
■概率模型:在網(wǎng)絡(luò)中抱虐,編號(hào)為m的主機(jī)分別以概率Pt、Pa饥脑、Pc恳邀、向主機(jī)編號(hào)為(m+i)、(m+j)灶轰、(m+k)的主機(jī)發(fā)送數(shù)據(jù)包
我們使用mininet中的iperf工具在網(wǎng)絡(luò)中生成UDP流量谣沸,iperf客戶端傳送數(shù)據(jù)流到iperf的服務(wù)端,由服務(wù)端接收并記錄相關(guān)信息笋颤。mininet自帶控制臺(tái)可供使用的命令雖然已經(jīng)比較豐富鳄抒,但卻并未給出較為明確的API接口來(lái)支持用戶自定義命令。在諸如數(shù)據(jù)中心這樣復(fù)雜椰弊、網(wǎng)絡(luò)節(jié)點(diǎn)較多的仿真環(huán)境中做一些批處理的工作就需要非常大的许溅,比如通過(guò)iperf在所有主機(jī)之間發(fā)生流量。所以我們需要將自定義命令添加到mininet中秉版,在mininet中完成新命令的拓展贤重。
一、mininet功能拓展
在mininet中進(jìn)行功能拓展主要分為3步:
1.修改mininet/net.py:?net模塊實(shí)現(xiàn)Mininet類清焕,是仿真平臺(tái)mininet的主體類并蝗,該類完成節(jié)點(diǎn)添加配置祭犯、網(wǎng)絡(luò)基本功能和一些選項(xiàng)功能的實(shí)現(xiàn)。我們需要將我們自定義的函數(shù)定義在該類中滚停。
class?Mininet(object):
def?function(self,?**kwargs):
#function?code
2.修改mininet/cli.py:?cli模塊定義了CLI類沃粗,為米你呢他提供命令行接口,用于解析用戶輸入的命令键畴,之前定義的自定義命令需要在CLI類中通過(guò)注冊(cè)函數(shù)注冊(cè)這條自定義命令最盅。
class?CLI(Cmd):
def?do_function(self,?line):
#do_function?code
完成命令注冊(cè)與綁定。
3.修改bin/mn:在完成命令注冊(cè)與綁定后起惕,需要在mininet執(zhí)行解釋器中注冊(cè)命令與對(duì)應(yīng)執(zhí)行函數(shù)的映射關(guān)系涡贱。
ALTSPELLING?=?{?'pingall':'pingAll',
'pingpair':'pingPair',
'iperfudp':'iperfUdp',
'function':'function}
net.py和cli.py均在mininet/mininet目錄,mn文件在在mininet/bin目錄中惹想。在代碼修改完成后需要重新編譯安裝一遍mininet问词,即運(yùn)行:
$~/mininet/util/install.sh?-n
二、?兩種流量模型在mininet中的實(shí)現(xiàn)
2.1隨機(jī)模型
任意一臺(tái)主機(jī)以等概率隨機(jī)地向另外一臺(tái)主機(jī)發(fā)起一條UDP數(shù)據(jù)流嘀粱。
修改mininet/net.py
首先激挪,先在兩個(gè)主機(jī)之間進(jìn)行iperf測(cè)試,并且在server端記錄锋叨,實(shí)現(xiàn)iperf_single函數(shù):
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垄分,依次為每一臺(tái)主機(jī)隨機(jī)選擇另一臺(tái)主機(jī)作為iperf的服務(wù)器端,通過(guò)調(diào)用iperf_single,自身以客戶端身份按照指定參數(shù)發(fā)送UDP流悲柱,服務(wù)器生成的報(bào)告以重定向的方式輸出到文件中锋喜,使用iperfmulti命令,主機(jī)隨機(jī)地向另一臺(tái)主機(jī)發(fā)起一條恒定帶寬的UDP數(shù)據(jù)流豌鸡。
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加入到對(duì)應(yīng)的列表中。
ALTSPELLING?=?{?'pingall':?'pingAll',
'pingpair':?'pingPair',
'iperfudp':?'iperfUdp',
'iperfUDP':?'iperfUdp',
'iperfpb':'iperfPb'?}
最后涯冠,進(jìn)入mininet/util目錄炉奴,重新編譯安裝mininet
$~/mininet/util/install.sh?-n
重啟mininet,輸入iperf蛇更,可用table補(bǔ)全iperfpb瞻赶,從而可使用iperfpb進(jìn)行流量隨機(jī)模型的測(cè)試。
2.2概率模型
為mininet添加自定義命令iperfpb派任,依次為每一臺(tái)主機(jī)(編號(hào)為m)分別以概率Pt砸逊、Pa、Pc向主機(jī)編號(hào)為(m+i)掌逛、(m+j)师逸、(m+k)的主機(jī)發(fā)送數(shù)據(jù)包,通過(guò)調(diào)用iperf_single,自身以客戶端身份按照指定參數(shù)發(fā)送UDP流豆混,服務(wù)器生成的報(bào)告以重定向的方式輸出到文件中篓像,使用iperfpb命令动知,主機(jī)按概率向其他被選擇的主機(jī)發(fā)起一條恒定帶寬的UDP數(shù)據(jù)流。
概率選擇函數(shù)
為完成以一定概率選擇主機(jī)员辩,我們需要實(shí)現(xiàn)一個(gè)概率選擇函數(shù)randompick盒粮,這個(gè)函數(shù)可用于以不同的概率從一個(gè)列表中隨機(jī)地選擇一些元素。下面為randompick的實(shí)現(xiàn)過(guò)程:
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加入到對(duì)應(yīng)的列表中丹皱。
ALTSPELLING?=?{?'pingall':?'pingAll',
'pingpair':?'pingPair',
'iperfudp':?'iperfUdp',
'iperfUDP':?'iperfUdp',
'iperfpb':'iperfPb'?}
最后,進(jìn)入mininet/util目錄养叛,重新編譯安裝mininet:
$~/mininet/util/install.sh?-n
重啟mininet种呐,輸入iperf宰翅,可用table補(bǔ)全iperfpb弃甥,從而可使用iperfpb進(jìn)行流量的概率模型的測(cè)試。
作者簡(jiǎn)介:
張歌汁讼,2014/09-至今淆攻,北京郵電大學(xué)網(wǎng)絡(luò)技術(shù)研究院?網(wǎng)絡(luò)與交換技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室攻讀碩士研究生
本文轉(zhuǎn)載自SDNLAB