卷1:第18章 SnowFlock

2018-02-24 15:55 更新

云計(jì)算提供了一個(gè)令人難以置信的計(jì)算平臺(tái)。用戶通過點(diǎn)擊幾下用戶可以以每小時(shí)不到10美分的價(jià)格租用在云中的服務(wù)器,節(jié)約了使用物理設(shè)備的所有相關(guān)時(shí)間,精力和前期成本。云供應(yīng)商提供虛擬機(jī)(虛擬機(jī)),而不是物理計(jì)算機(jī)來實(shí)現(xiàn)低成本運(yùn)營(yíng)。云計(jì)算的關(guān)鍵是虛擬化軟件,被稱為虛擬機(jī)監(jiān)視器(虛擬機(jī)M),用來模擬一臺(tái)物理機(jī)器。用戶們非常安全地使用相互的客戶虛擬機(jī),而沒有意識(shí)到他們通常與許多人共享物理機(jī)(“主機(jī)”)。

18.1 SnowFlock簡(jiǎn)介

云計(jì)算是敏捷組織的福音。對(duì)于使用物理服務(wù)器而言,用戶需要焦急地等待著緩慢的審批流程,批準(zhǔn)購買服務(wù)器,下訂單,直至服務(wù)器出貨,然后安裝和配置操作系統(tǒng)(OS)和應(yīng)用程序組。而云用戶不需要等待數(shù)周的購買流程,只專注過程控制,并可以在幾分鐘內(nèi)創(chuàng)建一個(gè)新的獨(dú)立服務(wù)器。

不幸的是,云服務(wù)器很少是獨(dú)立的。在快速實(shí)例化和按次使用模式的帶動(dòng)下,云服務(wù)器通常是在配置相似的服務(wù)器可變池中的一個(gè)實(shí)例,能夠執(zhí)行動(dòng)態(tài)和可擴(kuò)展的并行計(jì)算,數(shù)據(jù)挖掘,或web等任務(wù)。因?yàn)樾枰啻螐南嗤撵o態(tài)模板中啟動(dòng)新的實(shí)例,商業(yè)云還不能兌現(xiàn)真正的按需計(jì)算的承諾。服務(wù)器實(shí)例化后,云用戶仍然必須管理群集成員及通過增加新的服務(wù)器來調(diào)整。

SnowFlock通過虛擬機(jī)克隆技術(shù)解決了這些問題,這就是我們所提出的云API調(diào)用。應(yīng)用程序代碼經(jīng)常通過一個(gè)系統(tǒng)調(diào)用接口調(diào)用OS服務(wù),它現(xiàn)在也可以以同樣的方式通過類似的接口調(diào)用云服務(wù)。通過SnowFlock的虛擬機(jī)克隆技術(shù),我們可以將資源分配,集群管理和應(yīng)用程序邏輯可編程等諸多方面交織在一起,并作為一個(gè)單一的邏輯操作。

根據(jù)父虛擬機(jī),虛擬機(jī)克隆技術(shù)實(shí)例化了云服務(wù)器的多個(gè)完全相同副本。從邏輯上講,克隆的虛擬機(jī)繼承了其父節(jié)點(diǎn)的所有狀態(tài),包括操作系統(tǒng)和應(yīng)用程序級(jí)緩存。此外,虛擬機(jī)的克隆都將被自動(dòng)添加到一個(gè)內(nèi)部私有網(wǎng)絡(luò)中,從而有效地加入了這個(gè)動(dòng)態(tài)可擴(kuò)展的群集。新的計(jì)算資源,被封裝為相同的虛擬機(jī),從而可以按需動(dòng)態(tài)創(chuàng)建。

就實(shí)際使用而已,虛擬機(jī)克隆技術(shù)是可用,高效,而且快速的。在這一章中,我們將描述SnowFlock中對(duì)虛擬機(jī)克隆技術(shù)的實(shí)現(xiàn),包括如何有效地在多個(gè)不同的編程模型和框架實(shí)現(xiàn)克隆, 如何在應(yīng)用程序運(yùn)行時(shí)使服務(wù)器的開銷最少,以及如何在5秒或更少的時(shí)間內(nèi)來創(chuàng)造幾十個(gè)新的虛擬機(jī),等等。

SnowFlock非常靈活,能夠使用C, C + +,Python和Java的API來實(shí)現(xiàn)虛擬機(jī)克隆的程序控制。我們已經(jīng)成功地將SnowFlock移植到多個(gè)不同系統(tǒng)的原型實(shí)現(xiàn)中。在并行計(jì)算中,我們通過精確克隆技術(shù)有效地分擔(dān)了在許多物理主機(jī)的負(fù)載,并取得了良好的效果。對(duì)于在一個(gè)專用的服務(wù)器集群上運(yùn)行的使用了消息傳遞接口(MPI)的多個(gè)并行應(yīng)用,需要修改MPI的啟動(dòng)管理器,從而提供了良好的性能和更少的開銷,并且不需要修改應(yīng)用就能夠在每個(gè)新的克隆集群上運(yùn)行。最后,在一些完全不同的應(yīng)用案例中,我們使用SnowFlock來提高彈性服務(wù)器的效率和性能。今天,基于云服務(wù)的新業(yè)務(wù)一般需要啟動(dòng)新的服務(wù)器。而通過克隆運(yùn)行中的虛擬機(jī),SnowFlock帶來了新的服務(wù)器功能。由于克隆的虛擬機(jī)繼承他們的父節(jié)點(diǎn)的熱緩沖區(qū),從而使性能迅速達(dá)到峰值,使上線速度快了20倍。

18.2 虛擬機(jī)克隆

顧名思義,虛擬機(jī)克隆與父虛擬機(jī)幾乎是相同的。實(shí)際上,還是有一些輕微且必要的差異的,例如避免MAC地址沖突等問題,但我們會(huì)稍后討論。創(chuàng)建一個(gè)整個(gè)本地磁盤和內(nèi)存狀態(tài)的虛擬機(jī)克隆是必須的,這也是我們第一個(gè)主要的設(shè)計(jì)權(quán)衡:應(yīng)該如何按需復(fù)制前端的狀態(tài)?

實(shí)現(xiàn)虛擬機(jī)克隆最簡(jiǎn)單的方式是采用標(biāo)準(zhǔn)的虛擬機(jī)“遷移”能力。通常情況下,遷移是指將運(yùn)行中的虛擬機(jī)服務(wù)移動(dòng)到不同的主機(jī)上,例如如當(dāng)主機(jī)超載或需要維修的情況下。但是,因?yàn)樘摂M機(jī)是純粹的軟件,所以可以被封裝在一個(gè)數(shù)據(jù)文件,然后將其復(fù)制到一個(gè)新的主機(jī)上,在短暫中斷后重新執(zhí)行。要做到這一點(diǎn),現(xiàn)有的VMMS要包含一個(gè)“檢查點(diǎn)”來創(chuàng)建文件,該文件包括本地文件系統(tǒng),內(nèi)存映像,虛擬CPU(VCPU)寄存器等等。在遷移過程中,新啟動(dòng)的副本替換原來的虛擬機(jī),但這個(gè)過程是可以改變的,例如離開原來的虛擬機(jī)運(yùn)行時(shí)可以產(chǎn)生一個(gè)虛擬機(jī)克隆。在這種所謂的“渴望”進(jìn)程中,因?yàn)檎麄€(gè)虛擬機(jī)處于狀態(tài)轉(zhuǎn)移前的執(zhí)行狀態(tài),所以整個(gè)虛擬機(jī)提供了最好的初始性能。這種復(fù)制的缺點(diǎn)是在開始執(zhí)行前必須費(fèi)力地復(fù)制整個(gè)虛擬機(jī),這嚴(yán)重地影響了實(shí)例化的過程。

SnowFlock采用了另一種極端方式,即是延遲狀態(tài)復(fù)制。不再復(fù)制全部虛擬機(jī),而是復(fù)制虛擬機(jī)轉(zhuǎn)移時(shí)所需得重要數(shù)據(jù),在虛擬機(jī)轉(zhuǎn)移后,SnowFlock在復(fù)制克隆中所需的其他數(shù)據(jù)。這有兩個(gè)好處,首先,它最大限度地減少了工作量,盡可能實(shí)例化延遲加載。其次,它只復(fù) 制真正使用的狀態(tài)數(shù)據(jù),實(shí)際上是提高了虛擬機(jī)克隆的效率。當(dāng)然,這樣做的好處取決于克隆的行為,但少量的應(yīng)用程序需要訪問內(nèi)存和在本地文件系統(tǒng)的每個(gè)文件的每一頁時(shí)就效果不大了。

然而,延時(shí)復(fù)制的好處不是免費(fèi)的。由于狀態(tài)轉(zhuǎn)移被推遲到最后,需要在狀態(tài)到達(dá)時(shí),才能繼續(xù)執(zhí)行克隆。在時(shí)間共享工作站內(nèi)將內(nèi)存交換到磁盤,而并行的應(yīng)用程序從高延遲的數(shù)據(jù)源獲取狀態(tài)可能被阻塞。在SnowFlock的用例中,這些阻塞降低了克隆的性能,其嚴(yán)重程度取決于應(yīng)用程序。對(duì)于高性能計(jì)算應(yīng)用,我們已經(jīng)發(fā)現(xiàn)這種退化的影響不大,但可能會(huì)首先克隆的數(shù)據(jù)庫服務(wù)器性能。應(yīng)當(dāng)指出的是,這是一個(gè)瞬態(tài)影響:在幾分鐘之內(nèi),大多數(shù)必要的狀態(tài)已被轉(zhuǎn)移且性能父節(jié)點(diǎn)匹配。

順便說一句,如果你熟悉虛擬機(jī),你可能考慮在這里使用實(shí)時(shí)遷移的優(yōu)化。實(shí)時(shí)遷移的優(yōu)化,可以縮短原始虛擬機(jī)的暫停和恢復(fù)執(zhí)行新副本之間的間隔。要做到這一點(diǎn),虛擬機(jī)監(jiān)視器(VMM)需要在父節(jié)點(diǎn)仍在運(yùn)行時(shí)預(yù)拷貝它的狀態(tài),從而使只有最近更改過的頁才遷移。這項(xiàng)技術(shù)不會(huì)影響之間的遷移要求和副本開始執(zhí)行的時(shí)間間隔,因此不會(huì)降低虛擬機(jī)克隆的實(shí)例化延遲。

18.3 SnowFlock的實(shí)現(xiàn)方法

SnowFlock實(shí)現(xiàn)虛擬機(jī)克隆被稱為“虛擬機(jī)fork”,這就像標(biāo)準(zhǔn)的Unix系統(tǒng)調(diào)用fork一樣,但有幾個(gè)重要的差異。第一,系統(tǒng)調(diào)用fork是復(fù)制一個(gè)單一的進(jìn)程,虛擬機(jī)fork重復(fù)整個(gè)虛擬機(jī),包括所有的內(nèi)存,所有的進(jìn)程和虛擬設(shè)備,以及本地文件系統(tǒng)。第二,系統(tǒng)調(diào)用fork是產(chǎn)生在同一物理主機(jī)上運(yùn)行的單個(gè)副本,虛擬機(jī)fork可以同時(shí)產(chǎn)生多個(gè)并行備份。最后,虛擬機(jī)可以被復(fù)制到不同的物理服務(wù)器,讓你迅速提高云服務(wù)的需要。

以下是SnowFlock中的核心概念:

? 虛擬化:虛擬機(jī)封裝了計(jì)算環(huán)境,使機(jī)器復(fù)制和云服務(wù)成為可能。

? 延遲傳播:直到需要的時(shí)候才復(fù)制虛擬機(jī)的狀態(tài),虛擬機(jī)克隆在幾秒鐘內(nèi)生成。

? 組播:諸多的虛擬機(jī)克隆有著類似的狀態(tài)需求。通過多播,幾十個(gè)虛擬機(jī)克隆可以盡快執(zhí)行。

? 頁故障:當(dāng)一個(gè)克隆使用了無效的內(nèi)存空間,這一故障將觸發(fā)一個(gè)請(qǐng)求到父節(jié)點(diǎn),直到所需的內(nèi)存頁可用了,才繼續(xù)執(zhí)行克隆操作。

? 寫復(fù)制(COW):在虛擬機(jī)克隆生成前,父虛擬機(jī)先保留一個(gè)當(dāng)前內(nèi)存和磁盤頁的副本,在保留虛擬機(jī)克隆所需的狀態(tài)同時(shí)可以繼續(xù)運(yùn)行。

我們使用Xen虛擬化系統(tǒng)來實(shí)現(xiàn)的SnowFlock,所以弄清一些Xen的專用術(shù)語是非常有用的。在Xen環(huán)境中,VMM被稱為虛擬機(jī)管理程序,虛擬機(jī)被稱為域。在每臺(tái)物理機(jī)(主機(jī))說,是一個(gè)特權(quán)域,稱為“域0(dom0),每個(gè)特權(quán)域能夠完整地訪問主機(jī)及其物理設(shè)備。如果虛擬機(jī)被用來控制額外的“訪問者”或“用戶”,則被稱為“域U”(domU)。

廣義而言,SnowFlock包括一套修改了的Xen虛擬機(jī)管理程序(使其在無效資源被訪問時(shí)能夠順利恢復(fù)),一組運(yùn)行在dom0上的支持進(jìn)程和系統(tǒng)服務(wù)包括無效虛擬機(jī)狀態(tài)的合作遷移,以及一些虛擬機(jī)克隆中OS修改,由六個(gè)主要組成部分 。

? 虛擬機(jī)描述器:這個(gè)小對(duì)象是虛擬機(jī)克隆的抽象描述,描述了需要開始執(zhí)行的虛擬機(jī)基本框架。它沒有需要執(zhí)行任何實(shí)際工作血肉。

? 組播分發(fā)系統(tǒng)(mcdist):這是父節(jié)點(diǎn)系統(tǒng),能夠同時(shí)向所有克隆有效地發(fā)布虛擬機(jī)的狀態(tài)信息。

? 內(nèi)存服務(wù)器進(jìn)程:父節(jié)點(diǎn)服務(wù)器進(jìn)程中維護(hù)了父節(jié)點(diǎn)狀態(tài)的多個(gè)副本,并使其根據(jù)需求通過多播mcdist發(fā)布給所有克隆。

? Memtap進(jìn)程:一個(gè)虛擬機(jī)克隆端的進(jìn)程,與內(nèi)存服務(wù)器通信請(qǐng)求那些克隆所需要但又缺失的內(nèi)存頁。

? 克隆提示器:運(yùn)行在克隆內(nèi)的guest內(nèi)核,通過為VMM提供線索來按需減少虛擬機(jī)狀態(tài)的遷移。盡管是可選的,卻是高效的。

? 控制棧:運(yùn)行在每個(gè)物理主機(jī)上得守護(hù)進(jìn)程,協(xié)調(diào)其他組件以及管理SnowFlock的父節(jié)點(diǎn)和虛擬機(jī)克隆。

圖18.1:SnowFlock 虛擬機(jī)復(fù)制架構(gòu)

如圖所示,圖18.1描繪克隆一個(gè)虛擬機(jī)的過程,主要有四個(gè)主要步驟:(1)暫停父虛擬機(jī)并產(chǎn)生一個(gè)虛擬機(jī)描述器;(2)將虛擬機(jī)描述器分發(fā)到所有目標(biāo)主機(jī)(3)克隆初始化;(4)按需加載狀態(tài)。該圖還描述了使用mcdist 進(jìn)行組播分發(fā)的方法,并取通過訪問啟示避免相關(guān)問題 。

如果你有興趣嘗試SnowFlock,這里有兩種方法。多倫多大學(xué)SnowFlock研究項(xiàng)目組提供了文文檔和開放的源代碼1, . 如果您愿意采用一個(gè)工業(yè)化的版本,可以從GridCentric公司2 獲得一個(gè)免費(fèi)的非商業(yè)許可證.由于SnowFlock包括hypervisor的修改和dom0的訪問的,所以安裝SnowFlock需要對(duì)主機(jī)的訪問權(quán)限。出于這個(gè)原因,你需要使用自己的硬件,將不能使用如亞馬遜的EC2云環(huán)境等商業(yè)云服務(wù)。

在接下來的幾節(jié)中,我們將描述瞬時(shí)實(shí)現(xiàn)和高效克隆的協(xié)同工作。我們將所以地內(nèi)容結(jié)合在一起,如圖18.2所示 。

圖18.2:SnowFlock的的軟件組件

18.4 構(gòu)建虛擬機(jī)描述器

SnowFlock的設(shè)計(jì)關(guān)鍵是決定推遲虛擬機(jī)的狀態(tài)復(fù)制到一個(gè)延遲運(yùn)行操作。換句話說,復(fù)制虛擬機(jī)的內(nèi)存是后期綁定操作,從而為優(yōu)化的許多機(jī)會(huì)。

第一步的設(shè)計(jì)決定是生成虛擬機(jī)狀態(tài)的架構(gòu)描述器。這是將用于創(chuàng)建克隆虛擬機(jī)的種子。它包含了創(chuàng)建一個(gè)虛擬機(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時(shí)間戳等.我們推薦有興趣的讀者可以參考[LCWB +11 ]架構(gòu)描述器的內(nèi)容來深入理解。

一個(gè)架構(gòu)描述器有三個(gè)重要的屬性:首先,它可以在短時(shí)間內(nèi)創(chuàng)建200毫秒的情況并不少見。其次,它是小的,通常是小于原虛擬機(jī)的內(nèi)存分配三個(gè)數(shù)量級(jí)(1 MB為1 GB的虛擬機(jī))。第三,從一個(gè)描述符創(chuàng)建克隆虛擬機(jī)可以在一秒鐘之內(nèi)(通常為800毫秒)。

當(dāng)然,主要的時(shí)間開銷是從描述他們的記憶狀態(tài)創(chuàng)建克隆虛擬機(jī)全部的時(shí)間。以下各節(jié)我們說明如何解決這個(gè)問題,如何利用優(yōu)勢(shì),并提出優(yōu)化的機(jī)會(huì)。

18.5父節(jié)點(diǎn)組件

一旦被克隆的虛擬機(jī)成為一個(gè)父節(jié)點(diǎn), 就和所有其他父節(jié)點(diǎn)一樣,它需要為子節(jié)點(diǎn)提供克隆服務(wù)。父節(jié)點(diǎn)是通過維護(hù)一套內(nèi)存和磁盤狀態(tài),克隆的集會(huì),為克隆虛擬機(jī)提供按需服務(wù)。

18.5.1 memserver進(jìn)程

當(dāng)創(chuàng)建架構(gòu)描述器的時(shí)候,虛擬機(jī)將在進(jìn)程中停止。這保證了虛擬機(jī)的內(nèi)存狀態(tài)穩(wěn)定;在暫停虛擬機(jī)并執(zhí)行調(diào)度或取消調(diào)度前,內(nèi)部OS驅(qū)動(dòng)程序處于停頓狀態(tài),從克隆可以重新連接到外部網(wǎng)絡(luò)。我們采取這種靜止?fàn)顟B(tài)的優(yōu)勢(shì)來創(chuàng)建一個(gè)“內(nèi)存服務(wù)器”即memserver。

內(nèi)存服務(wù)器將提供克隆虛擬機(jī)所需的所有父節(jié)點(diǎn)內(nèi)存數(shù)據(jù)。內(nèi)存轉(zhuǎn)移是以x86的內(nèi)存頁(4字節(jié))為粒度單位的。最簡(jiǎn)單的形式是內(nèi)存服務(wù)器等待來自克隆的內(nèi)存頁請(qǐng)求,在一個(gè)時(shí)間上為一個(gè)克隆提供一個(gè)內(nèi)存頁的轉(zhuǎn)移。

然而,這些需要轉(zhuǎn)移的內(nèi)存在父虛擬機(jī)中需要繼續(xù)使用并執(zhí)行。如果我們?cè)试S父節(jié)點(diǎn)去修改這個(gè)內(nèi)存,那將會(huì)以損壞的內(nèi)存內(nèi)容克隆虛擬機(jī):內(nèi)存供應(yīng)將是從不同的克隆點(diǎn)完成的,使克隆容易混淆。以破解內(nèi)核的詞匯來說,這是一個(gè)堆棧信息跟蹤的問題。

為了克服這個(gè)問題,采用經(jīng)典的操作系統(tǒng)概念來救援:Copy-on-Write, 即CoW memory.。通過輔助的Xen hypervisor,我們可以移除父虛擬機(jī)的所有內(nèi)存頁寫入權(quán)限。當(dāng)父節(jié)點(diǎn)試圖修改一個(gè)內(nèi)存頁,將觸發(fā)硬件內(nèi)存頁錯(cuò)誤。Xen通過頁面的副本知道這種情況發(fā)生的原因。父虛擬機(jī)允許寫入到原來的頁面,并繼續(xù)執(zhí)行,而被告知使用原來的副本,這就是保持只讀的內(nèi)存服務(wù)器。在這種方式下,被克隆的內(nèi)存狀態(tài)仍然凍結(jié),且不混淆,而父節(jié)點(diǎn)能夠繼續(xù)執(zhí)行。CoW的開銷是最小的:Linux使用了類似的機(jī)制,如創(chuàng)建一個(gè)新的進(jìn)程。

18.5.2 Multicast與Mcdist

克隆通常存在被稱為“命運(yùn)的決定”的問題。 我們希望創(chuàng)建克隆是為了一個(gè)單一的目的:例如,相對(duì)于Y調(diào)整一個(gè)數(shù)據(jù)庫的DNA中X鏈。此外,我們期望要?jiǎng)?chuàng)建一套克隆,使所有的兄弟姐妹做的一樣,也許對(duì)數(shù)據(jù)庫的不同部分對(duì)準(zhǔn)相同的X鏈,或調(diào)整不同的鏈對(duì)準(zhǔn)Y鏈,從而明確地表現(xiàn)為大量?jī)?nèi)存訪問的時(shí)間局部性:他們將使用相同的代碼和大部分常見的數(shù)據(jù)。

我們利用時(shí)間局部性,為SnowFlock量身定制了自己的組播分發(fā)系統(tǒng)—— mcdist。mcdist使用IP組播,同時(shí)為接收器集合分發(fā)相同的數(shù)據(jù)包。它利用網(wǎng)絡(luò)硬件并行處理的優(yōu)勢(shì)減少了內(nèi)存的服務(wù)器上的負(fù)載。因?yàn)樗锌寺【哂蓄愃频膬?nèi)存訪問模式,通過對(duì)所有克隆的第一個(gè)要求發(fā)送一個(gè)應(yīng)答,每個(gè)克隆的要求被作為它的兄弟姐妹預(yù)處理。

不像其他的組播系統(tǒng),mcdist并不一定是可靠的,沒有以一個(gè)有序的方式提供數(shù)據(jù)包,也沒有以原子方式提供所有擬接收的應(yīng)答。組播是嚴(yán)格意義上的優(yōu)化,并確??寺∶鞔_請(qǐng)求內(nèi)存頁的需要。因此,該設(shè)計(jì)優(yōu)雅簡(jiǎn)單:簡(jiǎn)單的服務(wù)器多播的響應(yīng),而因?yàn)榭蛻舳顺瑫r(shí),當(dāng)克隆沒有收到一個(gè)請(qǐng)求的答復(fù)時(shí)重新請(qǐng)求。

SnowFlock的三個(gè)優(yōu)化都體現(xiàn)在mcdist上:

? 一致性檢測(cè):當(dāng)時(shí)間局部性發(fā)生時(shí),多個(gè)無差別請(qǐng)求都非常密切的繼承在同一頁。mcdist服務(wù)器忽略所有除第一個(gè)以外的請(qǐng)求。

? 流量控制:接收器的獲取率與請(qǐng)求相關(guān)。服務(wù)器的發(fā)送率取決于客戶端接受率的加權(quán)平均。否則,接收器將會(huì)淹沒在服務(wù)器發(fā)送過多的內(nèi)存頁中。

? 游戲結(jié)束:當(dāng)服務(wù)器已經(jīng)發(fā)送了大多數(shù)頁面時(shí),將回到單播響應(yīng)。在這一時(shí)間點(diǎn)上的大多數(shù)請(qǐng)求是重試,從而通過網(wǎng)絡(luò)的內(nèi)存頁轟炸所有克隆是不必要的。

18.5.3虛擬磁盤

SnowFlock的克隆,由于其短壽命和命運(yùn)決定,很少使用的磁盤。SnowFlock 虛擬機(jī)的虛擬磁盤包括了二進(jìn)制文件,庫和配置文件的根分區(qū)。通過合適的文件系統(tǒng)如HDFS 或PVFS 是完成大量的數(shù)據(jù)處理。因此,當(dāng)SnowFlock克隆決定從他們的根磁盤讀取數(shù)據(jù)時(shí),它們通常由內(nèi)核的文件系統(tǒng)頁面緩存來滿足這樣要求。 盡管如此,我們?nèi)孕杼峁┛寺〉奶摂M磁盤訪問,在一些罕見的實(shí)例中這種訪問需求是需要的。我們?cè)谶@里采用了最小阻力路徑,依據(jù)內(nèi)存復(fù)制的設(shè)計(jì)來實(shí)現(xiàn)虛擬磁盤訪問。首先,在克隆的時(shí)間里磁盤的狀態(tài)被凍結(jié)。父虛擬機(jī)保持以CoW的方式使用其磁盤:對(duì)存儲(chǔ)備份的寫操作被發(fā)送到單獨(dú)的位置,在磁盤克隆時(shí)也是不可改變的。二,磁盤的狀態(tài)將使用 mcdist組播到所有克隆,且具有相同的4 KB頁的粒度,并根據(jù)時(shí)間局部性完成相同的期望。第三,嚴(yán)格復(fù)制克隆虛擬機(jī)的磁盤狀態(tài)是短暫的:它存儲(chǔ)在一個(gè)文件中,當(dāng)克隆被摧毀后被刪除。

18.6克隆端組件

克隆在從架構(gòu)描述器創(chuàng)建時(shí)是空心彈,和我們一樣,他們需要從父母那里獲得很大的幫助才能長(zhǎng)大:子虛擬機(jī)們遷出時(shí)要立即給家里打電話,他們發(fā)現(xiàn)很多需要的東西缺失,要求他們的父母馬上發(fā)送。

18.6.1 memtap進(jìn)程

memtap進(jìn)程連接到每個(gè)創(chuàng)建后的克隆,是一個(gè)克隆的生命線。它映射到克隆的所有內(nèi)存并按需加載。通過Xen的hypervisor,它登記了一些關(guān)鍵的數(shù)據(jù)位:訪問克隆內(nèi)存的權(quán)限被關(guān)閉,由第一次訪問一個(gè)內(nèi)存頁造成的硬件故障由hypervisor路由到memtap進(jìn)程。

在其最簡(jiǎn)單的化身中,memtap進(jìn)程只需簡(jiǎn)單地要求內(nèi)存的服務(wù)器處理錯(cuò)誤內(nèi)存頁,但也有更復(fù)雜的情況。首先,memtap助手使用了mcdist。這意味著,在任何時(shí)間點(diǎn),任何頁面可以憑借已被另一個(gè)克隆的異步預(yù)取請(qǐng)求到達(dá)克隆。第二,我們?cè)试SSnowFlock虛擬機(jī)是多處理器的虛擬機(jī)。這就不那么有趣了。這意味著,在并行處理時(shí)存在同一頁的多個(gè)故障需要。第三,在以后的版本中,memtap助手可以明確地預(yù)取批量的內(nèi)存頁,在缺乏保證情況下,以任何次序從mcdist服務(wù)器到達(dá)克隆。這些因素可能導(dǎo)致并發(fā)噩夢(mèng),我們遇到了所有這些問題。

內(nèi)存頁位圖是整個(gè)memtap的設(shè)計(jì)中心。當(dāng)處理架構(gòu)描述器創(chuàng)建克隆虛擬機(jī)時(shí),創(chuàng)建和初始化該位圖。該位圖是一個(gè)比特?cái)?shù)組,其大小由虛擬機(jī)內(nèi)存可容納的內(nèi)存頁數(shù)量決定。英特爾處理器有方便的原子位互斥指令:設(shè)置了一個(gè)比特,或做一個(gè)測(cè)試和設(shè)置,可以保證原子發(fā)生與其他處理器在同一個(gè)盒子里。這使得我們?cè)诖蠖鄶?shù)情況下,從而提供不同的實(shí)體,在不同的保護(hù)域的訪問位圖以避免鎖:Xen管理程序,memtap進(jìn)程,以及guest內(nèi)核本身的克隆。

當(dāng)Xen的處理由第一次訪問頁面產(chǎn)生的硬件頁錯(cuò)誤時(shí),它使用內(nèi)存頁位圖來決定是否需要提醒 memtap。它還使用該位圖依賴于不在同一頁的多個(gè)虛擬處理器來隊(duì)列化memtap緩沖頁。當(dāng)其緩沖區(qū)是滿的,或到達(dá)一個(gè)明確請(qǐng)求的內(nèi)存頁時(shí)暫停虛擬機(jī),位圖被用來丟棄那些已經(jīng)到達(dá)的任何重復(fù)的已經(jīng)存在內(nèi)存頁。所需的任何剩余內(nèi)存頁被復(fù)制到虛擬機(jī)的內(nèi)存,并設(shè)置適當(dāng)?shù)奈粓D比特。

18.6.2 明智的克隆,避免不必要的提取

我們剛剛提到,運(yùn)行于克隆內(nèi)核的該內(nèi)存頁位圖是可見的,并沒有鎖,需要修改。這給克隆提供了一個(gè)強(qiáng)大的“啟蒙”工具:它們可以防止通過修改位圖和假裝已經(jīng)存在的是當(dāng)前內(nèi)存頁的抓取。這是非常有用的性能,在內(nèi)存頁沒有完全覆蓋之前,他們都可以被安全使用。

恰好是一個(gè)非常普遍的情況,當(dāng)發(fā)生這種情況,并獲取可避免。在內(nèi)核中的所有內(nèi)存分配(虛擬機(jī)alloc的使用 ,kzalloc,get_free_page,用戶空間的BRK,等等)最終處理內(nèi)核頁分配器。內(nèi)存頁通常由中間開始分配,管理細(xì)粒度塊要求是:slab分配器,glibc在一個(gè)用戶空間進(jìn)程的malloc分配,等等。然而,無論是顯式或隱式的分配,一個(gè)關(guān)鍵的語法含義始終正確:沒有人關(guān)注內(nèi)存頁中包含的內(nèi)容,因?yàn)樗膬?nèi)容將隨時(shí)被覆蓋。為什么取這樣一個(gè)內(nèi)存頁呢?沒有任何理由這樣做,實(shí)際經(jīng)驗(yàn)表明,避免這種獲取方式是極其有利的。

18.7虛擬機(jī)克隆的應(yīng)用程序接口

到目前為止,我們都集中一個(gè)虛擬機(jī)有效克隆的內(nèi)部機(jī)制。作為服務(wù)系統(tǒng)非常有趣,所以我們需要把注意力放在誰將使用這樣的系統(tǒng):應(yīng)用。

18.7.1。API實(shí)現(xiàn)

通過簡(jiǎn)單的SnowFlock API(如圖18.1所示),應(yīng)用程序可以利用虛擬機(jī)克隆。利用克隆的方式基本上是一個(gè)兩階段的過程。你第一次請(qǐng)求分配一個(gè)克隆實(shí)例,雖然依賴于系統(tǒng)策略的影響,分配的實(shí)例可能會(huì)小于所請(qǐng)求的內(nèi)容。第二,你可以使用分配給你的虛擬機(jī)克隆。一個(gè)關(guān)鍵的假設(shè)是你的重點(diǎn)聚焦于虛擬機(jī)上一個(gè)操作。虛擬機(jī)克隆是適用于單一應(yīng)用的虛擬機(jī),如Web服務(wù)器或一個(gè)渲染工廠組件。如果你在一百多個(gè)桌面環(huán)境進(jìn)程中的多個(gè)應(yīng)用程序同時(shí)調(diào)用虛擬機(jī)克隆,你就頭大了。

sf_request_ticket(N) 請(qǐng)求分配n個(gè)克隆。返回一個(gè)分配M≤N 克隆的ticket。

sf_clone(ticket) 使用的ticket分配克隆。返回克隆ID,0≤ID

sf_checkpoint_parent() 準(zhǔn)備一個(gè)檢查點(diǎn)?不可改變的父虛擬機(jī),可用于以后任意創(chuàng)建克隆。

sf_create_clones(C,門票) 與sf_clone相同,只是使用檢查點(diǎn)?。在哪個(gè)對(duì)應(yīng)點(diǎn)開始執(zhí)行

sf_checkpoint_parent()時(shí)調(diào)用克隆。

sf_exit() 終止子克隆(1≤ID

sf_join(ticket) 父節(jié)點(diǎn)使用(ID = 0),塊,直到所有使用ticket的子節(jié)點(diǎn)調(diào)用sf_exit前一直處于阻塞狀態(tài)。在這一時(shí)間點(diǎn)上,所有的子節(jié)點(diǎn)都被終止和ticket被棄用。

sf_kill(ticket) 家長(zhǎng)棄用ticket票,并立即殺死所有相關(guān)的子節(jié)點(diǎn)進(jìn)程。

表18.1:SnowFlock虛擬機(jī)克隆API

API簡(jiǎn)化了編組消息,同時(shí)傳遞給XenStore,Xen通過共享內(nèi)存的低吞吐量接口來控制平面交易。在hypervisor上運(yùn)行的一個(gè)SnowFlock本地守護(hù)進(jìn)程(SFLD)執(zhí)行監(jiān)聽這樣的請(qǐng)求,包括消息解組,執(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í)行請(qǐng)求。他們創(chuàng)建和傳輸架構(gòu)描述器,創(chuàng)建克隆的虛擬機(jī),啟動(dòng)磁盤和內(nèi)存的服務(wù)器,并啟動(dòng)memtap輔助進(jìn)程。他們是分布在一個(gè)物理集群系統(tǒng)上負(fù)責(zé)管理虛擬機(jī)的一個(gè)微型發(fā)布系統(tǒng)。

SFLDs推遲分配的決策給一個(gè)集中SnowFlock的主守護(hù)進(jìn)程(SFMD)。SFMD使用相應(yīng)的集群管理軟件簡(jiǎn)化了接口。我們沒有看到任何需求需要推倒重來,包括資源分配,配額,策略等,例如Sun的網(wǎng)格引擎或平臺(tái)的EGO等都是適合的。

18.7.2必要的突變

克隆后,大多數(shù)克隆的虛擬機(jī)進(jìn)程不再是父節(jié)點(diǎn),而且他們現(xiàn)在運(yùn)行在一個(gè)副本上。在大多數(shù)情況下,這是正常的,沒有問題。畢竟,操作系統(tǒng)的主要任務(wù)是從低層次的細(xì)節(jié)(如網(wǎng)絡(luò)標(biāo)識(shí))隔離應(yīng)用程序。然而,平穩(wěn)過渡需要一套有效的機(jī)制。如果管理在克隆的網(wǎng)絡(luò)身份以避免沖突和混亂,我們就必須引入在克隆過程中的輕微突變。此外,因?yàn)檫@些調(diào)整可能需要更高級(jí)別的權(quán)限,所以允許用戶配置一個(gè)鉤子程序來插入到任何必要的任務(wù)中,例如依靠克隆的身份安裝網(wǎng)絡(luò)文件系統(tǒng)。

克隆的產(chǎn)生有可能是不必要的。盡管父虛擬機(jī)可能是由DHCP服務(wù)器管理的網(wǎng)絡(luò)的一部分,或系統(tǒng)管理員通過其他各種途徑能夠做到克隆的IP地址分配。為了保持靈活的應(yīng)用場(chǎng)景,我們將父節(jié)點(diǎn)和所有克隆置于虛擬的私有網(wǎng)絡(luò)中。從同一父節(jié)點(diǎn)的克隆都分配一個(gè)唯一的ID,他們的IP地址在這個(gè)私有網(wǎng)絡(luò)中被自動(dòng)設(shè)置后,克隆的ID生效。這保證了不需要系統(tǒng)管理員的干預(yù)參與,而且沒有IP地址沖突。

我們通過一個(gè)鉤子程序在虛擬的網(wǎng)絡(luò)驅(qū)動(dòng)程序直接對(duì)IP進(jìn)行重新配置。然而,我們也催動(dòng)驅(qū)動(dòng)程序自動(dòng)生成合成的DHCP響應(yīng)。因此,無論你如何分發(fā),虛擬的網(wǎng)絡(luò)接口將確保正確的IP地址傳播到客戶機(jī)操作系統(tǒng),甚至當(dāng)你重新啟動(dòng)主機(jī)是都可以。

為了防止來自不同父母的克隆碰撞以及隔離彼此的虛擬專用網(wǎng)絡(luò),可以防止相互DDoS攻擊克隆虛擬網(wǎng)絡(luò)的以太網(wǎng)(或第二層交換)。我們劫持了以太網(wǎng)MAC OUIs范圍3,奉獻(xiàn)他們的克隆。OUI將是一個(gè)父虛擬機(jī)的功能。像通過一個(gè)虛擬機(jī)的ID確定其IP地址一樣,這同樣決定了其非OUI的以太網(wǎng)MAC地址。虛擬的網(wǎng)絡(luò)驅(qū)動(dòng)器具有將虛擬機(jī)的MAC地址轉(zhuǎn)換成它所分配虛擬機(jī)ID的功能,過濾出所有虛擬專用網(wǎng)絡(luò)與不同OUI們的流量。這種隔離是通過 ebtables簡(jiǎn)單實(shí)現(xiàn)的。

讓彼此克隆間通信可能是有趣的,但不是情趣盎然。有時(shí)我們會(huì)想讓克隆響應(yīng)來自互聯(lián)網(wǎng)的HTTP請(qǐng)求,或連接公共數(shù)據(jù)倉庫。我們?yōu)樘摂M機(jī)的任何一套父節(jié)點(diǎn)和克隆配備一個(gè)專用的路由器。這個(gè)路由器的小虛擬機(jī)執(zhí)行從克隆到互聯(lián)網(wǎng)的防火墻,節(jié)流和NAT的功能。這也限制了父虛擬機(jī)的接入連接和眾所周知的端口。路由器的虛擬機(jī)是輕量級(jí)的,但代表了網(wǎng)絡(luò)流量的集中化,從而嚴(yán)重限制了可伸縮性的單點(diǎn)。相同的網(wǎng)絡(luò)規(guī)則,可用于每個(gè)克隆虛擬機(jī)運(yùn)行主機(jī)的一個(gè)分布式環(huán)境。我們還沒有發(fā)布這個(gè)實(shí)驗(yàn)室補(bǔ)丁。

SFLDs分配了虛擬機(jī)ID,并指導(dǎo)虛擬網(wǎng)絡(luò)驅(qū)動(dòng)程序應(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)生幾十個(gè)運(yùn)行中的虛擬機(jī)克隆。SnowFlock克隆虛擬機(jī)的瞬時(shí)性和熱加載極大地改善了自動(dòng)化集群管理的可用性和為應(yīng)用提供云資源的更大可編程性。SnowFlock也提高了云的靈活性,虛擬機(jī)實(shí)例加快了20倍,并通過利用他們的父節(jié)點(diǎn)內(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)識(shí)到整個(gè)SnowFlock經(jīng)歷了兩個(gè)重要的教訓(xùn)。首先是經(jīng)常被低估的價(jià)值KISS定理。我們期待實(shí)現(xiàn)復(fù)雜的預(yù)取技術(shù),以減輕一連串的內(nèi)存頁在克隆啟動(dòng)時(shí)會(huì)發(fā)出的請(qǐng)求。令人驚訝的是這也許沒有必要。該系統(tǒng)作為以一個(gè)單一原則為基礎(chǔ)的許多工作有很好的表現(xiàn):只是帶來了超出需要的內(nèi)存。簡(jiǎn)單化的另一個(gè)例子是內(nèi)存頁位圖。通過一個(gè)簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)和清晰的原子訪問語義,這大大簡(jiǎn)化了由于多個(gè)虛擬CPU,頁面更新的競(jìng)爭(zhēng),通過多播的異步頁到達(dá)等可能產(chǎn)生的并發(fā)性問題。

第二個(gè)教訓(xùn)是規(guī)模不再是謊言。換句話說,你發(fā)現(xiàn)每次你都會(huì)碰到準(zhǔn)備切換系統(tǒng)和新出現(xiàn)瓶頸的規(guī)模性問題。這是緊密聯(lián)系在一起的教訓(xùn):隨著負(fù)載的增加,簡(jiǎn)單而優(yōu)雅的解決方案使規(guī)?;[藏了起來。這個(gè)原則的一個(gè)最好的例子是mcdist系統(tǒng)。在大規(guī)模的測(cè)試表明,一個(gè)以TCP / IP為基礎(chǔ)的頁面分配機(jī)制進(jìn)行數(shù)百克隆時(shí)經(jīng)常慘遭失敗。mcdist憑借其極端的分發(fā)機(jī)制和角色良好定義的獲得了成功:客戶只關(guān)心自己的內(nèi)存頁,服務(wù)器只關(guān)心維持一個(gè)全局的流量控制。保持mcdist優(yōu)雅簡(jiǎn)單,使SnowFlock能夠擴(kuò)展得非常好。

如果你有興趣了解更多,您可以訪問網(wǎng)站多倫多大學(xué)的網(wǎng)站1獲得在GPLv2授權(quán)許可下的學(xué)術(shù)論文和開放源碼,GridCentric 4為一個(gè)工業(yè)化的實(shí)現(xiàn)。

注:

  1. http://sysweb.cs.toronto.edu/projects/1

  2. http://www.gridcentriclabs.com/architecture-of-open-source-applications

  3. OUI:MAC地址分配的范圍。

  4. http://www.gridcentriclabs.com/
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)