掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
編者按:在網(wǎng)絡(luò)性能評(píng)估中一個(gè)巨大的挑戰(zhàn)就是如何生成真實(shí)的網(wǎng)絡(luò)流量,還好可以通過程序來創(chuàng)造人工的網(wǎng)絡(luò)流量,通過建立測(cè)試環(huán)境來模擬真實(shí)的狀況。本文就以數(shù)據(jù)中心網(wǎng)絡(luò)為目標(biāo)場(chǎng)景,來在mininet仿真環(huán)境中盡可能地還原數(shù)據(jù)中心內(nèi)部的真實(shí)流量情況。目前有兩種常用的流量模型:

專注于為中小企業(yè)提供成都網(wǎng)站建設(shè)、做網(wǎng)站服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)埇橋區(qū)免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上千家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
我們使用mininet中的iperf工具在網(wǎng)絡(luò)中生成UDP流量,iperf客戶端傳送數(shù)據(jù)流到iperf的服務(wù)端,由服務(wù)端接收并記錄相關(guān)信 息。mininet自帶控制臺(tái)可供使用的命令雖然已經(jīng)比較豐富,但卻并未給出較為明確的API接口來支持用戶自定義命令。在諸如數(shù)據(jù)中心這樣復(fù)雜、網(wǎng)絡(luò)節(jié) 點(diǎn)較多的仿真環(huán)境中做一些批處理的工作就需要非常大的,比如通過iperf在所有主機(jī)之間發(fā)生流量。所以我們需要將自定義命令添加到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類中通過注冊(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)
任意一臺(tái)主機(jī)以等概率隨機(jī)地向另外一臺(tái)主機(jī)發(fā)起一條UDP數(shù)據(jù)流。
首先,先在兩個(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ù)器端,通過調(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è)試。
#p#
為mininet添加自定義命令iperfpb,依次為每一臺(tái)主機(jī)(編號(hào)為m)分別以概率Pt 、Pa 、Pc 向主機(jī)編號(hào)為(m+i)、(m+j)、(m+k)的主機(jī)發(fā)送數(shù)據(jù)包,通過調(diào)用iperf_single,自身以客戶端身份按照指定參數(shù)發(fā)送UDP流,服務(wù) 器生成的報(bào)告以重定向的方式輸出到文件中,使用iperfpb命令,主機(jī)按概率向其他被選擇的主機(jī)發(fā)起一條恒定帶寬的UDP數(shù)據(jù)流。
為完成以一定概率選擇主機(jī),我們需要實(shí)現(xiàn)一個(gè)概率選擇函數(shù)randompick,這個(gè)函數(shù)可用于以不同的概率從一個(gè)列表中隨機(jī)地選擇一些元素。下面為randompick的實(shí)現(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
base_port = 5001server_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 - pap_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 = Falseself.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',
***,進(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)室攻讀碩士研究生。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流