日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Mininet實戰(zhàn)之Fattree拓撲創(chuàng)建和iperfmul

編者按:眾所周知,數(shù)據(jù)中心是目前網(wǎng)絡研究的一個熱門領域。隨著云計算的興起與發(fā)展,會對數(shù)據(jù)中心網(wǎng)絡提出更多的需求,也為學術研究提供了更多的課題。

網(wǎng)站建設公司,為您提供網(wǎng)站建設,網(wǎng)站制作,網(wǎng)頁設計及定制網(wǎng)站建設服務,專注于企業(yè)網(wǎng)站建設,高端網(wǎng)頁制作,對成都效果圖設計等多個行業(yè)擁有豐富的網(wǎng)站建設經(jīng)驗的網(wǎng)站建設公司。專業(yè)網(wǎng)站設計,網(wǎng)站優(yōu)化推廣哪家好,專業(yè)seo優(yōu)化優(yōu)化,H5建站,響應式網(wǎng)站。

 

本篇博文將講述1)如何搭建fatree網(wǎng)絡拓撲和2)如何在mininet中拓展iperfmulti功能。

Mininet實戰(zhàn)之Fattree拓撲創(chuàng)建和iperfmul

眾所周知,數(shù)據(jù)中心是目前網(wǎng)絡研究的一個熱門領域。隨著云計算的興起與發(fā)展,會對數(shù)據(jù)中心網(wǎng)絡提出更多的需求,也為學術研究提供了更多的課題。TE(Traffic Engineering)是網(wǎng)絡研究中最基礎的研究之一,在TE中Load balance是比較主要的研究內(nèi)容之一。 然而由于數(shù)據(jù)中心網(wǎng)絡的流量走勢與傳統(tǒng)網(wǎng)絡不同,導致數(shù)據(jù)中心網(wǎng)絡與傳統(tǒng)網(wǎng)絡的架構有所不同。在傳統(tǒng)網(wǎng)絡中上下行流量在總流量中占據(jù)很大比重,而相比之下,數(shù)據(jù)中心的流量分類中,橫向流量的比重要遠遠大于傳統(tǒng)網(wǎng)絡架構的比重。為了更好解決數(shù)據(jù)中心網(wǎng)絡流量問題,數(shù)據(jù)中心架構的設計就變得非常重要,在眾多網(wǎng)絡架構中,F(xiàn)at-tree架構是比較出名和成功的。

 

SDN興起于校園網(wǎng),盛開于數(shù)據(jù)中心,這是一種比較準確的描述。目前SDN的研究領域內(nèi),數(shù)據(jù)中心占據(jù)了一席之地。所以很多的研究者都試圖通過在控制器開發(fā)應用以及使用mininet模擬網(wǎng)絡來進行網(wǎng)絡實驗。博主最近也做了一個關于Fat-tree的實驗,在實驗過程中,碰到了許多問題,深深覺得這一方面的知識在互聯(lián)網(wǎng)中還比較缺乏。特此記錄下來,分享出去,首先是作為自己的筆記,備忘,其次也給其他同樣研究這方面的同學一些幫助。我掉過的坑,我不愿意別人繼續(xù)掉。

 

科學的發(fā)展是需要許多人奠定基礎,才能逐步發(fā)展。而只有分享經(jīng)驗,傳遞知識,才能讓后人能站在前人的基礎之上繼續(xù)前進。重復勞動力在一些基礎的無關緊要的環(huán)節(jié),是整個社會資源的浪費。特此感謝樂于分享的各種網(wǎng)絡中的老師,特別是為人十分和藹,溫和,良師益友@地球-某某老師。

 

Fattree topo

 

這個python文件最初的原型是參考了roan's Blog的博文SDN Lab 2$ Use Mininet create Fat Tree Topology中給出的代碼。并在次基礎上做了一些修改。在此感謝臺灣的小伙伴的分享。

 

在此基礎上我進行了修改,可點擊fattree源碼獲取代碼。

 

Fattree特征

 Fattree中,K是一個很重要的參數(shù)。如K=8,則core節(jié)點個數(shù)為(K/2)^2,pod個數(shù)為K,每一個POD有K個交換機,每一個交換機有K個inter link(內(nèi)部鏈路)。aggregation層有K^2/2=64/2=32個交換機,同理 edge也是K^2/2=32個交換機。host可以是K/2個host,也可以任意指定。在我寫的腳本中,K和host density都是可以設置的參數(shù)。

 

部分源碼:

class Fattree(Topo):

    logger.debug("Class Fattree")

    CoreSwitchList = []

    AggSwitchList = []

    EdgeSwitchList = []

    HostList = []

 

    def __init__(self, k, density):  # K 為fattree pod個數(shù)。 density是tor下的主機個數(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,修改了原始版本寫死的代碼。

    """

 

    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中增加新功能其實不難。主要分為3步:

 ■修改net.py增加函數(shù)實體;

 ■修改cli.py,增加對應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ù)實現(xiàn):隨機選取SC對,并進行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加入到對應的列表中。

# 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

 

進入mininet/util目錄,輸入以下命令重新編譯安裝mininet core:

./install.sh -n

重啟mininet,輸入iperf,可使用table補全iperfmulti,從而可使用iperfmulti進行測試。

 

總結

 

在做實驗的過程中,遇到了很多問題,也學會了很多。學會了谷歌找資料,學會了給論文作者發(fā)郵件,也學會了如何協(xié)同工作。特別是協(xié)同工作這一點,以前寫代碼,做實驗都是自己來,沒有明確定義的接口,也更沒有分工合作,版本管理也是自己隨意定。在這個實驗過程中,不僅學到了很多知識,更重要的是學會了和小伙伴北郵-張歌的相處,團隊協(xié)作是一個非常重要的能力,我將在未來的日子里繼續(xù)努力學習和提高這方面的能力。希望他的博客能慢慢寫起來,以后一起做更多好玩有用的實驗。

  

 轉(zhuǎn)載自:李呈博客

  本文來源于SDNLAB,可點擊此閱讀原文。如果您對本文感興趣,可參與以下互動方式與作者近距離交流。另外我們網(wǎng)站也有大型企業(yè)招聘平臺,里面有很多優(yōu)質(zhì)的崗位,有意者請點擊招聘查看詳情。

如果您對本文感興趣,可參與以下互動方式與作者近距離交流。

(1) 微博(http://weibo.com/sdnlab/)

Mininet實戰(zhàn)之Fattree拓撲創(chuàng)建和iperfmul

(2) 微信(賬號:SDNLAB)

Mininet實戰(zhàn)之Fattree拓撲創(chuàng)建和iperfmul

(3) QQ群

SDN研究群(214146842)

OpenDaylight研究群(194240432)



 

 


當前名稱:Mininet實戰(zhàn)之Fattree拓撲創(chuàng)建和iperfmul
網(wǎng)站路徑:http://www.dlmjj.cn/article/gcjshd.html