数据中心两种常用流量模型运用mininet的实现
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
??編者按:在網(wǎng)絡(luò)性能評估中一個巨大的挑戰(zhàn)就是如何生成真實的網(wǎng)絡(luò)流量,還好可以通過程序來創(chuàng)造人工的網(wǎng)絡(luò)流量,通過建立測試環(huán)境來模擬真實的狀況。本文就以數(shù)據(jù)中心網(wǎng)絡(luò)為目標(biāo)場景,來在mininet仿真環(huán)境中盡可能地還原數(shù)據(jù)中心內(nèi)部的真實流量情況。目前有兩種常用的流量模型:
?■隨機模型:主機向在網(wǎng)絡(luò)中的另一任意主機以等概率發(fā)送數(shù)據(jù)包
?■概率模型:在網(wǎng)絡(luò)中,編號為m的主機分別以概率Pt?、Pa?、Pc?、向主機編號為(m+i)、(m+j)、(m+k)的主機發(fā)送數(shù)據(jù)包
我們使用mininet中的iperf工具在網(wǎng)絡(luò)中生成UDP流量,iperf客戶端傳送數(shù)據(jù)流到iperf的服務(wù)端,由服務(wù)端接收并記錄相關(guān)信息。mininet自帶控制臺可供使用的命令雖然已經(jīng)比較豐富,但卻并未給出較為明確的API接口來支持用戶自定義命令。在諸如數(shù)據(jù)中心這樣復(fù)雜、網(wǎng)絡(luò)節(jié)點較多的仿真環(huán)境中做一些批處理的工作就需要非常大的,比如通過iperf在所有主機之間發(fā)生流量。所以我們需要將自定義命令添加到mininet中,在mininet中完成新命令的拓展。
一、?mininet功能拓展
在mininet中進行功能拓展主要分為3步:
1.?修改mininet/net.py:?net模塊實現(xiàn)Mininet類,是仿真平臺mininet的主體類,該類完成節(jié)點添加配置、網(wǎng)絡(luò)基本功能和一些選項功能的實現(xiàn)。我們需要將我們自定義的函數(shù)定義在該類中。
class?Mininet(object):
????def?function(self,?**kwargs):
????????#function?code
2.?修改mininet/cli.py:?cli模塊定義了CLI類,為米你呢他提供命令行接口,用于解析用戶輸入的命令,之前定義的自定義命令需要在CLI類中通過注冊函數(shù)注冊這條自定義命令。
class?CLI(Cmd):
????def?do_function(self,?line):
????????#do_function?code
完成命令注冊與綁定。
?3.?修改bin/mn:?在完成命令注冊與綁定后,需要在mininet執(zhí)行解釋器中注冊命令與對應(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,即運行:
$~/mininet/util/install.sh?-n
二、?兩種流量模型在mininet中的實現(xiàn)
2.1?隨機模型
任意一臺主機以等概率隨機地向另外一臺主機發(fā)起一條UDP數(shù)據(jù)流。
修改mininet/net.py
首先,先在兩個主機之間進行iperf測試,并且在server端記錄,實現(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***"
????????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的服務(wù)器端,通過調(diào)用iperf_single,自身以客戶端身份按照指定參數(shù)發(fā)送UDP流,服務(wù)器生成的報告以重定向的方式輸出到文件中,使用iperfmulti命令,主機隨機地向另一臺主機發(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加入到對應(yīng)的列表中。
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)的主機發(fā)送數(shù)據(jù)包,通過調(diào)用iperf_single,自身以客戶端身份按照指定參數(shù)發(fā)送UDP流,服務(wù)器生成的報告以重定向的方式輸出到文件中,使用iperfpb命令,主機按概率向其他被選擇的主機發(fā)起一條恒定帶寬的UDP數(shù)據(jù)流。
概率選擇函數(shù)
為完成以一定概率選擇主機,我們需要實現(xiàn)一個概率選擇函數(shù)randompick,這個函數(shù)可用于以不同的概率從一個列表中隨機地選擇一些元素。下面為randompick的實現(xiàn)過程:
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加入到對應(yīng)的列表中。
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-至今,北京郵電大學(xué)網(wǎng)絡(luò)技術(shù)研究院?網(wǎng)絡(luò)與交換技術(shù)國家重點實驗室攻讀碩士研究生
本文轉(zhuǎn)載自SDNLAB
轉(zhuǎn)載于:https://my.oschina.net/sdnlab/blog/408054
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的数据中心两种常用流量模型运用mininet的实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQuery EasyUI datagr
- 下一篇: bootstrap -- css --