云計算提供了一個令人難以置信的計算平臺。用戶通過點擊幾下用戶可以以每小時不到10美分的價格租用在云中的服務(wù)器,節(jié)約了使用物理設(shè)備的所有相關(guān)時間,精力和前期成本。云供應(yīng)商提供虛擬機(jī)(虛擬機(jī)),而不是物理計算機(jī)來實現(xiàn)低成本運營。云計算的關(guān)鍵是虛擬化軟件,被稱為虛擬機(jī)監(jiān)視器(虛擬機(jī)M),用來模擬一臺物理機(jī)器。用戶們非常安全地使用相互的客戶虛擬機(jī),而沒有意識到他們通常與許多人共享物理機(jī)(“主機(jī)”)。
18.1 SnowFlock簡介
云計算是敏捷組織的福音。對于使用物理服務(wù)器而言,用戶需要焦急地等待著緩慢的審批流程,批準(zhǔn)購買服務(wù)器,下訂單,直至服務(wù)器出貨,然后安裝和配置操作系統(tǒng)(OS)和應(yīng)用程序組。而云用戶不需要等待數(shù)周的購買流程,只專注過程控制,并可以在幾分鐘內(nèi)創(chuàng)建一個新的獨立服務(wù)器。
不幸的是,云服務(wù)器很少是獨立的。在快速實例化和按次使用模式的帶動下,云服務(wù)器通常是在配置相似的服務(wù)器可變池中的一個實例,能夠執(zhí)行動態(tài)和可擴(kuò)展的并行計算,數(shù)據(jù)挖掘,或web等任務(wù)。因為需要多次從相同的靜態(tài)模板中啟動新的實例,商業(yè)云還不能兌現(xiàn)真正的按需計算的承諾。服務(wù)器實例化后,云用戶仍然必須管理群集成員及通過增加新的服務(wù)器來調(diào)整。
SnowFlock通過虛擬機(jī)克隆技術(shù)解決了這些問題,這就是我們所提出的云API調(diào)用。應(yīng)用程序代碼經(jīng)常通過一個系統(tǒng)調(diào)用接口調(diào)用OS服務(wù),它現(xiàn)在也可以以同樣的方式通過類似的接口調(diào)用云服務(wù)。通過SnowFlock的虛擬機(jī)克隆技術(shù),我們可以將資源分配,集群管理和應(yīng)用程序邏輯可編程等諸多方面交織在一起,并作為一個單一的邏輯操作。
根據(jù)父虛擬機(jī),虛擬機(jī)克隆技術(shù)實例化了云服務(wù)器的多個完全相同副本。從邏輯上講,克隆的虛擬機(jī)繼承了其父節(jié)點的所有狀態(tài),包括操作系統(tǒng)和應(yīng)用程序級緩存。此外,虛擬機(jī)的克隆都將被自動添加到一個內(nèi)部私有網(wǎng)絡(luò)中,從而有效地加入了這個動態(tài)可擴(kuò)展的群集。新的計算資源,被封裝為相同的虛擬機(jī),從而可以按需動態(tài)創(chuàng)建。
就實際使用而已,虛擬機(jī)克隆技術(shù)是可用,高效,而且快速的。在這一章中,我們將描述SnowFlock中對虛擬機(jī)克隆技術(shù)的實現(xiàn),包括如何有效地在多個不同的編程模型和框架實現(xiàn)克隆, 如何在應(yīng)用程序運行時使服務(wù)器的開銷最少,以及如何在5秒或更少的時間內(nèi)來創(chuàng)造幾十個新的虛擬機(jī),等等。
SnowFlock非常靈活,能夠使用C, C + +,Python和Java的API來實現(xiàn)虛擬機(jī)克隆的程序控制。我們已經(jīng)成功地將SnowFlock移植到多個不同系統(tǒng)的原型實現(xiàn)中。在并行計算中,我們通過精確克隆技術(shù)有效地分擔(dān)了在許多物理主機(jī)的負(fù)載,并取得了良好的效果。對于在一個專用的服務(wù)器集群上運行的使用了消息傳遞接口(MPI)的多個并行應(yīng)用,需要修改MPI的啟動管理器,從而提供了良好的性能和更少的開銷,并且不需要修改應(yīng)用就能夠在每個新的克隆集群上運行。最后,在一些完全不同的應(yīng)用案例中,我們使用SnowFlock來提高彈性服務(wù)器的效率和性能。今天,基于云服務(wù)的新業(yè)務(wù)一般需要啟動新的服務(wù)器。而通過克隆運行中的虛擬機(jī),SnowFlock帶來了新的服務(wù)器功能。由于克隆的虛擬機(jī)繼承他們的父節(jié)點的熱緩沖區(qū),從而使性能迅速達(dá)到峰值,使上線速度快了20倍。
18.2 虛擬機(jī)克隆
顧名思義,虛擬機(jī)克隆與父虛擬機(jī)幾乎是相同的。實際上,還是有一些輕微且必要的差異的,例如避免MAC地址沖突等問題,但我們會稍后討論。創(chuàng)建一個整個本地磁盤和內(nèi)存狀態(tài)的虛擬機(jī)克隆是必須的,這也是我們第一個主要的設(shè)計權(quán)衡:應(yīng)該如何按需復(fù)制前端的狀態(tài)?
實現(xiàn)虛擬機(jī)克隆最簡單的方式是采用標(biāo)準(zhǔn)的虛擬機(jī)“遷移”能力。通常情況下,遷移是指將運行中的虛擬機(jī)服務(wù)移動到不同的主機(jī)上,例如如當(dāng)主機(jī)超載或需要維修的情況下。但是,因為虛擬機(jī)是純粹的軟件,所以可以被封裝在一個數(shù)據(jù)文件,然后將其復(fù)制到一個新的主機(jī)上,在短暫中斷后重新執(zhí)行。要做到這一點,現(xiàn)有的VMMS要包含一個“檢查點”來創(chuàng)建文件,該文件包括本地文件系統(tǒng),內(nèi)存映像,虛擬CPU(VCPU)寄存器等等。在遷移過程中,新啟動的副本替換原來的虛擬機(jī),但這個過程是可以改變的,例如離開原來的虛擬機(jī)運行時可以產(chǎn)生一個虛擬機(jī)克隆。在這種所謂的“渴望”進(jìn)程中,因為整個虛擬機(jī)處于狀態(tài)轉(zhuǎn)移前的執(zhí)行狀態(tài),所以整個虛擬機(jī)提供了最好的初始性能。這種復(fù)制的缺點是在開始執(zhí)行前必須費力地復(fù)制整個虛擬機(jī),這嚴(yán)重地影響了實例化的過程。
SnowFlock采用了另一種極端方式,即是延遲狀態(tài)復(fù)制。不再復(fù)制全部虛擬機(jī),而是復(fù)制虛擬機(jī)轉(zhuǎn)移時所需得重要數(shù)據(jù),在虛擬機(jī)轉(zhuǎn)移后,SnowFlock在復(fù)制克隆中所需的其他數(shù)據(jù)。這有兩個好處,首先,它最大限度地減少了工作量,盡可能實例化延遲加載。其次,它只復(fù) 制真正使用的狀態(tài)數(shù)據(jù),實際上是提高了虛擬機(jī)克隆的效率。當(dāng)然,這樣做的好處取決于克隆的行為,但少量的應(yīng)用程序需要訪問內(nèi)存和在本地文件系統(tǒng)的每個文件的每一頁時就效果不大了。
然而,延時復(fù)制的好處不是免費的。由于狀態(tài)轉(zhuǎn)移被推遲到最后,需要在狀態(tài)到達(dá)時,才能繼續(xù)執(zhí)行克隆。在時間共享工作站內(nèi)將內(nèi)存交換到磁盤,而并行的應(yīng)用程序從高延遲的數(shù)據(jù)源獲取狀態(tài)可能被阻塞。在SnowFlock的用例中,這些阻塞降低了克隆的性能,其嚴(yán)重程度取決于應(yīng)用程序。對于高性能計算應(yīng)用,我們已經(jīng)發(fā)現(xiàn)這種退化的影響不大,但可能會首先克隆的數(shù)據(jù)庫服務(wù)器性能。應(yīng)當(dāng)指出的是,這是一個瞬態(tài)影響:在幾分鐘之內(nèi),大多數(shù)必要的狀態(tài)已被轉(zhuǎn)移且性能父節(jié)點匹配。
順便說一句,如果你熟悉虛擬機(jī),你可能考慮在這里使用實時遷移的優(yōu)化。實時遷移的優(yōu)化,可以縮短原始虛擬機(jī)的暫停和恢復(fù)執(zhí)行新副本之間的間隔。要做到這一點,虛擬機(jī)監(jiān)視器(VMM)需要在父節(jié)點仍在運行時預(yù)拷貝它的狀態(tài),從而使只有最近更改過的頁才遷移。這項技術(shù)不會影響之間的遷移要求和副本開始執(zhí)行的時間間隔,因此不會降低虛擬機(jī)克隆的實例化延遲。
18.3 SnowFlock的實現(xiàn)方法
SnowFlock實現(xiàn)虛擬機(jī)克隆被稱為“虛擬機(jī)fork”,這就像標(biāo)準(zhǔn)的Unix系統(tǒng)調(diào)用fork一樣,但有幾個重要的差異。第一,系統(tǒng)調(diào)用fork是復(fù)制一個單一的進(jìn)程,虛擬機(jī)fork重復(fù)整個虛擬機(jī),包括所有的內(nèi)存,所有的進(jìn)程和虛擬設(shè)備,以及本地文件系統(tǒng)。第二,系統(tǒng)調(diào)用fork是產(chǎn)生在同一物理主機(jī)上運行的單個副本,虛擬機(jī)fork可以同時產(chǎn)生多個并行備份。最后,虛擬機(jī)可以被復(fù)制到不同的物理服務(wù)器,讓你迅速提高云服務(wù)的需要。
以下是SnowFlock中的核心概念:
? 虛擬化:虛擬機(jī)封裝了計算環(huán)境,使機(jī)器復(fù)制和云服務(wù)成為可能。
? 延遲傳播:直到需要的時候才復(fù)制虛擬機(jī)的狀態(tài),虛擬機(jī)克隆在幾秒鐘內(nèi)生成。
? 組播:諸多的虛擬機(jī)克隆有著類似的狀態(tài)需求。通過多播,幾十個虛擬機(jī)克隆可以盡快執(zhí)行。
? 頁故障:當(dāng)一個克隆使用了無效的內(nèi)存空間,這一故障將觸發(fā)一個請求到父節(jié)點,直到所需的內(nèi)存頁可用了,才繼續(xù)執(zhí)行克隆操作。
? 寫復(fù)制(COW):在虛擬機(jī)克隆生成前,父虛擬機(jī)先保留一個當(dāng)前內(nèi)存和磁盤頁的副本,在保留虛擬機(jī)克隆所需的狀態(tài)同時可以繼續(xù)運行。
我們使用Xen虛擬化系統(tǒng)來實現(xiàn)的SnowFlock,所以弄清一些Xen的專用術(shù)語是非常有用的。在Xen環(huán)境中,VMM被稱為虛擬機(jī)管理程序,虛擬機(jī)被稱為域。在每臺物理機(jī)(主機(jī))說,是一個特權(quán)域,稱為“域0(dom0),每個特權(quán)域能夠完整地訪問主機(jī)及其物理設(shè)備。如果虛擬機(jī)被用來控制額外的“訪問者”或“用戶”,則被稱為“域U”(domU)。
廣義而言,SnowFlock包括一套修改了的Xen虛擬機(jī)管理程序(使其在無效資源被訪問時能夠順利恢復(fù)),一組運行在dom0上的支持進(jìn)程和系統(tǒng)服務(wù)包括無效虛擬機(jī)狀態(tài)的合作遷移,以及一些虛擬機(jī)克隆中OS修改,由六個主要組成部分 。
? 虛擬機(jī)描述器:這個小對象是虛擬機(jī)克隆的抽象描述,描述了需要開始執(zhí)行的虛擬機(jī)基本框架。它沒有需要執(zhí)行任何實際工作血肉。
? 組播分發(fā)系統(tǒng)(mcdist):這是父節(jié)點系統(tǒng),能夠同時向所有克隆有效地發(fā)布虛擬機(jī)的狀態(tài)信息。
? 內(nèi)存服務(wù)器進(jìn)程:父節(jié)點服務(wù)器進(jìn)程中維護(hù)了父節(jié)點狀態(tài)的多個副本,并使其根據(jù)需求通過多播mcdist發(fā)布給所有克隆。
? Memtap進(jìn)程:一個虛擬機(jī)克隆端的進(jìn)程,與內(nèi)存服務(wù)器通信請求那些克隆所需要但又缺失的內(nèi)存頁。
? 克隆提示器:運行在克隆內(nèi)的guest內(nèi)核,通過為VMM提供線索來按需減少虛擬機(jī)狀態(tài)的遷移。盡管是可選的,卻是高效的。
? 控制棧:運行在每個物理主機(jī)上得守護(hù)進(jìn)程,協(xié)調(diào)其他組件以及管理SnowFlock的父節(jié)點和虛擬機(jī)克隆。
圖18.1:SnowFlock 虛擬機(jī)復(fù)制架構(gòu)
如圖所示,圖18.1描繪克隆一個虛擬機(jī)的過程,主要有四個主要步驟:(1)暫停父虛擬機(jī)并產(chǎn)生一個虛擬機(jī)描述器;(2)將虛擬機(jī)描述器分發(fā)到所有目標(biāo)主機(jī)(3)克隆初始化;(4)按需加載狀態(tài)。該圖還描述了使用mcdist 進(jìn)行組播分發(fā)的方法,并取通過訪問啟示避免相關(guān)問題 。
如果你有興趣嘗試SnowFlock,這里有兩種方法。多倫多大學(xué)SnowFlock研究項目組提供了文文檔和開放的源代碼1, . 如果您愿意采用一個工業(yè)化的版本,可以從GridCentric公司2 獲得一個免費的非商業(yè)許可證.由于SnowFlock包括hypervisor的修改和dom0的訪問的,所以安裝SnowFlock需要對主機(jī)的訪問權(quán)限。出于這個原因,你需要使用自己的硬件,將不能使用如亞馬遜的EC2云環(huán)境等商業(yè)云服務(wù)。
在接下來的幾節(jié)中,我們將描述瞬時實現(xiàn)和高效克隆的協(xié)同工作。我們將所以地內(nèi)容結(jié)合在一起,如圖18.2所示 。
圖18.2:SnowFlock的的軟件組件
18.4 構(gòu)建虛擬機(jī)描述器
SnowFlock的設(shè)計關(guān)鍵是決定推遲虛擬機(jī)的狀態(tài)復(fù)制到一個延遲運行操作。換句話說,復(fù)制虛擬機(jī)的內(nèi)存是后期綁定操作,從而為優(yōu)化的許多機(jī)會。
第一步的設(shè)計決定是生成虛擬機(jī)狀態(tài)的架構(gòu)描述器。這是將用于創(chuàng)建克隆虛擬機(jī)的種子。它包含了創(chuàng)建一個虛擬機(jī)的最低必要條件,使其可以被調(diào)度。顧名思義,這一必要條件是由架構(gòu)規(guī)范所需要的數(shù)據(jù)結(jié)構(gòu)組成。在SnowFlock中,該架構(gòu)是Intel x86處理器和Xen的結(jié)合。因此,架構(gòu)的描述包含數(shù)據(jù)結(jié)構(gòu),如頁表,虛擬寄存器,設(shè)備元數(shù)據(jù),wallclock時間戳等.我們推薦有興趣的讀者可以參考[LCWB +11 ]架構(gòu)描述器的內(nèi)容來深入理解。
一個架構(gòu)描述器有三個重要的屬性:首先,它可以在短時間內(nèi)創(chuàng)建200毫秒的情況并不少見。其次,它是小的,通常是小于原虛擬機(jī)的內(nèi)存分配三個數(shù)量級(1 MB為1 GB的虛擬機(jī))。第三,從一個描述符創(chuàng)建克隆虛擬機(jī)可以在一秒鐘之內(nèi)(通常為800毫秒)。
當(dāng)然,主要的時間開銷是從描述他們的記憶狀態(tài)創(chuàng)建克隆虛擬機(jī)全部的時間。以下各節(jié)我們說明如何解決這個問題,如何利用優(yōu)勢,并提出優(yōu)化的機(jī)會。
18.5父節(jié)點組件
一旦被克隆的虛擬機(jī)成為一個父節(jié)點, 就和所有其他父節(jié)點一樣,它需要為子節(jié)點提供克隆服務(wù)。父節(jié)點是通過維護(hù)一套內(nèi)存和磁盤狀態(tài),克隆的集會,為克隆虛擬機(jī)提供按需服務(wù)。
18.5.1 memserver進(jìn)程
當(dāng)創(chuàng)建架構(gòu)描述器的時候,虛擬機(jī)將在進(jìn)程中停止。這保證了虛擬機(jī)的內(nèi)存狀態(tài)穩(wěn)定;在暫停虛擬機(jī)并執(zhí)行調(diào)度或取消調(diào)度前,內(nèi)部OS驅(qū)動程序處于停頓狀態(tài),從克隆可以重新連接到外部網(wǎng)絡(luò)。我們采取這種靜止?fàn)顟B(tài)的優(yōu)勢來創(chuàng)建一個“內(nèi)存服務(wù)器”即memserver。
內(nèi)存服務(wù)器將提供克隆虛擬機(jī)所需的所有父節(jié)點內(nèi)存數(shù)據(jù)。內(nèi)存轉(zhuǎn)移是以x86的內(nèi)存頁(4字節(jié))為粒度單位的。最簡單的形式是內(nèi)存服務(wù)器等待來自克隆的內(nèi)存頁請求,在一個時間上為一個克隆提供一個內(nèi)存頁的轉(zhuǎn)移。
然而,這些需要轉(zhuǎn)移的內(nèi)存在父虛擬機(jī)中需要繼續(xù)使用并執(zhí)行。如果我們允許父節(jié)點去修改這個內(nèi)存,那將會以損壞的內(nèi)存內(nèi)容克隆虛擬機(jī):內(nèi)存供應(yīng)將是從不同的克隆點完成的,使克隆容易混淆。以破解內(nèi)核的詞匯來說,這是一個堆棧信息跟蹤的問題。
為了克服這個問題,采用經(jīng)典的操作系統(tǒng)概念來救援:Copy-on-Write, 即CoW memory.。通過輔助的Xen hypervisor,我們可以移除父虛擬機(jī)的所有內(nèi)存頁寫入權(quán)限。當(dāng)父節(jié)點試圖修改一個內(nèi)存頁,將觸發(fā)硬件內(nèi)存頁錯誤。Xen通過頁面的副本知道這種情況發(fā)生的原因。父虛擬機(jī)允許寫入到原來的頁面,并繼續(xù)執(zhí)行,而被告知使用原來的副本,這就是保持只讀的內(nèi)存服務(wù)器。在這種方式下,被克隆的內(nèi)存狀態(tài)仍然凍結(jié),且不混淆,而父節(jié)點能夠繼續(xù)執(zhí)行。CoW的開銷是最小的:Linux使用了類似的機(jī)制,如創(chuàng)建一個新的進(jìn)程。
18.5.2 Multicast與Mcdist
克隆通常存在被稱為“命運的決定”的問題。 我們希望創(chuàng)建克隆是為了一個單一的目的:例如,相對于Y調(diào)整一個數(shù)據(jù)庫的DNA中X鏈。此外,我們期望要創(chuàng)建一套克隆,使所有的兄弟姐妹做的一樣,也許對數(shù)據(jù)庫的不同部分對準(zhǔn)相同的X鏈,或調(diào)整不同的鏈對準(zhǔn)Y鏈,從而明確地表現(xiàn)為大量內(nèi)存訪問的時間局部性:他們將使用相同的代碼和大部分常見的數(shù)據(jù)。
我們利用時間局部性,為SnowFlock量身定制了自己的組播分發(fā)系統(tǒng)—— mcdist。mcdist使用IP組播,同時為接收器集合分發(fā)相同的數(shù)據(jù)包。它利用網(wǎng)絡(luò)硬件并行處理的優(yōu)勢減少了內(nèi)存的服務(wù)器上的負(fù)載。因為所有克隆具有類似的內(nèi)存訪問模式,通過對所有克隆的第一個要求發(fā)送一個應(yīng)答,每個克隆的要求被作為它的兄弟姐妹預(yù)處理。
不像其他的組播系統(tǒng),mcdist并不一定是可靠的,沒有以一個有序的方式提供數(shù)據(jù)包,也沒有以原子方式提供所有擬接收的應(yīng)答。組播是嚴(yán)格意義上的優(yōu)化,并確??寺∶鞔_請求內(nèi)存頁的需要。因此,該設(shè)計優(yōu)雅簡單:簡單的服務(wù)器多播的響應(yīng),而因為客戶端超時,當(dāng)克隆沒有收到一個請求的答復(fù)時重新請求。
SnowFlock的三個優(yōu)化都體現(xiàn)在mcdist上:
? 一致性檢測:當(dāng)時間局部性發(fā)生時,多個無差別請求都非常密切的繼承在同一頁。mcdist服務(wù)器忽略所有除第一個以外的請求。
? 流量控制:接收器的獲取率與請求相關(guān)。服務(wù)器的發(fā)送率取決于客戶端接受率的加權(quán)平均。否則,接收器將會淹沒在服務(wù)器發(fā)送過多的內(nèi)存頁中。
? 游戲結(jié)束:當(dāng)服務(wù)器已經(jīng)發(fā)送了大多數(shù)頁面時,將回到單播響應(yīng)。在這一時間點上的大多數(shù)請求是重試,從而通過網(wǎng)絡(luò)的內(nèi)存頁轟炸所有克隆是不必要的。
18.5.3虛擬磁盤
SnowFlock的克隆,由于其短壽命和命運決定,很少使用的磁盤。SnowFlock 虛擬機(jī)的虛擬磁盤包括了二進(jìn)制文件,庫和配置文件的根分區(qū)。通過合適的文件系統(tǒng)如HDFS 或PVFS 是完成大量的數(shù)據(jù)處理。因此,當(dāng)SnowFlock克隆決定從他們的根磁盤讀取數(shù)據(jù)時,它們通常由內(nèi)核的文件系統(tǒng)頁面緩存來滿足這樣要求。 盡管如此,我們?nèi)孕杼峁┛寺〉奶摂M磁盤訪問,在一些罕見的實例中這種訪問需求是需要的。我們在這里采用了最小阻力路徑,依據(jù)內(nèi)存復(fù)制的設(shè)計來實現(xiàn)虛擬磁盤訪問。首先,在克隆的時間里磁盤的狀態(tài)被凍結(jié)。父虛擬機(jī)保持以CoW的方式使用其磁盤:對存儲備份的寫操作被發(fā)送到單獨的位置,在磁盤克隆時也是不可改變的。二,磁盤的狀態(tài)將使用 mcdist組播到所有克隆,且具有相同的4 KB頁的粒度,并根據(jù)時間局部性完成相同的期望。第三,嚴(yán)格復(fù)制克隆虛擬機(jī)的磁盤狀態(tài)是短暫的:它存儲在一個文件中,當(dāng)克隆被摧毀后被刪除。
18.6克隆端組件
克隆在從架構(gòu)描述器創(chuàng)建時是空心彈,和我們一樣,他們需要從父母那里獲得很大的幫助才能長大:子虛擬機(jī)們遷出時要立即給家里打電話,他們發(fā)現(xiàn)很多需要的東西缺失,要求他們的父母馬上發(fā)送。
18.6.1 memtap進(jìn)程
memtap進(jìn)程連接到每個創(chuàng)建后的克隆,是一個克隆的生命線。它映射到克隆的所有內(nèi)存并按需加載。通過Xen的hypervisor,它登記了一些關(guān)鍵的數(shù)據(jù)位:訪問克隆內(nèi)存的權(quán)限被關(guān)閉,由第一次訪問一個內(nèi)存頁造成的硬件故障由hypervisor路由到memtap進(jìn)程。
在其最簡單的化身中,memtap進(jìn)程只需簡單地要求內(nèi)存的服務(wù)器處理錯誤內(nèi)存頁,但也有更復(fù)雜的情況。首先,memtap助手使用了mcdist。這意味著,在任何時間點,任何頁面可以憑借已被另一個克隆的異步預(yù)取請求到達(dá)克隆。第二,我們允許SnowFlock虛擬機(jī)是多處理器的虛擬機(jī)。這就不那么有趣了。這意味著,在并行處理時存在同一頁的多個故障需要。第三,在以后的版本中,memtap助手可以明確地預(yù)取批量的內(nèi)存頁,在缺乏保證情況下,以任何次序從mcdist服務(wù)器到達(dá)克隆。這些因素可能導(dǎo)致并發(fā)噩夢,我們遇到了所有這些問題。
內(nèi)存頁位圖是整個memtap的設(shè)計中心。當(dāng)處理架構(gòu)描述器創(chuàng)建克隆虛擬機(jī)時,創(chuàng)建和初始化該位圖。該位圖是一個比特數(shù)組,其大小由虛擬機(jī)內(nèi)存可容納的內(nèi)存頁數(shù)量決定。英特爾處理器有方便的原子位互斥指令:設(shè)置了一個比特,或做一個測試和設(shè)置,可以保證原子發(fā)生與其他處理器在同一個盒子里。這使得我們在大多數(shù)情況下,從而提供不同的實體,在不同的保護(hù)域的訪問位圖以避免鎖:Xen管理程序,memtap進(jìn)程,以及guest內(nèi)核本身的克隆。
當(dāng)Xen的處理由第一次訪問頁面產(chǎn)生的硬件頁錯誤時,它使用內(nèi)存頁位圖來決定是否需要提醒 memtap。它還使用該位圖依賴于不在同一頁的多個虛擬處理器來隊列化memtap緩沖頁。當(dāng)其緩沖區(qū)是滿的,或到達(dá)一個明確請求的內(nèi)存頁時暫停虛擬機(jī),位圖被用來丟棄那些已經(jīng)到達(dá)的任何重復(fù)的已經(jīng)存在內(nèi)存頁。所需的任何剩余內(nèi)存頁被復(fù)制到虛擬機(jī)的內(nèi)存,并設(shè)置適當(dāng)?shù)奈粓D比特。
18.6.2 明智的克隆,避免不必要的提取
我們剛剛提到,運行于克隆內(nèi)核的該內(nèi)存頁位圖是可見的,并沒有鎖,需要修改。這給克隆提供了一個強大的“啟蒙”工具:它們可以防止通過修改位圖和假裝已經(jīng)存在的是當(dāng)前內(nèi)存頁的抓取。這是非常有用的性能,在內(nèi)存頁沒有完全覆蓋之前,他們都可以被安全使用。
恰好是一個非常普遍的情況,當(dāng)發(fā)生這種情況,并獲取可避免。在內(nèi)核中的所有內(nèi)存分配(虛擬機(jī)alloc的使用 ,kzalloc,get_free_page,用戶空間的BRK,等等)最終處理內(nèi)核頁分配器。內(nèi)存頁通常由中間開始分配,管理細(xì)粒度塊要求是:slab分配器,glibc在一個用戶空間進(jìn)程的malloc分配,等等。然而,無論是顯式或隱式的分配,一個關(guān)鍵的語法含義始終正確:沒有人關(guān)注內(nèi)存頁中包含的內(nèi)容,因為它的內(nèi)容將隨時被覆蓋。為什么取這樣一個內(nèi)存頁呢?沒有任何理由這樣做,實際經(jīng)驗表明,避免這種獲取方式是極其有利的。
18.7虛擬機(jī)克隆的應(yīng)用程序接口
到目前為止,我們都集中一個虛擬機(jī)有效克隆的內(nèi)部機(jī)制。作為服務(wù)系統(tǒng)非常有趣,所以我們需要把注意力放在誰將使用這樣的系統(tǒng):應(yīng)用。
18.7.1。API實現(xiàn)
通過簡單的SnowFlock API(如圖18.1所示),應(yīng)用程序可以利用虛擬機(jī)克隆。利用克隆的方式基本上是一個兩階段的過程。你第一次請求分配一個克隆實例,雖然依賴于系統(tǒng)策略的影響,分配的實例可能會小于所請求的內(nèi)容。第二,你可以使用分配給你的虛擬機(jī)克隆。一個關(guān)鍵的假設(shè)是你的重點聚焦于虛擬機(jī)上一個操作。虛擬機(jī)克隆是適用于單一應(yīng)用的虛擬機(jī),如Web服務(wù)器或一個渲染工廠組件。如果你在一百多個桌面環(huán)境進(jìn)程中的多個應(yīng)用程序同時調(diào)用虛擬機(jī)克隆,你就頭大了。
sf_request_ticket(N) 請求分配n個克隆。返回一個分配M≤N 克隆的ticket。
sf_clone(ticket) 使用的ticket分配克隆。返回克隆ID,0≤ID
sf_checkpoint_parent() 準(zhǔn)備一個檢查點?不可改變的父虛擬機(jī),可用于以后任意創(chuàng)建克隆。
sf_create_clones(C,門票) 與sf_clone相同,只是使用檢查點?。在哪個對應(yīng)點開始執(zhí)行
sf_checkpoint_parent()時調(diào)用克隆。
sf_exit() 終止子克?。?≤ID
sf_join(ticket) 父節(jié)點使用(ID = 0),塊,直到所有使用ticket的子節(jié)點調(diào)用sf_exit前一直處于阻塞狀態(tài)。在這一時間點上,所有的子節(jié)點都被終止和ticket被棄用。
sf_kill(ticket) 家長棄用ticket票,并立即殺死所有相關(guān)的子節(jié)點進(jìn)程。
表18.1:SnowFlock虛擬機(jī)克隆API
API簡化了編組消息,同時傳遞給XenStore,Xen通過共享內(nèi)存的低吞吐量接口來控制平面交易。在hypervisor上運行的一個SnowFlock本地守護(hù)進(jìn)程(SFLD)執(zhí)行監(jiān)聽這樣的請求,包括消息解組,執(zhí)行,并要求回調(diào)。
通過API,程序可以直接控制虛擬機(jī)的克隆。API編程語言包括C,C + +,Python和Java。我們既可以使用shell腳本執(zhí)行程序,也可以使用所提供的命令行腳本。并行框架(如MPI)可以嵌入到API中:MPI程序就可以使用SnowFlock了,且并不需要修改源代碼。置于Web服務(wù)器或應(yīng)用服務(wù)器前的負(fù)載平衡器可以使用API克隆他們所管理的服務(wù)器。
SFLDs協(xié)調(diào)虛擬機(jī)克的隆執(zhí)行請求。他們創(chuàng)建和傳輸架構(gòu)描述器,創(chuàng)建克隆的虛擬機(jī),啟動磁盤和內(nèi)存的服務(wù)器,并啟動memtap輔助進(jìn)程。他們是分布在一個物理集群系統(tǒng)上負(fù)責(zé)管理虛擬機(jī)的一個微型發(fā)布系統(tǒng)。
SFLDs推遲分配的決策給一個集中SnowFlock的主守護(hù)進(jìn)程(SFMD)。SFMD使用相應(yīng)的集群管理軟件簡化了接口。我們沒有看到任何需求需要推倒重來,包括資源分配,配額,策略等,例如Sun的網(wǎng)格引擎或平臺的EGO等都是適合的。
18.7.2必要的突變
克隆后,大多數(shù)克隆的虛擬機(jī)進(jìn)程不再是父節(jié)點,而且他們現(xiàn)在運行在一個副本上。在大多數(shù)情況下,這是正常的,沒有問題。畢竟,操作系統(tǒng)的主要任務(wù)是從低層次的細(xì)節(jié)(如網(wǎng)絡(luò)標(biāo)識)隔離應(yīng)用程序。然而,平穩(wěn)過渡需要一套有效的機(jī)制。如果管理在克隆的網(wǎng)絡(luò)身份以避免沖突和混亂,我們就必須引入在克隆過程中的輕微突變。此外,因為這些調(diào)整可能需要更高級別的權(quán)限,所以允許用戶配置一個鉤子程序來插入到任何必要的任務(wù)中,例如依靠克隆的身份安裝網(wǎng)絡(luò)文件系統(tǒng)。
克隆的產(chǎn)生有可能是不必要的。盡管父虛擬機(jī)可能是由DHCP服務(wù)器管理的網(wǎng)絡(luò)的一部分,或系統(tǒng)管理員通過其他各種途徑能夠做到克隆的IP地址分配。為了保持靈活的應(yīng)用場景,我們將父節(jié)點和所有克隆置于虛擬的私有網(wǎng)絡(luò)中。從同一父節(jié)點的克隆都分配一個唯一的ID,他們的IP地址在這個私有網(wǎng)絡(luò)中被自動設(shè)置后,克隆的ID生效。這保證了不需要系統(tǒng)管理員的干預(yù)參與,而且沒有IP地址沖突。
我們通過一個鉤子程序在虛擬的網(wǎng)絡(luò)驅(qū)動程序直接對IP進(jìn)行重新配置。然而,我們也催動驅(qū)動程序自動生成合成的DHCP響應(yīng)。因此,無論你如何分發(fā),虛擬的網(wǎng)絡(luò)接口將確保正確的IP地址傳播到客戶機(jī)操作系統(tǒng),甚至當(dāng)你重新啟動主機(jī)是都可以。
為了防止來自不同父母的克隆碰撞以及隔離彼此的虛擬專用網(wǎng)絡(luò),可以防止相互DDoS攻擊克隆虛擬網(wǎng)絡(luò)的以太網(wǎng)(或第二層交換)。我們劫持了以太網(wǎng)MAC OUIs范圍3,奉獻(xiàn)他們的克隆。OUI將是一個父虛擬機(jī)的功能。像通過一個虛擬機(jī)的ID確定其IP地址一樣,這同樣決定了其非OUI的以太網(wǎng)MAC地址。虛擬的網(wǎng)絡(luò)驅(qū)動器具有將虛擬機(jī)的MAC地址轉(zhuǎn)換成它所分配虛擬機(jī)ID的功能,過濾出所有虛擬專用網(wǎng)絡(luò)與不同OUI們的流量。這種隔離是通過 ebtables簡單實現(xiàn)的。
讓彼此克隆間通信可能是有趣的,但不是情趣盎然。有時我們會想讓克隆響應(yīng)來自互聯(lián)網(wǎng)的HTTP請求,或連接公共數(shù)據(jù)倉庫。我們?yōu)樘摂M機(jī)的任何一套父節(jié)點和克隆配備一個專用的路由器。這個路由器的小虛擬機(jī)執(zhí)行從克隆到互聯(lián)網(wǎng)的防火墻,節(jié)流和NAT的功能。這也限制了父虛擬機(jī)的接入連接和眾所周知的端口。路由器的虛擬機(jī)是輕量級的,但代表了網(wǎng)絡(luò)流量的集中化,從而嚴(yán)重限制了可伸縮性的單點。相同的網(wǎng)絡(luò)規(guī)則,可用于每個克隆虛擬機(jī)運行主機(jī)的一個分布式環(huán)境。我們還沒有發(fā)布這個實驗室補丁。
SFLDs分配了虛擬機(jī)ID,并指導(dǎo)虛擬網(wǎng)絡(luò)驅(qū)動程序應(yīng)該如何配置自己內(nèi)部的MAC和IP地址,DHCP指令,路由器虛擬機(jī)的坐標(biāo),過濾規(guī)則,等等。
18.8結(jié)論
通過調(diào)整Xen hypervisor和延遲轉(zhuǎn)移虛擬機(jī)的狀態(tài),SnowFlock可以在幾秒鐘內(nèi)產(chǎn)生幾十個運行中的虛擬機(jī)克隆。SnowFlock克隆虛擬機(jī)的瞬時性和熱加載極大地改善了自動化集群管理的可用性和為應(yīng)用提供云資源的更大可編程性。SnowFlock也提高了云的靈活性,虛擬機(jī)實例加快了20倍,并通過利用他們的父節(jié)點內(nèi)存中的操作系統(tǒng)和應(yīng)用程序緩存提高了最新創(chuàng)建的虛擬機(jī)的性能。SnowFlock高效性能的關(guān)鍵是啟發(fā)式,避免了不必要的頁面抓取,組播系統(tǒng),讓克隆們合作預(yù)取它們的狀態(tài)。它是巧妙應(yīng)用了一些嘗試和真正的技術(shù),一些技巧,以及一些工業(yè)界調(diào)試的慷慨幫助。
我們認(rèn)識到整個SnowFlock經(jīng)歷了兩個重要的教訓(xùn)。首先是經(jīng)常被低估的價值KISS定理。我們期待實現(xiàn)復(fù)雜的預(yù)取技術(shù),以減輕一連串的內(nèi)存頁在克隆啟動時會發(fā)出的請求。令人驚訝的是這也許沒有必要。該系統(tǒng)作為以一個單一原則為基礎(chǔ)的許多工作有很好的表現(xiàn):只是帶來了超出需要的內(nèi)存。簡單化的另一個例子是內(nèi)存頁位圖。通過一個簡單的數(shù)據(jù)結(jié)構(gòu)和清晰的原子訪問語義,這大大簡化了由于多個虛擬CPU,頁面更新的競爭,通過多播的異步頁到達(dá)等可能產(chǎn)生的并發(fā)性問題。
第二個教訓(xùn)是規(guī)模不再是謊言。換句話說,你發(fā)現(xiàn)每次你都會碰到準(zhǔn)備切換系統(tǒng)和新出現(xiàn)瓶頸的規(guī)模性問題。這是緊密聯(lián)系在一起的教訓(xùn):隨著負(fù)載的增加,簡單而優(yōu)雅的解決方案使規(guī)?;[藏了起來。這個原則的一個最好的例子是mcdist系統(tǒng)。在大規(guī)模的測試表明,一個以TCP / IP為基礎(chǔ)的頁面分配機(jī)制進(jìn)行數(shù)百克隆時經(jīng)常慘遭失敗。mcdist憑借其極端的分發(fā)機(jī)制和角色良好定義的獲得了成功:客戶只關(guān)心自己的內(nèi)存頁,服務(wù)器只關(guān)心維持一個全局的流量控制。保持mcdist優(yōu)雅簡單,使SnowFlock能夠擴(kuò)展得非常好。
如果你有興趣了解更多,您可以訪問網(wǎng)站多倫多大學(xué)的網(wǎng)站1獲得在GPLv2授權(quán)許可下的學(xué)術(shù)論文和開放源碼,GridCentric 4為一個工業(yè)化的實現(xiàn)。
注:
更多建議: