致敬 hacker :盤點記憶體虛擬化探索之路|龍蜥技術

OpenAnolis小助手發表於2021-11-25

雲與虛擬化

雲端計算 是透過 Internet 服務的方式提供動態可伸縮資源的計算模式,經過多年的發展已成為 企業 IT 技術的重要支撐。虛擬化是雲端計算的核心技術之一,將一臺計算機抽象為多臺邏輯計算機,即虛擬機器,每個虛擬機器是一個單獨安全的環境,可執行不同的作業系統且互不影響
虛擬 化技術 給資源使用和排程帶來了極大便利,雲端計算系統可以根據負載情況及時進行資源排程,在提升資源利用率的同時保證應用和服務不會因資源不足而影響服務質量。然而虛擬化也是有代價的,對資源的抽象帶來了效能損失,這也是虛擬化一直致力解決的問題。
虛擬化的資源抽象可以簡單劃分為三部分: CPU 虛擬化、記憶體虛擬化和裝置虛擬化 。其中裝置虛擬化已經可以實現網路、儲存等裝置直通虛擬機器,沒有效能損失;CPU 虛擬化在硬體特性的支援下,執行普通指令效能與裸機相同;而記憶體虛擬化相比裸機,仍然存在較大差異,是當下值得關注的問題。
記憶體虛擬化
虛擬記憶體: 說到記憶體虛擬化,就不得不提虛擬記憶體的概念。早期的作業系統只有實體地址且空間有限,程式使用記憶體時必須小心翼翼以避免覆蓋其他程式的記憶體。為避免此問題,虛擬記憶體的概念被抽象出來,保證每個程式都有一塊連續的、獨立的虛擬記憶體空間。程式直接透過 VA(Virtual Address)使用記憶體,CPU 訪存時發出的 VA 由硬體 MMU(Memory Management Unit)攔截並轉換為 PA(Physical Address),VA 到 PA 的對映使用頁表進行管理,MMU 在轉換時會自動查詢頁表。

記憶體虛擬化: 與虛擬記憶體的概念類似,一臺主機上的每個虛擬機器認為自己獨佔整個實體地址空間,因而需要對記憶體再做一次抽象,即記憶體虛擬化,保證每個虛擬機器都有獨立的地址空間。這樣一來,在虛擬機器和物理機中均有  VA  和  PA  的概念,即 GVA(Guest  Virtual Address)和 GPA(Guest Physical Address),以及 HVA(Host Virtual Address)和 HPA(Host Physical Address)。虛擬機器內的程式使用的是GVA,最終需要轉換成 HPA。兩個 VA 到 PA( GVA 到 GPA 以及 HVA 到 HPA)的對映同樣使用頁表管理,GPA 到 HVA 一般是幾段連續的線性對映,由虛擬機器的管理程式 VMM(Virtual Machine Monitor)進行管理。

程式訪存需要從 VA 轉換成 PA,在引入記憶體虛擬化後,轉換路徑發生了很大的變化。原本只需要將 VA 轉換為 PA, 虛擬化後轉換過程變成 GVA -> GPA -> HVA -> HPA  。路徑變得更長更復雜之後,對於訪存的安全和效能都帶來了挑戰,這兩點也是記憶體虛擬化需要達到的 目標:1)安全 ,即地址轉換的合法性,虛擬機器不能訪問不屬於自己的記憶體;2)效能,即地址轉換的高效性,包括轉換關係建立的開銷低,以及轉換過程本身的開銷低。

經典方案

為達成記憶體虛擬化的目標,已經有很多虛擬化方案被提出,SPT(Shadow Page Table)和 EPT(Extended Page Table)是兩種典型的方案,也是大家最熟悉的方案。我們先以此為切入點,看看他們是如何工作的,然後再討論其他的虛擬化方案。

SPT: 由於最初的硬體只支援一層頁錶轉換,直接用來轉換虛擬機器或物理機上的 VA 到 PA 都無法完成 GVA 到 HPA 的轉換。因此 SPT 建立了一條捷徑,即影子頁表,直接管理 GVA 到 HPA 的對映,如下圖所示。每一個影子頁表例項對應虛擬機器內一個程式,影子頁表的建立需要 VMM 查詢虛擬機器內程式的頁表。

由於影子頁表管理的是 GVA 到 HPA 的直接對映,SPT 地址轉換路徑與物理機路徑相當,直接查詢一層頁表就可以完成地址轉換。在使用 4 級頁表時,轉換過程如下圖所示。

優勢: SPT 地址轉換過程的開銷低,與物理機相當。

劣勢:
1)地址轉換關係的建立開銷很大,為保證地址轉換的合法性,所有的轉換關係建立,即虛擬機器程式的頁表修改,都會被攔截之後陷出到特權的 VMM 中代為執行;

2)影子頁表本身需要佔用記憶體,且一個影子頁表只對應虛擬機器內一個程式,整體會佔用較多記憶體資源。

EPT: 後來的硬體針對虛擬化增加了巢狀頁表的支援,使得硬體可以自動完成兩層頁錶轉換。EPT 即是基於硬體支援的方案,在管理 GVA 到 GPA 的虛擬機器頁表基礎上,新增擴充套件頁表管理 GPA 到 HPA 的對映,如下圖所示。這兩層頁表相互獨立,兩層對映關係轉換都由硬體自動完成。

由於虛擬機器內各級頁表(gL4, gL3, gL2, gL1)內容只是 GPA,查詢下一級時必須先經擴充套件頁表(nL4, nL3, nL2, nL1)轉換為 HPA,使得整個轉換路徑很長。在兩層頁表均為 4 級時,轉換過程如 下圖 所示。

優勢: 地址轉換關係的建立開銷低,獨立的 EPT 頁表的存在保證了地址轉換的合法性,因此虛擬機器的頁表可以自行修改而無需 VMM 的干預。

劣勢: 轉換過程的開銷很大,最壞情況下需要 24(4 + 4 + 4 * 4)次硬體查錶轉換。

兩種經典的方案 在安全上都有堅實的保證,但在效能上各有缺陷。SPT 為保證地址轉換的合法性在建立轉換關係時付出了很大代價,而 EPT 雖然消除了建立轉換關係的開銷,轉換路徑卻更長了。

其他探索
業界和學術界關於記憶體虛擬化還有很多的探索,基本思想與 SPT 或 EPT 類似,可以據此分為 三類 來看

1)一層頁表方案。與 SPT 類似,使用一層頁表直接管理 GVA 到 HPA 的對映;

2)兩層頁表方案。與 EPT 類似,使用兩層獨立頁表分別管理 GVA 到 GPA 以及 GPA 到 HPA 的對映;

3)混合方案。結合前兩類方案,進行動態的選擇。

Direct Paging: 一層頁表方案,這是 Xen 在早期硬體僅支援一層頁表時的半虛擬化方案。相比於 SPT 最大的區別是,沒有單獨維護 GVA 到 GPA 的虛擬機器頁表,虛擬機器知道自己處於虛擬化環境,即知道自己的頁表內容是 HPA。虛擬機器修改頁表也需要陷出,但是採用主動陷出的方式,可以 batch 化,而 SPT 則是被動攔截陷出;讀取頁表時只能拿到 HPA,需要查一張 M2P(Machine to Physical)表才能得到 GPA。

Direct Paging 同樣使用一層頁表管理 GVA 到 HPA 對映,地址轉換的路徑與 SPT 是相同的。在使用 4 級頁表時,最壞只需 4 次查表。

GPA 雖然不等於 HPA,但二者的對映關係十分簡單,只需要 Direct Segment 硬體新增一個偏移,整個轉換路徑與物理機的路徑相比差別很小,僅多了幾次硬體偏移。虛擬機器使用 4 級頁表時,轉換路徑如下圖所示,其中 DS 表示 GPA 到 HPA 轉換的硬體支援。

優勢: 地址轉換關係的建立開銷低,同時轉換過程的開銷也很低。

劣勢:

1)需要硬體支援 GPA 到 HPA 分段對映,現有的硬體不具備這樣的功能;

2)需要分配大段連續的記憶體,即主機不能有太多記憶體碎片。

Flat EPT: 兩層頁表方案,這也是學術界提出的基於新硬體的方案。整體與 EPT 非常相似,唯一的區別在於 EPT 管理 GPA 到 HPA 的使用多級頁表,一般是 4 級,每級 512 項;而 Flat EPT 使用僅有一級的扁平頁表,表項遠不止 512。
與 EPT 相同,虛擬機器內各級頁表的內容也是 GPA,查詢下一級時需要先經過扁平擴充套件頁表(nL4)轉換為 HPA。由於扁平擴充套件頁表只有一級,轉換路徑相比 EPT 縮短了非常多。在虛擬機器內使用4級頁表時,轉換路徑如下圖所示,最壞只需 9(4 + 1 + 4 * 1)次查表。
優勢: 地址轉換關係的建立開銷低,同時轉換過程的開銷也較低。相比於 Direct Segment 對記憶體分配要求很低,只需要少量連續記憶體用作扁平擴充套件頁表即可(8G規格虛擬機器只需要 16M)。
劣勢: 需要硬體支援扁平擴充套件頁表,當前的硬體只支援表項為 512 的多級擴充套件頁表。
Mix SPT and EPT:混合方案,這是學術界較早提出的方案,簡單而言就是動態的分時切換 SPT 與 EPT。在虛擬機器執行時監控和採集 TLB miss 與 Page Fault 的資料,在二者達到設定的閾值時進行 SPT 與 EPT 之間的切換,如 下圖 所示
  • TLB miss 率高於閾值 T1,Page Fault 頻率低於閾值 T2 時,從 EPT 切換到 SPT

  • TLB miss 率低於閾值 T1,Page Fault 頻率高於閾值 T2 時,從 SPT 切換到 EPT

優勢: 有機會充分利用SPT與EPT的優勢,達到更好的效能。

劣勢:
1)頁表切換閾值的設定很困難,硬體配置都可能影響閾值;
2)SPT與EPT的切換也是有代價的,主要是SPT的銷燬與重建。

總結

一層頁表顯著的 優勢 是地址轉換過程開銷低,與物理機相同,需要解決的問題是減少地址轉換建立的開銷。一個可能的方向是放棄一些安全性,讓頁表的修改更輕量;另一個更實際的方向是在合適的場景使用,即針對頁表修改不頻繁的負載使用。

兩層頁表的 優勢 是地址轉換建立的開銷小,虛擬機器可以獨立修改頁表,需要考慮的問題是縮短轉換路徑。這個方向其實可行性很高,但是依賴新硬體的支援,短期不太可能出現符合要求的新硬體。

混合頁表的設計初衷是希望充分利用兩類頁表的優勢,但是做好動態的模式切換是非常困難的,負載的差異甚至硬體的差異都可能影響切換的效果。或許針對已知負載做定向的調優是一個可行的方向。

長遠來看,如果有新硬體的加持,兩層頁表(尤其是Flat EPT)是比較完善的方案,地址轉換可以很高效,也不需要在安全和通用性上做一些犧牲。但是短期來看,新硬體為時尚早,在一層頁表方案上做進一步的探索和最佳化,是更加實際的。我們將會持續在記憶體虛擬化這條路徑探索更多的可能,歡迎大家加入 OpenAnolis 龍蜥社群討論交流。
—— 完 ——

關於作者

陶志恆(君川),2020年加入阿里雲作業系統-雲原生底層系統團隊,目前從事效能最佳化方向的工作。

招賢納士

我們是來自阿里雲的作業系統團隊,尋找有核心、虛擬化、容器、網路、儲存、安全等系統技術經驗,並有志於打造雲原生底層系統的優秀人才,歡迎聯絡我們(郵箱:shaokang.hwd@alibaba-inc.com)。

加入龍蜥社群

加入微信群:新增社群助理-龍蜥社群小龍(微信:openanolis_assis),備註【龍蜥】拉你入群;加入釘釘群:可掃碼或搜釘釘群號(33311793)。歡迎開發者/使用者加入龍蜥OpenAnolis社群交流,共同推進龍蜥社群的發展,一起打造一個活躍的、健康的開源作業系統生態!


關於龍蜥社群

龍蜥社群是由企事業單位、高等院校、科研單位、非營利性組織、個人等按照自願、平等、開源、協作的基礎上組成的非盈利性開源社群。龍蜥社群成立於2020年9月,旨在構建一個開源、中立、開放的Linux上游發行版社群及創新平臺。

短期目標是開發Anolis OS作為CentOS替代版,重新構建一個相容國際Linux主流廠商發行版。中長期目標是探索打造一個面向未來的作業系統,建立統一的開源作業系統生態,孵化創新開源專案,繁榮開源生態。

加入我們,一起打造面向未來的開源作業系統!

Https://openanolis.cn











來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70004278/viewspace-2844184/,如需轉載,請註明出處,否則將追究法律責任。

相關文章