云與虛擬化
云計算是通過 Internet 服務的方式提供動態(tài)可伸縮資源的計算模式,經(jīng)過多年的發(fā)展已成為企業(yè) IT 技術的重要支撐。虛擬化是云計算的核心技術之一,將一臺計算機抽象為多臺邏輯計算機,即虛擬機,每個虛擬機是一個單獨安全的環(huán)境,可運行不同的操作系統(tǒng)且互不影響。虛擬化技術給資源使用和調(diào)度帶來了極大便利,云計算系統(tǒng)可以根據(jù)負載情況及時進行資源調(diào)度,在提升資源利用率的同時保證應用和服務不會因資源不足而影響服務質(zhì)量。然而虛擬化也是有代價的,對資源的抽象帶來了性能損失,這也是虛擬化一直致力解決的問題。虛擬化的資源抽象可以簡單劃分為三部分:CPU 虛擬化、內(nèi)存虛擬化和設備虛擬化。其中設備虛擬化已經(jīng)可以實現(xiàn)網(wǎng)絡、存儲等設備直通虛擬機,沒有性能損失;CPU 虛擬化在硬件特性的支持下,執(zhí)行普通指令性能與裸機相同;而內(nèi)存虛擬化相比裸機,仍然存在較大差異,是當下值得關注的問題。內(nèi)存虛擬化虛擬內(nèi)存:說到內(nèi)存虛擬化,就不得不提虛擬內(nèi)存的概念。早期的操作系統(tǒng)只有物理地址且空間有限,進程使用內(nèi)存時必須小心翼翼以避免覆蓋其他進程的內(nèi)存。為避免此問題,虛擬內(nèi)存的概念被抽象出來,保證每個進程都有一塊連續(xù)的、獨立的虛擬內(nèi)存空間。進程直接通過 VA(Virtual Address)使用內(nèi)存,CPU 訪存時發(fā)出的 VA 由硬件 MMU(Memory Management Unit)攔截并轉換為 PA(Physical Address),VA 到 PA 的映射使用頁表進行管理,MMU 在轉換時會自動查詢頁表。內(nèi)存虛擬化:與虛擬內(nèi)存的概念類似,一臺主機上的每個虛擬機認為自己獨占整個物理地址空間,因而需要對內(nèi)存再做一次抽象,即內(nèi)存虛擬化,保證每個虛擬機都有獨立的地址空間。這樣一來,在虛擬機和物理機中均有 VA 和 PA 的概念,即 GVA(Guest ?Virtual Address)和 GPA(Guest Physical Address),以及 HVA(Host Virtual Address)和 HPA(Host Physical Address)。虛擬機內(nèi)的程序使用的是GVA,最終需要轉換成 HPA。兩個 VA 到 PA( GVA 到 GPA 以及 HVA 到 HPA)的映射同樣使用頁表管理,GPA 到 HVA 一般是幾段連續(xù)的線性映射,由虛擬機的管理程序 VMM(Virtual Machine Monitor)進行管理。進程訪存需要從 VA 轉換成 PA,在引入內(nèi)存虛擬化后,轉換路徑發(fā)生了很大的變化。原本只需要將 VA 轉換為 PA,虛擬化后轉換過程變成 GVA -> GPA -> HVA -> HPA 。路徑變得更長更復雜之后,對于訪存的安全和性能都帶來了挑戰(zhàn),這兩點也是內(nèi)存虛擬化需要達到的目標:1)安全 ,即地址轉換的合法性,虛擬機不能訪問不屬于自己的內(nèi)存;2)性能,即地址轉換的高效性,包括轉換關系建立的開銷低,以及轉換過程本身的開銷低。經(jīng)典方案為達成內(nèi)存虛擬化的目標,已經(jīng)有很多虛擬化方案被提出,SPT(Shadow Page Table)和 EPT(Extended Page Table)是兩種典型的方案,也是大家最熟悉的方案。我們先以此為切入點,看看他們是如何工作的,然后再討論其他的虛擬化方案。SPT:由于最初的硬件只支持一層頁表轉換,直接用來轉換虛擬機或物理機上的 VA 到 PA 都無法完成 GVA 到 HPA 的轉換。因此 SPT 建立了一條捷徑,即影子頁表,直接管理 GVA 到 HPA 的映射,如下圖所示。每一個影子頁表實例對應虛擬機內(nèi)一個進程,影子頁表的建立需要 VMM 查詢虛擬機內(nèi)進程的頁表。由于影子頁表管理的是 GVA 到 HPA 的直接映射,SPT 地址轉換路徑與物理機路徑相當,直接查詢一層頁表就可以完成地址轉換。在使用 4 級頁表時,轉換過程如下圖所示。優(yōu)勢:SPT 地址轉換過程的開銷低,與物理機相當。劣勢:1)地址轉換關系的建立開銷很大,為保證地址轉換的合法性,所有的轉換關系建立,即虛擬機進程的頁表修改,都會被攔截之后陷出到特權的 VMM 中代為執(zhí)行;2)影子頁表本身需要占用內(nèi)存,且一個影子頁表只對應虛擬機內(nèi)一個進程,整體會占用較多內(nèi)存資源。
EPT:后來的硬件針對虛擬化增加了嵌套頁表的支持,使得硬件可以自動完成兩層頁表轉換。EPT 即是基于硬件支持的方案,在管理 GVA 到 GPA 的虛擬機頁表基礎上,新增擴展頁表管理 GPA 到 HPA 的映射,如下圖所示。這兩層頁表相互獨立,兩層映射關系轉換都由硬件自動完成。由于虛擬機內(nèi)各級頁表(gL4, gL3, gL2, gL1)內(nèi)容只是 GPA,查詢下一級時必須先經(jīng)擴展頁表(nL4, nL3, nL2, nL1)轉換為 HPA,使得整個轉換路徑很長。在兩層頁表均為 4 級時,轉換過程如下圖所示。優(yōu)勢:地址轉換關系的建立開銷低,獨立的 EPT 頁表的存在保證了地址轉換的合法性,因此虛擬機的頁表可以自行修改而無需 VMM 的干預。劣勢:轉換過程的開銷很大,最壞情況下需要 24(4 4 4 * 4)次硬件查表轉換。
兩種經(jīng)典的方案在安全上都有堅實的保證,但在性能上各有缺陷。SPT 為保證地址轉換的合法性在建立轉換關系時付出了很大代價,而 EPT 雖然消除了建立轉換關系的開銷,轉換路徑卻更長了。其他探索業(yè)界和學術界關于內(nèi)存虛擬化還有很多的探索,基本思想與 SPT 或 EPT 類似,可以據(jù)此分為三類來看:1)一層頁表方案。與 SPT 類似,使用一層頁表直接管理 GVA 到 HPA 的映射;2)兩層頁表方案。與 EPT 類似,使用兩層獨立頁表分別管理 GVA 到 GPA 以及 GPA 到 HPA 的映射;3)混合方案。結合前兩類方案,進行動態(tài)的選擇。Direct Paging:一層頁表方案,這是 Xen 在早期硬件僅支持一層頁表時的半虛擬化方案。相比于 SPT 最大的區(qū)別是,沒有單獨維護 GVA 到 GPA 的虛擬機頁表,虛擬機知道自己處于虛擬化環(huán)境,即知道自己的頁表內(nèi)容是 HPA。虛擬機修改頁表也需要陷出,但是采用主動陷出的方式,可以 batch 化,而 SPT 則是被動攔截陷出;讀取頁表時只能拿到 HPA,需要查一張 M2P(Machine to Physical)表才能得到 GPA。Direct Paging 同樣使用一層頁表管理 GVA 到 HPA 映射,地址轉換的路徑與 SPT 是相同的。在使用 4 級頁表時,最壞只需 4 次查表。優(yōu)勢:地址轉換過程的開銷低,與物理機相當。劣勢:1)地址轉換關系的建立開銷很大,所有頁表修改都需要主動陷出;2)需要虛擬機做半虛擬化的適配,虛擬機需要感知自己的頁表管理的是 GVA 到 HPA 的映射。
Direct Segment:兩層頁表方案,這是學術界基于新硬件的方案。GVA 到 GPA 的映射管理與 EPT 相同,同樣采用多級頁表。但 GPA 到 HPA 的映射采用分段機制, GPA 轉換為 HPA 時只需要通過硬件加上一個偏移即可。GPA 雖然不等于 HPA,但二者的映射關系十分簡單,只需要 Direct Segment 硬件添加一個偏移,整個轉換路徑與物理機的路徑相比差別很小,僅多了幾次硬件偏移。虛擬機使用 4 級頁表時,轉換路徑如下圖所示,其中 DS 表示 GPA 到 HPA 轉換的硬件支持。優(yōu)勢:地址轉換關系的建立開銷低,同時轉換過程的開銷也很低。劣勢:1)需要硬件支持 GPA 到 HPA 分段映射,現(xiàn)有的硬件不具備這樣的功能;2)需要分配大段連續(xù)的內(nèi)存,即主機不能有太多內(nèi)存碎片。Flat EPT:兩層頁表方案,這也是學術界提出的基于新硬件的方案。整體與 EPT 非常相似,唯一的區(qū)別在于 EPT 管理 GPA 到 HPA 的使用多級頁表,一般是 4 級,每級 512 項;而 Flat EPT 使用僅有一級的扁平頁表,表項遠不止 512。與 EPT 相同,虛擬機內(nèi)各級頁表的內(nèi)容也是 GPA,查詢下一級時需要先經(jīng)過扁平擴展頁表(nL4)轉換為 HPA。由于扁平擴展頁表只有一級,轉換路徑相比 EPT 縮短了非常多。在虛擬機內(nèi)使用4級頁表時,轉換路徑如下圖所示,最壞只需 9(4 1 4 * 1)次查表。優(yōu)勢:地址轉換關系的建立開銷低,同時轉換過程的開銷也較低。相比于 Direct Segment 對內(nèi)存分配要求很低,只需要少量連續(xù)內(nèi)存用作扁平擴展頁表即可(8G規(guī)格虛擬機只需要 16M)。劣勢:需要硬件支持扁平擴展頁表,當前的硬件只支持表項為 512 的多級擴展頁表。
Mix SPT and EPT:混合方案,這是學術界較早提出的方案,簡單而言就是動態(tài)的分時切換 SPT 與 EPT。在虛擬機運行時監(jiān)控和采集 TLB miss 與 Page Fault 的數(shù)據(jù),在二者達到設定的閾值時進行 SPT 與 EPT 之間的切換,如下圖所示:
- TLB miss 率高于閾值 T1,Page Fault 頻率低于閾值 T2 時,從 EPT 切換到 SPT
- TLB miss 率低于閾值 T1,Page Fault 頻率高于閾值 T2 時,從 SPT 切換到 EPT