編者按:眾所周知,數(shù)據(jù)中心是目前網(wǎng)絡(luò)研究的一個(gè)熱門(mén)領(lǐng)域。隨著云計(jì)算的興起與發(fā)展,會(huì)對(duì)數(shù)據(jù)中心網(wǎng)絡(luò)提出更多的需求,也為學(xué)術(shù)研究提供了更多的課題。
網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制網(wǎng)站建設(shè)服務(wù),專(zhuān)注于企業(yè)網(wǎng)站建設(shè),高端網(wǎng)頁(yè)制作,對(duì)成都效果圖設(shè)計(jì)等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。專(zhuān)業(yè)網(wǎng)站設(shè)計(jì),網(wǎng)站優(yōu)化推廣哪家好,專(zhuān)業(yè)seo優(yōu)化優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。
本篇博文將講述1)如何搭建fatree網(wǎng)絡(luò)拓?fù)浜?)如何在mininet中拓展iperfmulti功能。
眾所周知,數(shù)據(jù)中心是目前網(wǎng)絡(luò)研究的一個(gè)熱門(mén)領(lǐng)域。隨著云計(jì)算的興起與發(fā)展,會(huì)對(duì)數(shù)據(jù)中心網(wǎng)絡(luò)提出更多的需求,也為學(xué)術(shù)研究提供了更多的課題。TE(Traffic Engineering)是網(wǎng)絡(luò)研究中最基礎(chǔ)的研究之一,在TE中Load balance是比較主要的研究?jī)?nèi)容之一。 然而由于數(shù)據(jù)中心網(wǎng)絡(luò)的流量走勢(shì)與傳統(tǒng)網(wǎng)絡(luò)不同,導(dǎo)致數(shù)據(jù)中心網(wǎng)絡(luò)與傳統(tǒng)網(wǎng)絡(luò)的架構(gòu)有所不同。在傳統(tǒng)網(wǎng)絡(luò)中上下行流量在總流量中占據(jù)很大比重,而相比之下,數(shù)據(jù)中心的流量分類(lèi)中,橫向流量的比重要遠(yuǎn)遠(yuǎn)大于傳統(tǒng)網(wǎng)絡(luò)架構(gòu)的比重。為了更好解決數(shù)據(jù)中心網(wǎng)絡(luò)流量問(wèn)題,數(shù)據(jù)中心架構(gòu)的設(shè)計(jì)就變得非常重要,在眾多網(wǎng)絡(luò)架構(gòu)中,F(xiàn)at-tree架構(gòu)是比較出名和成功的。
SDN興起于校園網(wǎng),盛開(kāi)于數(shù)據(jù)中心,這是一種比較準(zhǔn)確的描述。目前SDN的研究領(lǐng)域內(nèi),數(shù)據(jù)中心占據(jù)了一席之地。所以很多的研究者都試圖通過(guò)在控制器開(kāi)發(fā)應(yīng)用以及使用mininet模擬網(wǎng)絡(luò)來(lái)進(jìn)行網(wǎng)絡(luò)實(shí)驗(yàn)。博主最近也做了一個(gè)關(guān)于Fat-tree的實(shí)驗(yàn),在實(shí)驗(yàn)過(guò)程中,碰到了許多問(wèn)題,深深覺(jué)得這一方面的知識(shí)在互聯(lián)網(wǎng)中還比較缺乏。特此記錄下來(lái),分享出去,首先是作為自己的筆記,備忘,其次也給其他同樣研究這方面的同學(xué)一些幫助。我掉過(guò)的坑,我不愿意別人繼續(xù)掉。
科學(xué)的發(fā)展是需要許多人奠定基礎(chǔ),才能逐步發(fā)展。而只有分享經(jīng)驗(yàn),傳遞知識(shí),才能讓后人能站在前人的基礎(chǔ)之上繼續(xù)前進(jìn)。重復(fù)勞動(dòng)力在一些基礎(chǔ)的無(wú)關(guān)緊要的環(huán)節(jié),是整個(gè)社會(huì)資源的浪費(fèi)。特此感謝樂(lè)于分享的各種網(wǎng)絡(luò)中的老師,特別是為人十分和藹,溫和,良師益友@地球-某某老師。
Fattree topo
這個(gè)python文件最初的原型是參考了roan's Blog的博文SDN Lab 2$ Use Mininet create Fat Tree Topology中給出的代碼。并在次基礎(chǔ)上做了一些修改。在此感謝臺(tái)灣的小伙伴的分享。
在此基礎(chǔ)上我進(jìn)行了修改,可點(diǎn)擊fattree源碼獲取代碼。
Fattree特征
Fattree中,K是一個(gè)很重要的參數(shù)。如K=8,則core節(jié)點(diǎn)個(gè)數(shù)為(K/2)^2,pod個(gè)數(shù)為K,每一個(gè)POD有K個(gè)交換機(jī),每一個(gè)交換機(jī)有K個(gè)inter link(內(nèi)部鏈路)。aggregation層有K^2/2=64/2=32個(gè)交換機(jī),同理 edge也是K^2/2=32個(gè)交換機(jī)。host可以是K/2個(gè)host,也可以任意指定。在我寫(xiě)的腳本中,K和host density都是可以設(shè)置的參數(shù)。
部分源碼:
class Fattree(Topo):
logger.debug("Class Fattree")
CoreSwitchList = []
AggSwitchList = []
EdgeSwitchList = []
HostList = []
def __init__(self, k, density): # K 為fattree pod個(gè)數(shù)。 density是tor下的主機(jī)個(gè)數(shù)。
logger.debug("Class Fattree init")
self.pod = k
self.iCoreLayerSwitch = (k/2)**2
self.iAggLayerSwitch = k*k/2
self.iEdgeLayerSwitch = k*k/2
self.density = density
self.iHost = self.iEdgeLayerSwitch * density
#Init Topo
Topo.__init__(self)
def createTopo(self):
self.createCoreLayerSwitch(self.iCoreLayerSwitch)
self.createAggLayerSwitch(self.iAggLayerSwitch)
self.createEdgeLayerSwitch(self.iEdgeLayerSwitch)
self.createHost(self.iHost)
"""
Create Switch and Host
"""
def _addSwitch(self, number, level, switch_list):
for x in xrange(1, number+1):
PREFIX = str(level) + "00"
if x >= int(10):
PREFIX = str(level) + "0"
switch_list.append(self.addSwitch('s' + PREFIX + str(x)))
def createCoreLayerSwitch(self, NUMBER):
logger.debug("Create Core Layer")
self._addSwitch(NUMBER, 1, self.CoreSwitchList)
def createAggLayerSwitch(self, NUMBER):
logger.debug("Create Agg Layer")
self._addSwitch(NUMBER, 2, self.AggSwitchList)
def createEdgeLayerSwitch(self, NUMBER):
logger.debug("Create Edge Layer")
self._addSwitch(NUMBER, 3, self.EdgeSwitchList)
def createHost(self, NUMBER):
logger.debug("Create Host")
for x in xrange(1, NUMBER+1):
PREFIX = "h00"
if x >= int(10):
PREFIX = "h0"
elif x >= int(100):
PREFIX = "h"
self.HostList.append(self.addHost(PREFIX + str(x)))
"""
Add Link createLink函數(shù)用于創(chuàng)建links,修改了原始版本寫(xiě)死的代碼。
"""
def createLink(self, bw_c2a=0.2, bw_a2e=0.1, bw_h3a=0.5):
logger.debug("Add link Core to Agg.")
end = self.pod/2
for x in xrange(0, self.iAggLayerSwitch, end):
for i in xrange(0, end):
for j in xrange(0, end):
self.addLink(
self.CoreSwitchList[i*end+j],
self.AggSwitchList[x+i],
bw=bw_c2a)
logger.debug("Add link Agg to Edge.")
for x in xrange(0, self.iAggLayerSwitch, end):
for i in xrange(0, end):
for j in xrange(0, end):
self.addLink(
self.AggSwitchList[x+i], self.EdgeSwitchList[x+j],
bw=bw_a2e)
logger.debug("Add link Edge to Host.")
for x in xrange(0, self.iEdgeLayerSwitch):
for i in xrange(0, self.density):
self.addLink(
self.EdgeSwitchList[x],
self.HostList[self.density * x + i],
bw=bw_h3a)
def set_ovs_protocol_13(self,):
self._set_ovs_protocol_13(self.CoreSwitchList)
self._set_ovs_protocol_13(self.AggSwitchList)
self._set_ovs_protocol_13(self.EdgeSwitchList)
def _set_ovs_protocol_13(self, sw_list):
for sw in sw_list:
cmd = "sudo ovs-vsctl set bridge %s protocols=OpenFlow13" % sw
os.system(cmd)
def createTopo():
logging.debug("LV1 Create Fattree")
topo = Fattree(8, 4)
topo.createTopo()
topo.createLink(bw_c2a=0.2, bw_a2e=0.1, bw_h3a=0.05)
logging.debug("LV1 Start Mininet")
CONTROLLER_IP = "127.0.0.1"
CONTROLLER_PORT = 6633
net = Mininet(topo=topo, link=TCLink, controller=None, autoSetMacs=True,
autoStaticArp=True)
net.addController(
'controller', controller=RemoteController,
ip=CONTROLLER_IP, port=CONTROLLER_PORT)
net.start()
Iperfmulti function
在mininet中拓展功能的文章可參考@趙偉辰的博客。
在mininet中增加新功能其實(shí)不難。主要分為3步:
■修改net.py增加函數(shù)實(shí)體;
■修改cli.py,增加對(duì)應(yīng)do_function函數(shù),用于命令解析;
■修改mn函數(shù),用于聲明命令。
net.py和cli.py均在mininet/mininet目錄,mn文件在在mininet/bin目錄中。
修改net.py
def iperf_single( self,hosts=None, udpBw='10M', period=5, 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' + ' > /home/muzi/log/' + filename + '&')
print "***start client***"
clientNaNd(
iperfArgs + '-t '+ str(period) + ' -c ' + server.IP() + ' ' + bwArgs
+' > /home/muzi/log/' + 'client' + filename +'&')
def iperfMulti(self, bw, period=5):
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
self.hosts[0]NaNd('ping -c10'+ self.hosts[-1].IP() + ' > /home/muzi/log/delay.out')
sleep(period)
以上代碼完成iperfmulti函數(shù)實(shí)現(xiàn):隨機(jī)選取SC對(duì),并進(jìn)行iperf 打流。
修改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 \n' +
'udpBw examples: 1M\n')
修改mn
在mininet/bin目錄下修改mn文件,將iperfmulti加入到對(duì)應(yīng)的列表中。
# optional tests to run
TESTS = [ 'cli', 'build', 'pingall', 'pingpair', 'iperf', 'all', 'iperfudp',
'none','iperfmulti' ]
ALTSPELLING = { 'pingall': 'pingAll',
'pingpair': 'pingPair',
'iperfudp': 'iperfUdp',
'iperfUDP': 'iperfUdp',
'iperfmulti': 'iperfmulti'}
重新安裝mininet
進(jìn)入mininet/util目錄,輸入以下命令重新編譯安裝mininet core:
./install.sh -n
重啟mininet,輸入iperf,可使用table補(bǔ)全iperfmulti,從而可使用iperfmulti進(jìn)行測(cè)試。
總結(jié)
在做實(shí)驗(yàn)的過(guò)程中,遇到了很多問(wèn)題,也學(xué)會(huì)了很多。學(xué)會(huì)了谷歌找資料,學(xué)會(huì)了給論文作者發(fā)郵件,也學(xué)會(huì)了如何協(xié)同工作。特別是協(xié)同工作這一點(diǎn),以前寫(xiě)代碼,做實(shí)驗(yàn)都是自己來(lái),沒(méi)有明確定義的接口,也更沒(méi)有分工合作,版本管理也是自己隨意定。在這個(gè)實(shí)驗(yàn)過(guò)程中,不僅學(xué)到了很多知識(shí),更重要的是學(xué)會(huì)了和小伙伴北郵-張歌的相處,團(tuán)隊(duì)協(xié)作是一個(gè)非常重要的能力,我將在未來(lái)的日子里繼續(xù)努力學(xué)習(xí)和提高這方面的能力。希望他的博客能慢慢寫(xiě)起來(lái),以后一起做更多好玩有用的實(shí)驗(yàn)。
轉(zhuǎn)載自:李呈博客
本文來(lái)源于SDNLAB,可點(diǎn)擊此閱讀原文。如果您對(duì)本文感興趣,可參與以下互動(dòng)方式與作者近距離交流。另外我們網(wǎng)站也有大型企業(yè)招聘平臺(tái),里面有很多優(yōu)質(zhì)的崗位,有意者請(qǐng)點(diǎn)擊招聘查看詳情。
如果您對(duì)本文感興趣,可參與以下互動(dòng)方式與作者近距離交流。
(1) 微博(http://weibo.com/sdnlab/)
(2) 微信(賬號(hào):SDNLAB)
(3) QQ群
SDN研究群(214146842)
OpenDaylight研究群(194240432)