張 ,
(上海大學(xué) 計(jì)算機(jī)工程與科學(xué)學(xué)院,上海 200436)
分布式共享內(nèi)存(Distributed Shared Memory,DSM)是分布式系統(tǒng)節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)共享與交換的一種快速、有效的機(jī)制,它能將不同節(jié)點(diǎn)的物理內(nèi)存映射成一個(gè)邏輯上統(tǒng)一的虛擬地址空間,任意進(jìn)程都可以訪問(wèn)該空間內(nèi)的任意地址,進(jìn)程間的消息傳遞對(duì)程序員而言是透明的。因此,DSM系統(tǒng)的編程較簡(jiǎn)單,且其具有較好的擴(kuò)展性。
由于分布式系統(tǒng)節(jié)點(diǎn)之間的網(wǎng)絡(luò)通信延遲較大,具體實(shí)現(xiàn)時(shí)需要考慮在保證數(shù)據(jù)一致性的同時(shí)降低總訪問(wèn)延遲。文獻(xiàn)[1-2]較早對(duì)DSM的具體實(shí)現(xiàn)方式進(jìn)行細(xì)致分析,并提出一種以共享頁(yè)面方式實(shí)現(xiàn)的DSM系統(tǒng)Ivy。但I(xiàn)vy存在數(shù)據(jù)顛簸和假共享的問(wèn)題,性能較差。隨著科技的進(jìn)步,研究人員對(duì)DSM的實(shí)現(xiàn)形式進(jìn)行改進(jìn),提出基于變量的共享方式,其代表系統(tǒng)是Midway[3]。而目前,DSM的普遍實(shí)現(xiàn)方式是采用基于對(duì)象的共享方式,如X10、Grace等[4-7]。
傳統(tǒng)DSM系統(tǒng)采用基于以太網(wǎng)的點(diǎn)對(duì)點(diǎn)、廣播或多播的方式進(jìn)行節(jié)點(diǎn)間數(shù)據(jù)傳輸。其中,多播是一種效果較好的傳輸形式[8]。多播是一對(duì)多的通信方式,其可以只向特定多播組內(nèi)的節(jié)點(diǎn)發(fā)送消息,能夠有效節(jié)省通信開(kāi)銷,提高網(wǎng)絡(luò)帶寬利用率。傳統(tǒng)多播是基于以太網(wǎng)的,但以太網(wǎng)只能提供不保證帶寬與延遲的盡力而為的服務(wù)。因此,基于以太網(wǎng)的多播在帶寬與延遲方面具有不可控性,需要使用額外策略為多播提供性能保障。目前常用方法是由路由器根據(jù)相應(yīng)路由算法構(gòu)造一棵覆蓋源節(jié)點(diǎn)和目的節(jié)點(diǎn)的多播樹(shù)。在傳統(tǒng)以太網(wǎng)的多播樹(shù)計(jì)算中,路由器只維護(hù)局部網(wǎng)絡(luò)信息,由其計(jì)算出來(lái)的多播路徑容易發(fā)生部分鏈路通信過(guò)載而部分鏈路卻通信空閑的狀況,且路由器節(jié)點(diǎn)之間需要頻繁交換信息,導(dǎo)致算法復(fù)雜度高、網(wǎng)絡(luò)負(fù)載大。
軟件定義網(wǎng)絡(luò)(Software Defined Network,SDN)的提出,為解決多播的不可控性問(wèn)題提供了一種新途徑。SDN是一種數(shù)據(jù)控制分離、軟件可編程的新型網(wǎng)絡(luò)體系架構(gòu),其采用集中式的控制平面和分布式的轉(zhuǎn)發(fā)平面,2個(gè)平面相互分離,控制平面利用控制-轉(zhuǎn)發(fā)通信接口對(duì)轉(zhuǎn)發(fā)平面上的網(wǎng)絡(luò)設(shè)備進(jìn)行集中控制,并提供靈活的可編程功能。與傳統(tǒng)以太網(wǎng)相比,基于SDN網(wǎng)絡(luò)的多播由SDN控制器維護(hù)全網(wǎng)拓?fù)湫畔?并根據(jù)全網(wǎng)拓?fù)湫畔⒂?jì)算路由路徑,SDN交換機(jī)只負(fù)責(zé)轉(zhuǎn)發(fā)而無(wú)需參與網(wǎng)絡(luò)信息的維護(hù)或計(jì)算。
基于以上分析,本文建立一種基于多播的DSM框架,將其實(shí)施于SDN網(wǎng)絡(luò)中,并使用基于SDN的多播為系統(tǒng)提供可控的性能保障。最后通過(guò)實(shí)驗(yàn)驗(yàn)證該框架的可行性與高效性。
DSM系統(tǒng)由一組節(jié)點(diǎn)通過(guò)網(wǎng)絡(luò)互連而形成,其目的是提供一個(gè)邏輯上統(tǒng)一的編程空間。由于節(jié)點(diǎn)之間網(wǎng)絡(luò)通信延遲較大,DSM系統(tǒng)在具體實(shí)現(xiàn)時(shí)會(huì)遇到許多問(wèn)題,如維持?jǐn)?shù)據(jù)與副本之間的一致性、減少訪問(wèn)時(shí)的延遲等。
目前,DSM的實(shí)現(xiàn)方式主要有基于頁(yè)面的共享方式、基于變量的共享方式以及基于對(duì)象的共享方式等。其中,基于對(duì)象的共享方式因抽象、封裝、靈活和自治等特點(diǎn)而備受研究人員的青睞,且其更易于編程。一個(gè)對(duì)象是一組狀態(tài)及其上一組方法的封裝體,對(duì)象的屬性表示對(duì)象的狀態(tài),只有對(duì)象方法可以對(duì)對(duì)象屬性進(jìn)行操作修改并保證信息安全。方法與數(shù)據(jù)的封裝有助于程序的模塊化,且對(duì)象具有并行性。因此,基于對(duì)象的共享方式非常適合DSM,目前在中、小型系統(tǒng)中應(yīng)用較廣泛[9-11]。
結(jié)合基于對(duì)象的共享方式和多播通信機(jī)制,本文設(shè)計(jì)一種DSM系統(tǒng)并將其運(yùn)行于Linux平臺(tái)。
在DSM系統(tǒng)中,用戶節(jié)點(diǎn)之間共享的是不同類型的對(duì)象,共享數(shù)據(jù)封裝在對(duì)象中,用戶通過(guò)對(duì)象成員函數(shù)訪問(wèn)封裝在其中的共享數(shù)據(jù)。系統(tǒng)提供4種基本類型的共享對(duì)象:shareInt,shareChar,shareFloat,shareDouble。對(duì)象經(jīng)過(guò)運(yùn)算符重載后,用戶可在創(chuàng)建共享對(duì)象后直接使用對(duì)象進(jìn)行運(yùn)算。共享對(duì)象在本地節(jié)點(diǎn)創(chuàng)建,所有的共享對(duì)象構(gòu)成一個(gè)抽象的共享空間,該共享空間由所有節(jié)點(diǎn)共享。任意節(jié)點(diǎn)都可以訪問(wèn)任何共享對(duì)象而無(wú)需考慮他們的具體物理位置,對(duì)象的定位和管理由DSM系統(tǒng)完成。圖1所示為基于對(duì)象的共享方式示意圖。
圖1 基于對(duì)象的共享方式示意圖
在DSM系統(tǒng)中每個(gè)共享對(duì)象都需要一個(gè)唯一索引號(hào),這是共享對(duì)象在分布式系統(tǒng)中的唯一身份象征。索引號(hào)由2個(gè)部分組成:1)系統(tǒng)事先確定好的表示對(duì)象類型的一個(gè)對(duì)象類型號(hào);2)用戶提供的一個(gè)整數(shù)ID號(hào)。系統(tǒng)將這2個(gè)號(hào)碼組合生成一個(gè)唯一索引號(hào)。不同類型對(duì)象之間的ID號(hào)可以相同,同一類型對(duì)象內(nèi)的ID號(hào)不可重復(fù)。任意節(jié)點(diǎn)都可在聲明對(duì)象類型并給定ID號(hào)后將共享空間中相應(yīng)類型的對(duì)象鏈接到本地,并通過(guò)調(diào)用對(duì)象成員函數(shù)來(lái)進(jìn)行對(duì)象的訪問(wèn)。這種方式能完成不同類型對(duì)象的共享,并有效保護(hù)對(duì)象中的共享數(shù)據(jù)。
DSM讀寫(xiě)策略用于保證共享對(duì)象在節(jié)點(diǎn)間的靜態(tài)與動(dòng)態(tài)分布,并降低訪問(wèn)延遲。不同的DSM讀寫(xiě)算法適用于不同的應(yīng)用需求,DSM讀寫(xiě)策略主要有單讀單寫(xiě)策略、多讀單寫(xiě)策略和多讀多寫(xiě)策略[12]。多讀單寫(xiě)策略能在提高訪問(wèn)效率的同時(shí)維持較小的通信開(kāi)銷。本文將多讀單寫(xiě)策略與多播機(jī)制相結(jié)合并應(yīng)用于DSM系統(tǒng)中,具體過(guò)程為:系統(tǒng)中對(duì)象具有固定的擁有關(guān)系,即對(duì)象只能被它的創(chuàng)建節(jié)點(diǎn)固定擁有,該節(jié)點(diǎn)稱為對(duì)象擁有節(jié)點(diǎn),具有對(duì)象全部的讀寫(xiě)權(quán)利。其他遠(yuǎn)程節(jié)點(diǎn)若想讀取對(duì)象,首先要通過(guò)多播發(fā)送讀請(qǐng)求命令以查找對(duì)象擁有節(jié)點(diǎn),對(duì)象擁有節(jié)點(diǎn)響應(yīng)命令,將對(duì)象的只讀副本發(fā)送給請(qǐng)求節(jié)點(diǎn),請(qǐng)求節(jié)點(diǎn)讀取對(duì)象只讀副本并保存在本地進(jìn)程,下次可直接讀取只讀副本。其他遠(yuǎn)程節(jié)點(diǎn)若想寫(xiě)對(duì)象,首先要通過(guò)多播發(fā)送寫(xiě)請(qǐng)求命令并查找對(duì)象擁有節(jié)點(diǎn),由對(duì)象擁有節(jié)點(diǎn)完成寫(xiě)對(duì)象命令并通過(guò)多播更新其他節(jié)點(diǎn)中的對(duì)象的只讀副本。對(duì)象擁有節(jié)點(diǎn)可直接讀或?qū)懰鶕碛械膶?duì)象,寫(xiě)對(duì)象后同樣要通過(guò)多播來(lái)更新其他節(jié)點(diǎn)中的對(duì)象只讀副本。
系統(tǒng)中每個(gè)節(jié)點(diǎn)需要維護(hù)2個(gè)鏈表:本地鏈表和副本鏈表。系統(tǒng)運(yùn)行時(shí)本地節(jié)點(diǎn)通過(guò)維護(hù)的本地鏈表管理和查找由本地節(jié)點(diǎn)創(chuàng)建的共享對(duì)象,通過(guò)副本鏈表管理和查找在本地節(jié)點(diǎn)保留的遠(yuǎn)程節(jié)點(diǎn)對(duì)象的只讀副本。
DSM系統(tǒng)通過(guò)socket套接字編程來(lái)實(shí)現(xiàn)多播通信。根據(jù)需求,系統(tǒng)需要傳輸?shù)臄?shù)據(jù)主要有對(duì)象類型、對(duì)象ID號(hào)、操作請(qǐng)求、共享對(duì)象內(nèi)容,這些數(shù)據(jù)需要綁定在一起同時(shí)進(jìn)行傳輸并解析。因此,系統(tǒng)中數(shù)據(jù)的傳輸以一個(gè)結(jié)構(gòu)體為基本單位,如圖2所示。其中,操作請(qǐng)求可以是對(duì)共享對(duì)象的讀請(qǐng)求、寫(xiě)請(qǐng)求或?qū)懜抡?qǐng)求等,給定其不同整數(shù)值以表示不同的操作請(qǐng)求類型。
圖2 傳輸整型數(shù)據(jù)所用結(jié)構(gòu)體
DSM節(jié)點(diǎn)不僅需要處理單一請(qǐng)求,也需要處理多個(gè)并發(fā)請(qǐng)求。因此,有必要采用多線程編程,每次在端口接收到來(lái)自多播組的命令后都創(chuàng)建一個(gè)線程專門(mén)處理該命令。此外,為防止多線程對(duì)緩沖區(qū)數(shù)據(jù)的競(jìng)爭(zhēng)訪問(wèn),采用互斥鎖對(duì)緩沖區(qū)數(shù)據(jù)進(jìn)行保護(hù),線程每次訪問(wèn)緩沖區(qū)數(shù)據(jù)時(shí)都需要查詢鎖的狀態(tài),如果鎖是釋放的,則可以訪問(wèn)緩沖區(qū)數(shù)據(jù),否則,需要等待直至鎖釋放。
在Linux平臺(tái)中,依據(jù)上文所述,基于多播的DSM框架可以實(shí)現(xiàn)一個(gè)DSM系統(tǒng),該DSM系統(tǒng)需要運(yùn)行于支持多播的網(wǎng)絡(luò)中。SDN網(wǎng)絡(luò)由SDN控制器、SDN交換機(jī)和Linux終端組成。將DSM系統(tǒng)實(shí)施于SDN網(wǎng)絡(luò)中時(shí),直接在Linux終端運(yùn)行DSM系統(tǒng),但此時(shí)SDN網(wǎng)絡(luò)不具備任何轉(zhuǎn)發(fā)功能,更不支持多播,其接收到DSM多播請(qǐng)求后無(wú)法作出處理。而SDN網(wǎng)絡(luò)中SDN控制器負(fù)責(zé)全網(wǎng)轉(zhuǎn)發(fā)控制,SDN交換機(jī)只根據(jù)SDN控制器的命令轉(zhuǎn)發(fā)數(shù)據(jù)。因此,需要對(duì)SDN控制器進(jìn)行編程以使其能夠支持DSM的多播,進(jìn)而完成DSM中的數(shù)據(jù)傳輸。
目前,已經(jīng)有許多研究人員提出不同的基于SDN網(wǎng)絡(luò)的多播實(shí)現(xiàn)方法[13-15],且均已取得較好的效果[16-17]。本文選擇使用開(kāi)源控制器ryu作為SDN控制器,對(duì)ryu控制器進(jìn)行編程以實(shí)現(xiàn)多播。SDN多播需要支持DSM系統(tǒng),并能為DSM提供可控的延遲、帶寬等性能保障。因此,ryu控制器需要具有網(wǎng)絡(luò)狀態(tài)感知、DSM多播組以及用戶節(jié)點(diǎn)的管理、DSM多播組路由計(jì)算等功能。網(wǎng)絡(luò)狀態(tài)感知主要負(fù)責(zé)收集全網(wǎng)鏈路狀態(tài)信息,DSM多播組以及用戶節(jié)點(diǎn)的管理功能負(fù)責(zé)處理節(jié)點(diǎn)的多播請(qǐng)求并管理多播組,多播組路由計(jì)算功能主要負(fù)責(zé)根據(jù)全網(wǎng)狀態(tài)信息為多播成員計(jì)算最佳路徑,并下發(fā)流表。各功能具體實(shí)現(xiàn)方式如下文所述。
SDN控制器需要感知全網(wǎng)狀態(tài)信息,用于DSM用戶節(jié)點(diǎn)之間多播路由路徑的計(jì)算。為充分利用網(wǎng)絡(luò)帶寬來(lái)降低網(wǎng)絡(luò)延遲,系統(tǒng)中網(wǎng)絡(luò)狀態(tài)的感知分為全網(wǎng)拓?fù)涓兄c全網(wǎng)鏈路帶寬感知2個(gè)部分。
SDN控制器使用鏈路層發(fā)現(xiàn)協(xié)議(Link Layer Discovery Protocol,LLDP)進(jìn)行全網(wǎng)拓?fù)涓兄DN控制器針對(duì)每個(gè)SDN交換機(jī)發(fā)送包含LLDP協(xié)議的Packet-out報(bào)文,SDN交換機(jī)將接收到的報(bào)文轉(zhuǎn)發(fā)到所有活動(dòng)接口,與活動(dòng)接口連接的交換機(jī)接收到報(bào)文后識(shí)別LLDP協(xié)議,并通過(guò)Packet-in發(fā)送給SDN控制器,控制器解析數(shù)據(jù)包,并創(chuàng)建此SDN交換機(jī)與鄰接SDN交換機(jī)的連接記錄,最終完成全網(wǎng)拓?fù)溆涗?。SDN控制器定時(shí)發(fā)送LLDP協(xié)議以刷新網(wǎng)絡(luò)拓?fù)湫畔?LLDP報(bào)文只消耗極少帶寬,且SDN控制器和SDN交換機(jī)通過(guò)安全通道交換信息,因此,該過(guò)程對(duì)網(wǎng)絡(luò)產(chǎn)生的負(fù)載極小。
除拓?fù)湫畔⑼?還需要獲取全網(wǎng)鏈路帶寬信息,本文使用基于OpenFlow協(xié)議的方法獲取鏈路帶寬。ryu控制器具有封裝好的端口流量信息統(tǒng)計(jì)應(yīng)用程序編程接口(Application Programming Interface,API),調(diào)用該API后,ryu控制器通過(guò)安全通道周期性地下發(fā)port statistics消息以獲得SDN交換機(jī)端口的統(tǒng)計(jì)信息,通過(guò)統(tǒng)計(jì)端口流量信息可獲取SDN交換機(jī)端口的當(dāng)前流量帶寬,用端口最大帶寬減去當(dāng)前流量帶寬則得到可用剩余帶寬,將其保存在SDN控制器中。
網(wǎng)絡(luò)狀態(tài)感知模塊將獲取到的全網(wǎng)狀態(tài)信息封裝成一個(gè)API接口,SDN控制器進(jìn)行DSM用戶節(jié)點(diǎn)間多播路由路徑計(jì)算時(shí)會(huì)調(diào)用該API接口,以獲取全網(wǎng)狀態(tài)信息。
同一個(gè)DSM系統(tǒng)中的用戶節(jié)點(diǎn)共享一個(gè)多播組,用戶節(jié)點(diǎn)使用DSM時(shí)會(huì)首先申請(qǐng)加入特定多播組,以及時(shí)接收到來(lái)自該DSM多播組的消息。在本文DSM系統(tǒng)中,多播使用IGMP v2協(xié)議。
用戶節(jié)點(diǎn)加入DSM多播組包括2個(gè)過(guò)程:節(jié)點(diǎn)本地socket服務(wù)端的綁定,SDN控制器中節(jié)點(diǎn)mac地址的注冊(cè)。
節(jié)點(diǎn)本地socket服務(wù)端的綁定由DSM系統(tǒng)完成。節(jié)點(diǎn)的一個(gè)本地端口與DSM多播地址multi_addr通過(guò)socket套接字綁定在一起,節(jié)點(diǎn)通過(guò)綁定的本地端口監(jiān)聽(tīng)來(lái)自DSM多播組的消息。
節(jié)點(diǎn)在SDN控制器中進(jìn)行mac地址注冊(cè)的目的在于將節(jié)點(diǎn)mac地址添加到SDN控制器所維護(hù)的相應(yīng)DSM多播組中,節(jié)點(diǎn)mac地址用源地址src_addr來(lái)表示。注冊(cè)時(shí),節(jié)點(diǎn)通過(guò)綁定的socket向與節(jié)點(diǎn)相鄰的SDN交換機(jī)發(fā)送包含IGMP協(xié)議的Report報(bào)文。初始時(shí)SDN交換機(jī)無(wú)法匹配該報(bào)文,便將報(bào)文以Packet_in的形式轉(zhuǎn)發(fā)給SDN控制器。Packet_in是SDN網(wǎng)絡(luò)中一種特殊的報(bào)文,當(dāng)SDN交換機(jī)無(wú)法匹配某條消息時(shí),便會(huì)將該消息以Packet_in報(bào)文的形式轉(zhuǎn)發(fā)給SDN控制器,然后由SDN控制器處理該消息。SDN控制器通過(guò)解析Packet_in報(bào)文可以獲得用戶節(jié)點(diǎn)源地址src_addr,通過(guò)解析IGMP協(xié)議可以獲得請(qǐng)求加入的DSM多播組地址multi_addr,將源地址src_addr添加到相應(yīng)的DSM多播組中,從而完成用戶節(jié)點(diǎn)mac地址的注冊(cè)。注冊(cè)完成后,源地址src_addr就成為相應(yīng)DSM多播組的成員。SDN控制器通過(guò)維護(hù)Multicast_Group_Recods(multi_addr,src_addr1,src_addr2,…)來(lái)保存多個(gè)DSM多播組信息。
用戶節(jié)點(diǎn)退出DSM多播組時(shí),發(fā)送一個(gè)包含IGMP協(xié)議的Leave報(bào)文,SDN控制器解析該報(bào)文獲取源地址src_addr和多播組地址multi_addr,然后在維護(hù)的相應(yīng)多播組中刪除源地址src_addr并更新多播成員。
SDN控制器利用由網(wǎng)絡(luò)狀態(tài)感知模塊提供的全網(wǎng)狀態(tài)信息為多播用戶選擇最佳的多播路徑。
SDN控制器通過(guò)調(diào)用網(wǎng)絡(luò)狀態(tài)感知模塊的API來(lái)獲取SDN交換機(jī)的連接記錄,并生成全網(wǎng)有向拓?fù)鋱D。拓?fù)鋱D中的節(jié)點(diǎn)是SDN交換機(jī),節(jié)點(diǎn)之間的邊是SDN交換機(jī)之間的連接端口,權(quán)重是端口可用剩余帶寬。需要注意的是,此時(shí)調(diào)用API所建立的拓?fù)鋱D僅為SDN交換機(jī)之間的連接圖,不包含DSM終端節(jié)點(diǎn)。在DSM終端節(jié)點(diǎn)加入或退出多播組后,需要在拓?fù)鋱D中添加或刪除相應(yīng)的終端節(jié)點(diǎn)和邊。
最佳路徑的選擇原則是:首先基于最小跳數(shù)確定k條路徑;然后從中選擇具有最大可用剩余帶寬的路徑作為最佳路徑。使用Dijkstra算法為多播計(jì)算基于跳數(shù)的最短路徑。Dijkstra算法的主要特點(diǎn)是以起始點(diǎn)為中心向外層層擴(kuò)展,直至擴(kuò)展到終點(diǎn)。每次迭代時(shí)選擇的下一個(gè)頂點(diǎn)是除標(biāo)記點(diǎn)之外離源點(diǎn)最近的頂點(diǎn),可以保證源節(jié)點(diǎn)到目的節(jié)點(diǎn)的路徑最短,以此方法確定k條最短路徑;然后,在確定的k條最短路徑中,依據(jù)節(jié)點(diǎn)之間可用剩余帶寬求出鏈路平均可用剩余帶寬,選擇平均可用剩余帶寬最大的路徑為最佳路徑。
當(dāng)某一節(jié)點(diǎn)向DSM多播組內(nèi)其他成員發(fā)送消息時(shí),初始時(shí)SDN交換機(jī)無(wú)法處理該消息,便將該消息以Packet_in的形式轉(zhuǎn)發(fā)給SDN控制器,SDN控制器解析報(bào)文以獲取源地址src_addr和目的多播地址multi_addr,并通過(guò)多播路由計(jì)算功能計(jì)算源地址src_addr到目的多播地址multi_addr所有成員節(jié)點(diǎn)的最佳多播路徑。然后,SDN控制器下發(fā)流表到路徑上的SDN交換機(jī),SDN網(wǎng)絡(luò)中流表用于指示SDN交換機(jī)如何轉(zhuǎn)發(fā)數(shù)據(jù),SDN交換機(jī)根據(jù)流表內(nèi)容將來(lái)自入端口的數(shù)據(jù)轉(zhuǎn)發(fā)到不同出端口。流表下發(fā)完成后,來(lái)自源地址src_addr的消息直接經(jīng)過(guò)SDN交換機(jī)轉(zhuǎn)發(fā)到其他多播成員節(jié)點(diǎn),而無(wú)需再轉(zhuǎn)發(fā)給SDN控制器。
DSM中所有用戶節(jié)點(diǎn)首先在SDN控制器中進(jìn)行注冊(cè)。注冊(cè)完成后,用戶通過(guò)調(diào)用API接口并提供特定類型對(duì)象ID號(hào)將共享空間中共享對(duì)象鏈接到本地進(jìn)程,然后執(zhí)行寫(xiě)命令,該過(guò)程無(wú)需關(guān)心共享對(duì)象在網(wǎng)絡(luò)中的具體分布。
系統(tǒng)根據(jù)用戶提供的特定類型對(duì)象ID號(hào)查詢本地鏈表,判斷所要訪問(wèn)的對(duì)象是否為本地節(jié)點(diǎn)所擁有,如果本地節(jié)點(diǎn)不擁有,系統(tǒng)會(huì)向多播組多播一個(gè)包含對(duì)象類型、對(duì)象ID號(hào)和寫(xiě)操作請(qǐng)求的消息。如圖3所示,該消息會(huì)首先發(fā)送到與節(jié)點(diǎn)相連的SDN交換機(jī),若SDN交換機(jī)沒(méi)有匹配的流表項(xiàng),則將消息轉(zhuǎn)發(fā)給SDN控制器。SDN控制器接收到消息后解析報(bào)文,獲取節(jié)點(diǎn)源地址src_addr和多播組地址multi_addr,并查詢維護(hù)的多播組中DSM成員節(jié)點(diǎn)的mac地址,根據(jù)節(jié)點(diǎn)源地址src_addr和多播成員節(jié)點(diǎn)目的mac地址,通過(guò)路由算法為節(jié)點(diǎn)生成到其他DSM多播成員的最佳路徑,然后下發(fā)流表到路徑上的SDN交換機(jī),SDN交換機(jī)開(kāi)始轉(zhuǎn)發(fā)DSM多播組消息。下次該節(jié)點(diǎn)多播消息時(shí)直接按照SDN交換機(jī)中流表項(xiàng)配置內(nèi)容進(jìn)行轉(zhuǎn)發(fā)而無(wú)需請(qǐng)求SDN控制器。DSM多播組內(nèi)其他節(jié)點(diǎn)成員每次接收到多播命令后,都創(chuàng)建一個(gè)新線程,并查詢本地進(jìn)程是否擁有此對(duì)象,如果擁有,則執(zhí)行寫(xiě)操作命令,并將更新后的對(duì)象副本通過(guò)SDN多播發(fā)送出去,以更新其他DSM成員節(jié)點(diǎn)中的對(duì)象只讀副本。如果所寫(xiě)對(duì)象是本地節(jié)點(diǎn)所擁有,則直接寫(xiě)對(duì)象并通過(guò)SDN多播更新DSM中的對(duì)象只讀副本。
圖3 DSM寫(xiě)更新流程
為驗(yàn)證本文系統(tǒng)的實(shí)際性能,使用網(wǎng)絡(luò)仿真工具mininet(內(nèi)置協(xié)議為OpenFlow v1.3)搭建一個(gè)SDN網(wǎng)絡(luò),并將其連接到一個(gè)ryu控制器。網(wǎng)絡(luò)選擇經(jīng)典的“胖樹(shù)”拓?fù)?它是數(shù)據(jù)中心的常用拓?fù)?具有足夠的路徑多樣性,可以驗(yàn)證系統(tǒng)性能。如圖4所示,本次實(shí)驗(yàn)拓?fù)浒?2個(gè)終端節(jié)點(diǎn)和14個(gè)SDN交換機(jī)節(jié)點(diǎn)。
圖4 實(shí)驗(yàn)網(wǎng)絡(luò)拓?fù)?/p>
拓?fù)渲忻織l鏈路帶寬設(shè)為15 Mb/s。為了與基于傳統(tǒng)多播的DSM系統(tǒng)進(jìn)行比較,使用支持IGMP協(xié)議的路由器搭建相同拓?fù)涞囊蕴W(wǎng)絡(luò),傳統(tǒng)多播使用最短路徑樹(shù)(Shortest Path Tree,SPT)算法。測(cè)試分2個(gè)部分:1)測(cè)試DSM中SDN多播的延遲、丟包率性能;2)測(cè)試同時(shí)寫(xiě)更新多個(gè)對(duì)象時(shí)DSM的平均執(zhí)行耗時(shí)。
本次實(shí)驗(yàn)測(cè)試多播流量遞增時(shí)SDN多播的平均網(wǎng)絡(luò)延遲和丟包率,測(cè)試工具為iperf[18]。使用客戶端-服務(wù)端模式,選取一個(gè)終端作為iperf客戶端,不斷發(fā)送特定流量的UDP數(shù)據(jù)包,并選取4個(gè)終端作為iperf服務(wù)端來(lái)接收數(shù)據(jù)流量包。每次測(cè)試中帶寬流量從1 Mb/s~10 Mb/s逐級(jí)增加,共測(cè)試10次,每次測(cè)試時(shí)間為60 s。iperf工具會(huì)得出當(dāng)前的網(wǎng)絡(luò)延時(shí)、丟包率數(shù)據(jù),每次測(cè)試網(wǎng)絡(luò)共運(yùn)行4個(gè)多播組,在測(cè)試完成后記錄多播組每個(gè)終端所得延遲、丟包率,并取平均值作為最終結(jié)果。每個(gè)多播組的終端分配情況如表1所示。
表1 多播組終端分配情況
網(wǎng)絡(luò)延遲性能測(cè)試結(jié)果如圖5所示。由圖5可以看出,相比以太網(wǎng),SDN網(wǎng)絡(luò)中DSM多播具有更小的傳輸延遲,且在多播流量遞增時(shí),SDN網(wǎng)絡(luò)中DSM多播延遲具有更好的穩(wěn)定性。丟包率性能測(cè)試結(jié)果如圖6所示。由圖6可以看出,以太網(wǎng)多播在流量為2 MB時(shí)開(kāi)始丟包,而SDN多播直到4 MB時(shí)才開(kāi)始丟包,其丟包率一直低于前者,且流量越大,SDN多播的性能優(yōu)勢(shì)越明顯。因此,相對(duì)傳統(tǒng)SPT算法,DSM中的SDN多播具有更好的性能,在流量較大、網(wǎng)絡(luò)較擁擠時(shí),其能將延遲、丟包率等維持在較低水平,從而為DSM提供性能保障。
圖5 2種網(wǎng)絡(luò)平均延遲對(duì)比情況
圖6 2種網(wǎng)絡(luò)平均丟包率對(duì)比情況
DSM中共享對(duì)象和對(duì)象副本在節(jié)點(diǎn)中的不同分布會(huì)產(chǎn)生不同的通信次數(shù)。為測(cè)試DSM系統(tǒng)性能,需要盡可能地最大化寫(xiě)更新命令中的通信次數(shù),因此,本文選擇測(cè)量寫(xiě)更新遠(yuǎn)程節(jié)點(diǎn)對(duì)象并完成副本更新的平均耗時(shí),即從寫(xiě)命令發(fā)起到待更新節(jié)點(diǎn)接收到副本更新命令所需要的時(shí)間,以此評(píng)估DSM系統(tǒng)性能。
實(shí)驗(yàn)中每次運(yùn)行不同數(shù)量的DSM系統(tǒng),最多同時(shí)運(yùn)行9個(gè)DSM系統(tǒng),每個(gè)DSM系統(tǒng)同時(shí)更新5個(gè)對(duì)象。選取其中5個(gè)DSM系統(tǒng)展示寫(xiě)更新時(shí)節(jié)點(diǎn)分配情況,結(jié)果如表2所示。每個(gè)系統(tǒng)包含5個(gè)節(jié)點(diǎn),為了最大化通信次數(shù),寫(xiě)命令發(fā)起節(jié)點(diǎn)、寫(xiě)命令執(zhí)行節(jié)點(diǎn)和待更新節(jié)點(diǎn)均是不同節(jié)點(diǎn)。本文使用Linux命令行工具tcpdump監(jiān)聽(tīng)DSM系統(tǒng)每個(gè)節(jié)點(diǎn)的端口,并抓取端口發(fā)送與接收的數(shù)據(jù)包。DSM中每個(gè)節(jié)點(diǎn)都分配一個(gè)IP地址以方便解析數(shù)據(jù)包。
表2 DSM節(jié)點(diǎn)分配情況
寫(xiě)命令發(fā)起節(jié)點(diǎn)發(fā)起寫(xiě)命令時(shí),會(huì)發(fā)送一個(gè)多播消息,該多播消息表示寫(xiě)命令起始時(shí)間,寫(xiě)命令執(zhí)行完成后,待更新節(jié)點(diǎn)會(huì)接收到包含更新命令的多播消息,本文將該消息視為寫(xiě)命令完成時(shí)間。通過(guò)解析多播數(shù)據(jù)包的目的地址以識(shí)別不同消息并獲取時(shí)間戳。寫(xiě)命令起始、完成的時(shí)間戳差值就是執(zhí)行一次寫(xiě)更新命令的耗時(shí)。DSM系統(tǒng)執(zhí)行一次寫(xiě)更新操作的時(shí)間較短,實(shí)驗(yàn)中不容易捕捉該時(shí)間差。因此,讓每個(gè)DSM系統(tǒng)連續(xù)寫(xiě)更新50次,得到50次操作的總時(shí)間,然后除以50以得到每次寫(xiě)更新的操作時(shí)間。
寫(xiě)更新平均耗時(shí)測(cè)試結(jié)果如圖7所示。由圖7可以看出,初始時(shí)寫(xiě)更新的DSM數(shù)量較少,2種網(wǎng)絡(luò)耗時(shí)相差不大,曲線較吻合。當(dāng)同時(shí)運(yùn)行的DSM數(shù)量增多時(shí),以太網(wǎng)中的平均耗時(shí)產(chǎn)生較大幅度的增加。尤其是DSM數(shù)量大于5后,以太網(wǎng)寫(xiě)更新耗時(shí)曲線更陡峭,增幅更大,最終耗時(shí)達(dá)到60 ms,系統(tǒng)性能較差。而SDN網(wǎng)絡(luò)中DSM的平均耗時(shí)比以太網(wǎng)少,且在DSM數(shù)量增多過(guò)程中,其曲線增長(zhǎng)始終較平緩,耗時(shí)增加幅度較小,系統(tǒng)穩(wěn)定性較強(qiáng)。在DSM數(shù)量為9時(shí),SDN網(wǎng)絡(luò)平均耗時(shí)約30 ms。因此,SDN網(wǎng)絡(luò)相比傳統(tǒng)以太網(wǎng)具有更好的性能。
圖7 2種網(wǎng)絡(luò)寫(xiě)更新平均耗時(shí)對(duì)比情況
由上述實(shí)驗(yàn)結(jié)果可以看出,與傳統(tǒng)以太網(wǎng)相比,基于SDN實(shí)現(xiàn)的多播具有更好的傳輸性能,將SDN多播應(yīng)用于DSM系統(tǒng)中,能有效降低DSM命令執(zhí)行平均耗時(shí),提高系統(tǒng)穩(wěn)定性。產(chǎn)生該結(jié)果的原因主要在于:
1)當(dāng)網(wǎng)絡(luò)中存在多條可用路徑時(shí),SDN控制器能根據(jù)全網(wǎng)鏈路狀態(tài)信息為DSM選擇有較大剩余帶寬和較小跳數(shù)的最佳路徑,從而有效避免擁塞鏈路并充分利用全網(wǎng)資源。
2)SDN網(wǎng)絡(luò)控制與轉(zhuǎn)發(fā)分離。由SDN控制器維持全網(wǎng)信息并為DSM節(jié)點(diǎn)選擇最佳路徑,SDN交換機(jī)只負(fù)責(zé)轉(zhuǎn)發(fā),這能夠極大提高轉(zhuǎn)發(fā)效率。
因此,將基于SDN實(shí)現(xiàn)的多播應(yīng)用于DSM系統(tǒng),可以在網(wǎng)絡(luò)流量較大時(shí)有效降低系統(tǒng)平均延遲和命令平均執(zhí)行時(shí)間,從而為DSM提供良好的性能保障。
SDN網(wǎng)絡(luò)具有集中控制與分布式轉(zhuǎn)發(fā)相分離、全網(wǎng)狀態(tài)感知等優(yōu)勢(shì),將基于SDN網(wǎng)絡(luò)實(shí)現(xiàn)的多播應(yīng)用于DSM系統(tǒng),可以大幅提升傳輸效率?;诖?本文設(shè)計(jì)一個(gè)DSM系統(tǒng),并將其與基于SDN的多播進(jìn)行結(jié)合。實(shí)驗(yàn)結(jié)果表明,與傳統(tǒng)以太網(wǎng)相比,基于SDN多播的DSM可以有效降低平均網(wǎng)絡(luò)延遲,減少命令響應(yīng)時(shí)間,提高系統(tǒng)性能。下一步考慮使用基于SDN的多播來(lái)優(yōu)化大數(shù)據(jù)應(yīng)用。