徐啟后
(武漢郵電科學(xué)研究院湖北武漢430074)
進(jìn)入新世紀(jì)以來,全球數(shù)據(jù)量的爆炸式增長,人們進(jìn)入了一個信息爆炸的時代。每秒數(shù)以億萬計的數(shù)據(jù)在互聯(lián)網(wǎng)上不斷產(chǎn)生,如何獲取、存儲、管理、處理如此龐大的數(shù)據(jù)量成為了如今急需解決的問題[1-2]。為了解決這一問題,云計算被提出并寄予厚望。OpenStack作為當(dāng)前解決云計算方案中最佳的開源項目,是全球各大公有云、私有云以及混合云提供商的首選云平臺[3]。但是由于x86服務(wù)器架構(gòu)是一種通用服務(wù)器平臺,并非是專門針對OpenStack網(wǎng)絡(luò)服務(wù),x86服務(wù)器提供的數(shù)據(jù)平面性能在面臨大量并發(fā)業(yè)務(wù)時捉襟見肘。同時現(xiàn)階段所使用的技術(shù)限制了OpenStack的網(wǎng)絡(luò)穩(wěn)定性、靈活性和虛擬網(wǎng)絡(luò)的吞吐量,制約了OpenStack云環(huán)境數(shù)據(jù)平面的傳輸能力,從而影響了OpenStack的進(jìn)一步發(fā)展。因此需要引入更加先進(jìn)和靈活的方法來解決上面提到的這些問題。
OpenStack是由美國國家航空航天局(NASA)發(fā)起的開源軟件項目,它是以Apache授權(quán)的自由軟件和開源代碼的軟件開發(fā)項目[4]。OpenStack的社區(qū)現(xiàn)已發(fā)展成為由1 000多家公司和數(shù)以萬計的開發(fā)者協(xié)作提供代碼開發(fā),版本升級的平臺。作為公有云和私有云的開源云計算平臺,OpenStack的主要任務(wù)是簡化云計算平臺的搭建過程和改善云數(shù)據(jù)中心的管理方式。
典型的OpenStack平臺組網(wǎng)圖如圖1所示。將OpenStack的組件——包含了計算服務(wù)Nova、網(wǎng)絡(luò)服務(wù)Neutron、鏡像服務(wù)Glance、身份認(rèn)證服務(wù)Keystone、對象存儲服務(wù)Swift、用戶Web頁面服務(wù)Horizon等等組件分別部署在對應(yīng)的節(jié)點上就組成一個簡單的云平臺。
圖1 典型的OpenStack平臺組網(wǎng)圖
Neutron作為OpenStack中的核心組件之一,是OpenStack社區(qū)的核心項目之一,提供云計算環(huán)境下的虛擬網(wǎng)絡(luò)功能[4-5]。在OpenStack云環(huán)境中的虛擬網(wǎng)絡(luò)也如同物理網(wǎng)絡(luò)一樣,將網(wǎng)絡(luò)、子網(wǎng)、端口、路由器等概念引入,組建一個虛擬網(wǎng)絡(luò)就是將這幾個基本概念有機(jī)的結(jié)合到一起。
圖2所示為在OpenStack云環(huán)境內(nèi)部組成虛擬網(wǎng)絡(luò)的虛擬網(wǎng)絡(luò)設(shè)備的組網(wǎng)結(jié)構(gòu)。從圖中可以看到虛擬網(wǎng)絡(luò)設(shè)備分為以下幾種:
1)內(nèi)部端口:這是Linux中提供的虛擬接口設(shè)備,其中vnet設(shè)備是虛擬機(jī)的虛擬網(wǎng)卡設(shè)備,tap設(shè)備作為連接dhcp和Openvswitch虛擬交換機(jī)的接口設(shè)備,而qr/qg設(shè)備則連接Openvswitch虛擬交換機(jī)和qrouter命名空間[6-7]。
2)Openvswitch虛擬交換機(jī):由Openvswitch軟件創(chuàng)建的虛擬交換機(jī),其中虛擬交換機(jī)br-int用于實現(xiàn)租戶內(nèi)的虛擬網(wǎng)絡(luò),而網(wǎng)絡(luò)節(jié)點的br-ex用于實現(xiàn)外部網(wǎng)絡(luò),br-eth用于實現(xiàn)租戶訪問外網(wǎng)和租戶之間相互訪問的數(shù)據(jù)通道,同時也是節(jié)點出口。
3)veth pair:qvbqvo和 int-br-ethphy-br-eth設(shè)備對都是連接兩個虛擬網(wǎng)橋的veth pair,相當(dāng)于物理網(wǎng)絡(luò)中的一根網(wǎng)線[8]。
4)Linux bridge:這是一種功能相對簡單的虛擬網(wǎng)橋設(shè)備,通過訪問內(nèi)核協(xié)議棧實現(xiàn)數(shù)據(jù)交換[9]。如圖2所示,qbr設(shè)備就是Linux bridge設(shè)備。
圖2 OpenStack云平臺虛擬網(wǎng)絡(luò)設(shè)備結(jié)構(gòu)圖
針對虛擬機(jī)訪問不同的訪問對象,可以把虛擬機(jī)的數(shù)據(jù)包流向分為以下幾種:
1)虛擬機(jī)訪問同一計算節(jié)點同一租戶的虛擬機(jī)。虛擬機(jī)VM1發(fā)出的數(shù)據(jù)包是通過vnet1接口到qbrXXX這個linux bridge上的,而qbrXXX與br-int之間用qvbqvo這種veth pair來連接。在同一租戶中的數(shù)據(jù)包在br-int上會打上同一的vlan tag,而不同的租戶的數(shù)據(jù)包打上不同的vlan tag,這樣就實現(xiàn)了不同租戶的隔離。
2)在虛機(jī)訪問不同計算節(jié)點同一租戶的虛擬機(jī)時,虛擬機(jī)發(fā)出的數(shù)據(jù)包由于需要訪問的虛擬機(jī)不在同一個計算節(jié)點,數(shù)據(jù)包需要經(jīng)過網(wǎng)絡(luò)節(jié)點之后來訪問另一個計算節(jié)點。因此,數(shù)據(jù)包從虛擬機(jī)發(fā)出,經(jīng)過 br-int打上 vlan tag,在 br-eth上換上mod_vlan_id,然后從計算節(jié)點發(fā)送到網(wǎng)絡(luò)節(jié)點的breth上,然后從網(wǎng)絡(luò)節(jié)點發(fā)送到另外一個計算節(jié)點上,最終發(fā)到需要訪問的虛擬機(jī)上。
可以發(fā)現(xiàn)無論是訪問同一節(jié)點的還是不同節(jié)點的虛擬機(jī),都需要虛擬機(jī)發(fā)出的數(shù)據(jù)包都需要經(jīng)過依次經(jīng)過Linux Bridge、Openvswitch、物理網(wǎng)卡等設(shè)備,提升這些設(shè)備的性能成為了優(yōu)化OpenStack網(wǎng)絡(luò)的關(guān)鍵。
從云平臺的整體來看,通過分析OpenStack云環(huán)境的網(wǎng)絡(luò)組成,可以將其分為兩個部分,一是由物理網(wǎng)絡(luò)設(shè)備組成的網(wǎng)絡(luò),另一種是由軟件模擬的網(wǎng)絡(luò)設(shè)備組成的虛擬網(wǎng)絡(luò)。物理網(wǎng)絡(luò)的性能由物理設(shè)備——交換機(jī)、路由器等網(wǎng)絡(luò)設(shè)備的性能決定,是虛擬網(wǎng)絡(luò)的承載。物理網(wǎng)絡(luò)的性能可以通過選用更好性能的物理網(wǎng)絡(luò)設(shè)備,增加物理網(wǎng)絡(luò)設(shè)備的數(shù)量來提高。而OpenStack云平臺中網(wǎng)絡(luò)性能主要受制于虛擬網(wǎng)絡(luò)的性能瓶頸[10]。虛擬網(wǎng)絡(luò)設(shè)備的性能由虛擬軟件的性能和x86平臺的性能決定。OpenStack虛擬網(wǎng)絡(luò)主要由Openvswitch和Linux Bridge這兩個軟件生成的虛擬網(wǎng)絡(luò)設(shè)備組成。由Linux Bridge生成的網(wǎng)絡(luò)設(shè)備是用于安全組功能的qbr設(shè)備,每一個qbr設(shè)備連接一臺虛擬機(jī),通過測試原生的Linux Bridge設(shè)備性能滿足一臺虛擬機(jī)的性能要求。而由Openvswitch生成的設(shè)備有用于實現(xiàn)租戶網(wǎng)絡(luò)的brint,有節(jié)點出口br-eth,還有外網(wǎng)出口br-ex。但是經(jīng)過測試發(fā)現(xiàn)原生Openvswtich的包轉(zhuǎn)發(fā)率僅有0.75Mbps,由于在云平臺中有眾多虛擬機(jī)通過Openvswitch相連,Openvswitch的數(shù)據(jù)包轉(zhuǎn)發(fā)性能會直接影響整個云環(huán)境的網(wǎng)絡(luò)性能[11]。
從數(shù)據(jù)包在云平臺中的傳輸過程來看,云平臺的網(wǎng)絡(luò)性能由以下兩方面影響:一是數(shù)據(jù)包有從物理交換機(jī)到達(dá)物理網(wǎng)卡的過程;二是從物理網(wǎng)卡到虛擬機(jī)的過程。交換機(jī)到網(wǎng)卡的部分已經(jīng)由物理網(wǎng)絡(luò)硬件解決,在此本文討論數(shù)據(jù)包從網(wǎng)卡到虛擬機(jī)的過程。一個數(shù)據(jù)包從網(wǎng)卡到達(dá)虛擬機(jī)的過程可以分為兩部分。第一,從網(wǎng)卡到虛擬交換機(jī);第二,從虛擬交換機(jī)到虛擬機(jī)。
1)數(shù)據(jù)包從網(wǎng)卡到虛擬交換機(jī)。其實可以認(rèn)為是從網(wǎng)卡到一個應(yīng)用程序的過程。數(shù)據(jù)包到達(dá)網(wǎng)卡,網(wǎng)卡接收到電信號并將其轉(zhuǎn)化為數(shù)字信號存儲到網(wǎng)卡寄存器進(jìn)入網(wǎng)卡收包隊列后,網(wǎng)卡會產(chǎn)生硬件中斷,發(fā)送中斷請求給CPU觸發(fā)CPU的中斷,進(jìn)入中斷服務(wù)程序。然后需要由Openvswitch的內(nèi)核態(tài)快速通路openvswitch.ko進(jìn)行內(nèi)核態(tài)的包處理,然后從內(nèi)核態(tài)進(jìn)入用戶態(tài)與抽象的網(wǎng)絡(luò)設(shè)備的交互,到達(dá)Openvswitch主進(jìn)程ovs-vswitchd。數(shù)據(jù)包從網(wǎng)卡到達(dá)CPU寄存器是基于異步中斷信號模式的收包,是不斷的在做中斷處理,上下文切換,每次處理這種開銷是固定的,累加起來的負(fù)荷是非常明顯的。數(shù)據(jù)包從內(nèi)核態(tài)openvswitch.ko到ovs-vswitchd需要從內(nèi)核態(tài)切換到用戶態(tài),這種切換伴隨這內(nèi)存拷貝和上下文的切換[10,12]。
2)數(shù)據(jù)包從虛擬交換機(jī)到虛擬機(jī)。從性能和安全兩方面綜合考慮,虛擬機(jī)的I/O一般使用半虛擬化方案——virtio/virtio-net[10]。當(dāng)虛擬機(jī)發(fā)送報文時,它會利用消息通知機(jī)制通知KVM(Kernel-based Virtual Machine),并退出到用戶空間Qemu進(jìn)程,然后由Qemu開始對Tap設(shè)備進(jìn)行讀寫。這個過程中,在數(shù)據(jù)通道從Tap設(shè)備到Qemu的報文拷貝和Qemu到虛擬機(jī)的報文拷貝,兩次報文拷貝導(dǎo)致報文發(fā)送上的性能瓶頸;在消息通知路徑上,當(dāng)報文到達(dá)Tap設(shè)備時內(nèi)核發(fā)送到Qemu通知消息,然后Qemu利用ioctl向KVM請求中斷,KVM發(fā)送中斷到虛擬機(jī),這樣也會帶來不必要的性能開銷[11]。
當(dāng)然數(shù)據(jù)包從虛擬機(jī)到達(dá)網(wǎng)卡的過程與以上過程是一個相反的類似過程,在此不在贅述。
首先,針對Openvswitch的數(shù)據(jù)包轉(zhuǎn)發(fā)性能問題,根據(jù)上一節(jié)中對Openvswitch的數(shù)據(jù)包轉(zhuǎn)發(fā)流程的分析,跟數(shù)據(jù)包轉(zhuǎn)發(fā)性能相關(guān)的主要有兩個組件:ovs-vswitch(用戶態(tài)慢速通道)和openvswitch.ko(內(nèi)核態(tài)快速通道)。為了減少網(wǎng)卡在接收和發(fā)送數(shù)據(jù)包過程中的CPU的中斷次數(shù),文中在云環(huán)境中使用高性能的向量化PMD(Poll-mode driver)代替異步中斷模式[13]。這樣在有大量的數(shù)據(jù)包需要發(fā)送或者接收的時候,會觸發(fā)一個收包或者發(fā)包中斷,喚醒應(yīng)用程序的收發(fā)包進(jìn)程,應(yīng)用程序進(jìn)行輪詢收發(fā)包,這樣CPU在有大量數(shù)據(jù)包需要處理的時候不會收到中斷信號,同時也不會讓輪詢收發(fā)包進(jìn)程一直占用CPU。為了減少Openvswitch轉(zhuǎn)發(fā)過程中內(nèi)核態(tài)和用戶態(tài)之間切換,如圖3所示文中給出了一種數(shù)據(jù)包不經(jīng)過內(nèi)核態(tài)openvswitch.ko處理直接到達(dá)用戶態(tài)的方式。通過向量指令將使得vSwitch netdev可以在用戶態(tài)訪問數(shù)據(jù)包所存儲的內(nèi)存地址,同時通過dpif和dpif-netdev實現(xiàn)用戶態(tài)的快速數(shù)據(jù)通路。
圖3 優(yōu)化后Openvswitch的數(shù)據(jù)通道
其次,針對虛擬交換機(jī)到虛擬機(jī)的兩次拷貝和一次用戶態(tài)和內(nèi)核態(tài)的切換所帶來的性能損耗,文中采用vhost-user方式實現(xiàn)優(yōu)化。vhost的庫實現(xiàn)了以下特性:
1)實現(xiàn)了一種用戶態(tài)中的vhost-backend,使得數(shù)據(jù)包從虛擬機(jī)到后端驅(qū)動不需要切換CPU特權(quán)等級。
2)實現(xiàn)了對virtio網(wǎng)絡(luò)設(shè)備的管理,包括virtionet設(shè)備的創(chuàng)建和銷毀[14];
3)通過IVSHMEM將宿主機(jī)內(nèi)存和虛擬機(jī)共享,將虛擬機(jī)的物理地址映射到vhost-user的地址空間,實現(xiàn)了數(shù)據(jù)包從虛擬機(jī)到后端驅(qū)動的零內(nèi)存拷貝[15];
4)通過eventfd接收來自虛擬機(jī)的接收報文消息通知vhost接收來自虛擬機(jī)的報文,同時通過eventfd通知虛擬機(jī)接收報文;
圖4 使用vhost-user后虛擬機(jī)到網(wǎng)卡結(jié)構(gòu)圖
如圖4所示是使用vhost-user后虛擬機(jī)到網(wǎng)卡的結(jié)構(gòu)圖。圖中當(dāng)虛擬機(jī)發(fā)送數(shù)據(jù)包時,數(shù)據(jù)包經(jīng)由virtio driver的兩個虛擬隊列——tx發(fā)送。tx將數(shù)據(jù)包發(fā)送給用戶態(tài)中的vhost,同時virtio driver通過eventfd通知vhost接收數(shù)據(jù)包。由于虛擬機(jī)的物理地址映射到了vhost的地址空間,因此virtio只需要通過eventfd將數(shù)據(jù)包所在內(nèi)存地址告訴vhost,這樣vhost就可以通過地址偏移計算出數(shù)據(jù)包所在虛擬機(jī)物理地址[13]。當(dāng)虛擬機(jī)從Openvswitch接收數(shù)據(jù)包時,數(shù)據(jù)包會被存儲到vhost的地址空間,同時vhost通過eventfd發(fā)送通知消息給virtio driver讓其接收報文,并告知virtio driver數(shù)據(jù)包所在地址空間。由于虛擬機(jī)的地址空間和vhost地址空間是共享的,這樣virtio driver只需要找到對應(yīng)的地址就可以使得虛擬機(jī)接收到數(shù)據(jù)包。
圖5 優(yōu)化后虛擬網(wǎng)絡(luò)結(jié)構(gòu)圖
經(jīng)過以上方法優(yōu)化后,一臺虛擬機(jī)在OpenStack云平臺中的虛擬網(wǎng)絡(luò)如圖5所示。虛擬機(jī)通過vhost-user接口連接到虛擬交換機(jī)上,由于沒有了linux bridge簡化了虛擬網(wǎng)絡(luò)的結(jié)構(gòu),但是也同時無法使用內(nèi)核態(tài)的iptables實現(xiàn)安全組功能,因此需要使用安全組的另一種實現(xiàn)方式,Openflow流表實現(xiàn)。因此在OpenStack的配置文件需要加入以O(shè)pen?vswitch為驅(qū)動的firewall_driver。
文中的測試是通過對比原生的OpenStack和優(yōu)化后OpenStack的二層/三層轉(zhuǎn)發(fā)性能得出測試結(jié)論。測試方案如圖6所示,在測試優(yōu)化后的轉(zhuǎn)發(fā)能力測試中,將一臺服務(wù)器1作為轉(zhuǎn)發(fā)服務(wù)器,一臺服務(wù)器2作為測試服務(wù)器。其中轉(zhuǎn)發(fā)服務(wù)器作為OpenStack中的計算節(jié)點,在上面創(chuàng)建一臺虛擬機(jī),并在虛擬機(jī)上安裝L2/L3轉(zhuǎn)發(fā)程序:dpdk_l2_forwarding和dpdk_l3_forwarding。圖6中服務(wù)器2通過DPDK Pktgen程序從eth0網(wǎng)卡發(fā)送數(shù)據(jù)包,通過服務(wù)器2和服務(wù)器1之間的網(wǎng)線發(fā)送到Openvswitch+這個虛擬交換機(jī)上,并通過修改Openvswitch上的流表規(guī)則將發(fā)送到服務(wù)器1的eth0網(wǎng)卡上的數(shù)據(jù)包都發(fā)送給vhost-user1這個接口,數(shù)據(jù)包通過虛擬機(jī)的virtio接口將數(shù)據(jù)包交給虛擬機(jī)中的L2/L3 Forwarding程序處理,通過配置L2/L3 Forwarding程序?qū)?shù)據(jù)包由vhost-user2這個接口發(fā)送出虛擬機(jī),最終發(fā)送回DPDK Pktgen程序,并由其進(jìn)行測量[16]。在測試過程中,原生的OpenStack在二層/三層轉(zhuǎn)發(fā)測試的過程中發(fā)現(xiàn)在小包的處理上有明顯的丟包現(xiàn)象,而由于使用大頁內(nèi)存技術(shù)和輪詢技術(shù),極大的提高了虛擬交換機(jī)收包的能力,使得在優(yōu)化后的測試中沒有出現(xiàn)丟包現(xiàn)象。同時通過如圖7和8所示優(yōu)化后性能是原生OpenStack的6~7倍。
圖6 優(yōu)化后二層/三層轉(zhuǎn)發(fā)測試模型圖
圖7 二層轉(zhuǎn)發(fā)測試數(shù)據(jù)
圖8 三層轉(zhuǎn)發(fā)測試數(shù)據(jù)
文中首先對OpenStack云平臺及其網(wǎng)絡(luò)組件Neutron進(jìn)行了研究,并通過研究影響Nuetron虛擬網(wǎng)絡(luò)的因素,發(fā)現(xiàn)通過減少中斷處理、內(nèi)存拷貝、系統(tǒng)調(diào)用和協(xié)議處理的開銷可以優(yōu)化OpenStack的虛擬網(wǎng)絡(luò)的性能。通過優(yōu)化網(wǎng)卡數(shù)據(jù)包到達(dá)Open?vswitch的途徑和引入vhost-user接口提升了Open?Stack數(shù)據(jù)網(wǎng)絡(luò)中二層和三層的轉(zhuǎn)發(fā)性能。經(jīng)過測試,OpenStack環(huán)境優(yōu)化后可以將二層和三層轉(zhuǎn)發(fā)性能提高6-7倍,大大改善了OpenStack的網(wǎng)絡(luò)性能。
參考文獻(xiàn):
[1]劉輝邦,羅萱,黃保青,等.云計算中虛擬網(wǎng)絡(luò)服務(wù)的性能測量及運營實踐[C]//中國高等教育學(xué)會教育信息化分會第十二次學(xué)術(shù)年會論文集,2014.
[2]王喜文.試析中國云計算產(chǎn)業(yè)的發(fā)展路徑[J].物聯(lián)網(wǎng)技術(shù),2014(3):4-5.
[3]張麗梅.基于負(fù)載均衡的云資源調(diào)度策略研究[D].銀川:寧夏大學(xué),2014.
[4]陳陶,顧雙雙,柳鈕滔,等.基于OpenStack Juno版的私有云平臺部署及實踐[J].物聯(lián)網(wǎng)技術(shù),2015(6):64-67.
[5]張華,向輝,劉艷凱.深入淺出Neutron:OpenStack網(wǎng)絡(luò)技術(shù)[M].北京:清華大學(xué)出版社,2015.
[6]李莉,李紀(jì)成,張超然,等.基于OpenStack云平臺Neutron關(guān)鍵技術(shù)研究[J].長春理工大學(xué)學(xué)報自然科學(xué)版,2015,38(6):114-117.
[7]俞淑妍.基于OpenFlow的軟件定義網(wǎng)絡(luò)緩存加速系統(tǒng)的研究與實現(xiàn)[D].北京:北京郵電大學(xué),2014.
[8]D Zhou,B Fan,H Lim,et al.Scalable,High Perfor?mance Ethernet Forwarding with CuckooSwitch[C].Proceedings of the 2013 ACM International Confer?ence on Emerging Networking Experiments and Technologies,USA,2013:97-108.
[9]Rizzo L,Carbone M,Catalli G.Transparent accel?eration of software packet forwarding using netmap[C]//INFOCOM,2012 Proceedings IEEE.IEEE,2012:2471-2479.
[10]Paolino M, Nikolaev N, Fanguede J, et al.SnabbSwitch user space virtual switch benchmark and performance optimization for NFV[C]//Net?work Function Virtualization and Software Defined Network.IEEE,2016:86-92.
[11]Koka P,Mccracken M O,Schwetman H D,et al.Combining a remote TLB lookup and a subsequent cache miss into a single coherence operation:US,US9003163[P].2015.
[12]Casoni M,Grazia C A,Patriciello N.On the perfor?mance of Linux Container with Netmap/VALE for networks virtualization[C]//2013 19th IEEE Inter?nationalConferenceonNetworks(ICON).2013:1-6.
[13]朱河清.深入淺出DPDK[M].北京:機(jī)械工業(yè)出版社,2016.
[14]劉萌萌.基于SDN的全網(wǎng)路由虛擬化組件的研究與實現(xiàn)[D].北京:北京郵電大學(xué),2015.
[15]Patni S,George J,Lahoti P,et al.A zero-copy fast channel for inter-guest and guest-host commu?nication using VirtIO-serial[C]//International Con?ference on Next Generation Computing Technolo?gies.IEEE,2015:6-9.
[16]劉志聰,李秦偉,王勝俊.OpenStack云平臺Neu?tron的研究與測試[J].自動化與儀器儀表,2015(6):85-87.