中關於虛擬機器複製與遷移(中)
18.3 SnowFlock的實現方法
SnowFlock實現虛擬機器克隆被稱為“虛擬機器fork”,這就像標準的Unix系統呼叫fork一樣,但有幾個重要的差異。第一,系統呼叫fork是複製一個單一的程式,虛擬機器fork重複整個虛擬機器,包括所有的記憶體,所有的程式和虛擬裝置,以及本地檔案系統。第二,系統呼叫fork是產生在同一物理主機上執行的單個副本,虛擬機器fork可以同時產生多個並行備份。最後,虛擬機器可以被複制到不同的物理伺服器,讓你迅速提高雲服務的需要。
以下是SnowFlock中的核心概念:
· 虛擬化:虛擬機器封裝了計算環境,使機器複製和雲服務成為可能。
· 延遲傳播:直到需要的時候才複製虛擬機器的狀態,虛擬機器克隆在幾秒鐘內生成。
· 組播:諸多的虛擬機器克隆有著類似的狀態需求。通過多播,幾十個虛擬機器克隆可以儘快執行。
· 頁故障:當一個克隆使用了無效的記憶體空間,這一故障將觸發一個請求到父節點,直到所需的記憶體頁可用了,才繼續執行克隆操作。
· 寫複製(COW):在虛擬機器克隆生成前,父虛擬機器先保留一個當前記憶體和磁碟頁的副本,在保留虛擬機器克隆所需的狀態同時可以繼續執行。
我們使用Xen虛擬化系統來實現的SnowFlock,所以弄清一些Xen的專用術語是非常有用的。在Xen環境中,VMM被稱為虛擬機器管理程式,虛擬機器被稱為域。在每臺物理機(主機)說,是一個特權域,稱為“域0(dom0),每個特權域能夠完整地訪問主機及其物理裝置。如果虛擬機器被用來控制額外的“訪問者”或“使用者”,則被稱為“域U”(domU)。
廣義而言,SnowFlock包括一套修改了的Xen虛擬機器管理程式(使其在無效資源被訪問時能夠順利恢復),一組執行在dom0上的支援程式和系統服務包括無效虛擬機器狀態的合作遷移,以及一些虛擬機器克隆中OS修改,由六個主要組成部分。
· 虛擬機器描述器:這個小物件是虛擬機器克隆的抽象描述,描述了需要開始執行的虛擬機器基本框架。它沒有需要執行任何實際工作血肉。
· 組播分發系統(mcdist):這是父節點系統,能夠同時向所有克隆有效地釋出虛擬機器的狀態資訊。
· 記憶體伺服器程式:父節點伺服器程式中維護了父節點狀態的多個副本,並使其根據需求通過多播mcdist釋出給所有克隆。
· Memtap程式:一個虛擬機器克隆端的程式,與記憶體伺服器通訊請求那些克隆所需要但又缺失的記憶體頁。
· 克隆提示器:執行在克隆內的guest核心,通過為VMM提供線索來按需減少虛擬機器狀態的遷移。儘管是可選的,卻是高效的。
· 控制棧:執行在每個物理主機上得守護程式,協調其他元件以及管理SnowFlock的父節點和虛擬機器克隆。
圖18.1:SnowFlock
虛擬機器複製架構
如圖所示,圖18.1描繪克隆一個虛擬機器的過程,主要有四個主要步驟:(1)暫停父虛擬機器併產生一個虛擬機器描述器;(2)將虛擬機器描述器分發到所有目標主機(3)克隆初始化;(4)按需載入狀態。該圖還描述了使用mcdist
進行組播分發的方法,並取通過訪問啟示避免相關問題 。
如果你有興趣嘗試SnowFlock,這裡有兩種方法。多倫多大學SnowFlock研究專案組提供了文文件和開放的原始碼1, .
如果您願意採用一個工業化的版本,可以從GridCentric公司2 獲得一個免費的非商業許可證.由於SnowFlock包括hypervisor的修改和dom0的訪問的,所以安裝SnowFlock需要對主機的訪問許可權。出於這個原因,你需要使用自己的硬體,將不能使用如亞馬遜的EC2雲環境等商業雲服務。
在接下來的幾節中,我們將描述瞬時實現和高效克隆的協同工作。我們將所以地內容結合在一起,如圖18.2所示 。
圖18.2:SnowFlock的的軟體元件
18.4 構建虛擬機器描述器
SnowFlock的設計關鍵是決定推遲虛擬機器的狀態複製到一個延遲執行操作。換句話說,複製虛擬機器的記憶體是後期繫結操作,從而為優化的許多機會。
第一步的設計決定是生成虛擬機器狀態的架構描述器。這是將用於建立克隆虛擬機器的種子。它包含了建立一個虛擬機器的最低必要條件,使其可以被排程。顧名思義,這一必要條件是由架構規範所需要的資料結構組成。在SnowFlock中,該架構是Intel
x86處理器和Xen的結合。因此,架構的描述包含資料結構,如頁表,虛擬暫存器,裝置後設資料,wallclock時間戳等.我們推薦有興趣的讀者可以參考[LCWB
+11 ]架構描述器的內容來深入理解。
一個架構描述器有三個重要的屬性:首先,它可以在短時間內建立200毫秒的情況並不少見。其次,它是小的,通常是小於原虛擬機器的記憶體分配三個數量級(1 MB為1
GB的虛擬機器)。第三,從一個描述符建立克隆虛擬機器可以在一秒鐘之內(通常為800毫秒)。
當然,主要的時間開銷是從描述他們的記憶狀態建立克隆虛擬機器全部的時間。以下各節我們說明如何解決這個問題,如何利用優勢,並提出優化的機會。
18.5父節點元件
一旦被克隆的虛擬機器成為一個父節點,
就和所有其他父節點一樣,它需要為子節點提供克隆服務。父節點是通過維護一套記憶體和磁碟狀態,克隆的集會,為克隆虛擬機器提供按需服務。
18.5.1 memserver程式
b當建立架構描述器的時候,虛擬機器將在程式中停止。這保證了虛擬機器的記憶體狀態穩定;在暫停虛擬機器並執行排程或取消排程前,內部OS驅動程式處於停頓狀態,從克隆可以重新連線到外部網路。我們採取這種靜止狀態的優勢來建立一個“記憶體伺服器”即memserver。
記憶體伺服器將提供克隆虛擬機器所需的所有父節點記憶體資料。記憶體轉移是以x86的記憶體頁(4位元組)為粒度單位的。最簡單的形式是記憶體伺服器等待來自克隆的記憶體頁請求,在一個時間上為一個克隆提供一個記憶體頁的轉移。
然而,這些需要轉移的記憶體在父虛擬機器中需要繼續使用並執行。如果我們允許父節點去修改這個記憶體,那將會以損壞的記憶體內容克隆虛擬機器:記憶體供應將是從不同的克隆點完成的,使克隆容易混淆。以破解核心的詞彙來說,這是一個堆疊資訊跟蹤的問題。
為了克服這個問題,採用經典的作業系統概念來救援:Copy-on-Write,
即CoW memory.。通過輔助的Xen hypervisor,我們可以移除父虛擬機器的所有記憶體頁寫入許可權。當父節點試圖修改一個記憶體頁,將觸發硬體記憶體頁錯誤。Xen通過頁面的副本知道這種情況發生的原因。父虛擬機器允許寫入到原來的頁面,並繼續執行,而被告知使用原來的副本,這就是保持只讀的記憶體伺服器。在這種方式下,被克隆的記憶體狀態仍然凍結,且不混淆,而父節點能夠繼續執行。CoW的開銷是最小的:Linux使用了類似的機制,如建立一個新的程式。
18.5.2 Multicast與Mcdist
克隆通常存在被稱為“命運的決定”的問題。 我們希望建立克隆是為了一個單一的目的:例如,相對於Y調整一個資料庫的DNA中X鏈。此外,我們期望要建立一套克隆,使所有的兄弟姐妹做的一樣,也許對資料庫的不同部分對準相同的X鏈,或調整不同的鏈對準Y鏈,從而明確地表現為大量記憶體訪問的時間區域性性:他們將使用相同的程式碼和大部分常見的資料。
我們利用時間區域性性,為SnowFlock量身定製了自己的組播分發系統—— mcdist。mcdist使用IP組播,同時為接收器集合分發相同的資料包。它利用網路硬體並行處理的優勢減少了記憶體的伺服器上的負載。因為所有克隆具有類似的記憶體訪問模式,通過對所有克隆的第一個要求傳送一個應答,每個克隆的要求被作為它的兄弟姐妹預處理。
不像其他的組播系統,mcdist並不一定是可靠的,沒有以一個有序的方式提供資料包,也沒有以原子方式提供所有擬接收的應答。組播是嚴格意義上的優化,並確保克隆明確請求記憶體頁的需要。因此,該設計優雅簡單:簡單的伺服器多播的響應,而因為客戶端超時,當克隆沒有收到一個請求的答覆時重新請求。
SnowFlock的三個優化都體現在mcdist上:
· 一致性檢測:當時間區域性性發生時,多個無差別請求都非常密切的繼承在同一頁。mcdist伺服器忽略所有除第一個以外的請求。
· 流量控制:接收器的獲取率與請求相關。伺服器的傳送率取決於客戶端接受率的加權平均。否則,接收器將會淹沒在伺服器傳送過多的記憶體頁中。
· 遊戲結束:當伺服器已經傳送了大多數頁面時,將回到單播響應。在這一時間點上的大多數請求是重試,從而通過網路的記憶體頁轟炸所有克隆是不必要的。
18.5.3虛擬磁碟
SnowFlock的克隆,由於其短壽命和命運決定,很少使用的磁碟。SnowFlock
虛擬機器的虛擬磁碟包括了二進位制檔案,庫和配置檔案的根分割槽。通過合適的檔案系統如HDFS 或PVFS 是完成大量的資料處理。因此,當SnowFlock克隆決定從他們的根磁碟讀取資料時,它們通常由核心的檔案系統頁面快取來滿足這樣要求。
儘管如此,我們仍需提供克隆的虛擬磁碟訪問,在一些罕見的例項中這種訪問需求是需要的。我們在這裡採用了最小阻力路徑,依據記憶體複製的設計來實現虛擬磁碟訪問。首先,在克隆的時間裡磁碟的狀態被凍結。父虛擬機器保持以CoW的方式使用其磁碟:對儲存備份的寫操作被髮送到單獨的位置,在磁碟克隆時也是不可改變的。二,磁碟的狀態將使用 mcdist組播到所有克隆,且具有相同的4
KB頁的粒度,並根據時間區域性性完成相同的期望。第三,嚴格複製克隆虛擬機器的磁碟狀態是短暫的:它儲存在一個檔案中,當克隆被摧毀後被刪除。
相關文章
- KVM虛擬機器遷移概述虛擬機
- 虛擬機器遷移技術原理與應用虛擬機
- kvm之十二:虛擬機器遷移虛擬機
- KVM虛擬機器遷移(靜態)虛擬機
- KVM虛擬機器的冷遷移虛擬機
- openstack虛擬機器遷移的操作記錄虛擬機
- VMware Converter 遷移物理機到 esxi 虛擬機器虛擬機
- 關於虛擬機器的使用虛擬機
- 關於xshell無法連線虛擬機器中linux虛擬機Linux
- VMwareConverter遷移linux系統虛擬機器Linux虛擬機
- 複製VMware虛擬機器的後續操作虛擬機
- VM 虛擬機器linux從主機複製檔案到虛擬機器錯誤虛擬機Linux
- 使用DiskGenius工具來實現物理機遷移虛擬機器,實現虛擬化虛擬機
- 將VMware workstation中的Ubuntu虛擬機器遷移到ESXI7.0伺服器中Ubuntu虛擬機伺服器
- Dalvik虛擬機器、Java虛擬機器與ART虛擬機器虛擬機Java
- centos中安裝虛擬機器CentOS虛擬機
- Linux虛擬機器遷移後ping不通閘道器Linux虛擬機
- 關於openGauss中的虛擬索引索引
- VMware虛擬機器遷移到PVE虛擬機
- 虛擬機器模板製作虛擬機
- 在虛擬機器中安裝ftp虛擬機FTP
- vmware中ubuntu虛擬機器擴容Ubuntu虛擬機
- 虛擬機器中 Jenkins 搭CI虛擬機Jenkins
- vmware虛擬機器網路中斷虛擬機
- 在vmare中建立centos虛擬機器CentOS虛擬機
- Ubuntu 20.04.2 KVM虛擬機器動態遷移實現(下)Ubuntu虛擬機
- Ubuntu 20.04.2 KVM虛擬機器動態遷移實現(上)Ubuntu虛擬機
- 關於虛擬機器VM聯網問題虛擬機
- 面試中關於Java虛擬機器(jvm)的問題看這篇就夠了面試Java虛擬機JVM
- Nginx中關於虛擬主機的一點冷門知識Nginx
- 如何在 Cockpit 中管理虛擬機器KPI虛擬機
- 在安卓虛擬機器中安裝apk安卓虛擬機APK
- 在虛擬機器CentOS中安裝docker虛擬機CentOSDocker
- 虛擬機器中Linux中安裝VMware tool工具虛擬機Linux
- centos7下libety版本openstack動態遷移虛擬機器CentOS虛擬機
- mysql檔案複製遷移MySql
- PVE虛擬機器遷移至VMware平臺虛擬機
- 技術界中的虛擬機器、容器和沙箱的關係虛擬機