致敬 hacker :盤點記憶體虛擬化探索之路|龍蜥技術
雲與虛擬化
記憶體虛擬化: 與虛擬記憶體的概念類似,一臺主機上的每個虛擬機器認為自己獨佔整個實體地址空間,因而需要對記憶體再做一次抽象,即記憶體虛擬化,保證每個虛擬機器都有獨立的地址空間。這樣一來,在虛擬機器和物理機中均有 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: 由於最初的硬體只支援一層頁錶轉換,直接用來轉換虛擬機器或物理機上的 VA 到 PA 都無法完成 GVA 到 HPA 的轉換。因此 SPT 建立了一條捷徑,即影子頁表,直接管理 GVA 到 HPA 的對映,如下圖所示。每一個影子頁表例項對應虛擬機器內一個程式,影子頁表的建立需要 VMM 查詢虛擬機器內程式的頁表。
由於影子頁表管理的是 GVA 到 HPA 的直接對映,SPT 地址轉換路徑與物理機路徑相當,直接查詢一層頁表就可以完成地址轉換。在使用 4 級頁表時,轉換過程如下圖所示。
2)影子頁表本身需要佔用記憶體,且一個影子頁表只對應虛擬機器內一個程式,整體會佔用較多記憶體資源。
由於虛擬機器內各級頁表(gL4, gL3, gL2, gL1)內容只是 GPA,查詢下一級時必須先經擴充套件頁表(nL4, nL3, nL2, nL1)轉換為 HPA,使得整個轉換路徑很長。在兩層頁表均為 4 級時,轉換過程如
下圖
所示。
劣勢: 轉換過程的開銷很大,最壞情況下需要 24(4 + 4 + 4 * 4)次硬體查錶轉換。
兩種經典的方案 在安全上都有堅實的保證,但在效能上各有缺陷。SPT 為保證地址轉換的合法性在建立轉換關係時付出了很大代價,而 EPT 雖然消除了建立轉換關係的開銷,轉換路徑卻更長了。
1)一層頁表方案。與 SPT 類似,使用一層頁表直接管理 GVA 到 HPA 的對映;
2)兩層頁表方案。與 EPT 類似,使用兩層獨立頁表分別管理 GVA 到 GPA 以及 GPA 到 HPA 的對映;
3)混合方案。結合前兩類方案,進行動態的選擇。
GPA 雖然不等於 HPA,但二者的對映關係十分簡單,只需要 Direct Segment 硬體新增一個偏移,整個轉換路徑與物理機的路徑相比差別很小,僅多了幾次硬體偏移。虛擬機器使用 4 級頁表時,轉換路徑如下圖所示,其中 DS 表示 GPA 到 HPA 轉換的硬體支援。
優勢: 地址轉換關係的建立開銷低,同時轉換過程的開銷也很低。
劣勢:
1)需要硬體支援 GPA 到 HPA 分段對映,現有的硬體不具備這樣的功能;
2)需要分配大段連續的記憶體,即主機不能有太多記憶體碎片。
-
TLB miss 率高於閾值 T1,Page Fault 頻率低於閾值 T2 時,從 EPT 切換到 SPT
-
TLB miss 率低於閾值 T1,Page Fault 頻率高於閾值 T2 時,從 SPT 切換到 EPT
總結
一層頁表顯著的 優勢 是地址轉換過程開銷低,與物理機相同,需要解決的問題是減少地址轉換建立的開銷。一個可能的方向是放棄一些安全性,讓頁表的修改更輕量;另一個更實際的方向是在合適的場景使用,即針對頁表修改不頻繁的負載使用。
兩層頁表的 優勢 是地址轉換建立的開銷小,虛擬機器可以獨立修改頁表,需要考慮的問題是縮短轉換路徑。這個方向其實可行性很高,但是依賴新硬體的支援,短期不太可能出現符合要求的新硬體。
混合頁表的設計初衷是希望充分利用兩類頁表的優勢,但是做好動態的模式切換是非常困難的,負載的差異甚至硬體的差異都可能影響切換的效果。或許針對已知負載做定向的調優是一個可行的方向。
關於作者
招賢納士
我們是來自阿里雲的作業系統團隊,尋找有核心、虛擬化、容器、網路、儲存、安全等系統技術經驗,並有志於打造雲原生底層系統的優秀人才,歡迎聯絡我們(郵箱: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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SysOM 案例解析:消失的記憶體都去哪了 !| 龍蜥技術記憶體
- 虛擬記憶體設定在c盤和d盤一樣嘛 虛擬記憶體放c盤還是d盤記憶體
- win10虛擬記憶體如何優化_win10怎麼優化虛擬記憶體Win10記憶體優化
- 虛擬化四、KVM虛擬化技術
- 虛擬化解決方案 virtio 的技術趨勢與 DPU 實踐解讀 | 龍蜥技術
- 聊聊虛擬記憶體記憶體
- Linux 虛擬記憶體Linux記憶體
- 跨語言程式設計的探索 | 龍蜥技術程式設計
- win10虛擬記憶體如何最佳化_win10怎麼最佳化虛擬記憶體Win10記憶體
- windows10怎麼關閉虛擬記憶體_win10關閉c盤虛擬記憶體的方法Windows記憶體Win10
- 硬核虛擬化技術 SR-IOV的原理及探索
- 【Java基礎】實體記憶體&虛擬記憶體Java記憶體
- 5.虛擬記憶體記憶體
- 【原創】Linux虛擬化KVM-Qemu分析(五)之記憶體虛擬化Linux記憶體
- Docker技術( 容器虛擬化技術 )Docker
- 虛擬記憶體有什麼用 虛擬記憶體不足怎麼解決記憶體
- 伺服器虛擬化技術的優點伺服器
- 記憶體不超過5M,datop 在識別冷熱記憶體及跨 numa 訪存有多硬核?| 龍蜥技術記憶體
- 虛擬記憶體(待補充)記憶體
- 虛擬化技術概述(一)
- 記憶體管理兩部曲之虛擬記憶體管理記憶體
- Win10系統C盤虛擬記憶體怎麼設定?Win10專業版系統C盤虛擬記憶體設定方法Win10記憶體
- 清華大學-作業系統學習筆記(五)--- 虛擬記憶體技術作業系統筆記記憶體
- 淺談GPU虛擬化技術(四)- GPU分片虛擬化GPU
- 淺談GPU虛擬化技術(四)-GPU分片虛擬化GPU
- win10怎樣刪虛擬記憶體_Win10虛擬記憶體如何關閉Win10記憶體
- 虛擬記憶體系統——瞭解記憶體的工作原理記憶體
- Ubuntu 新增虛擬記憶體檔案Ubuntu記憶體
- Linux 虛擬記憶體引數配置Linux記憶體
- 詳細理解Linux虛擬記憶體Linux記憶體
- JAVA 虛擬機器可用記憶體Java虛擬機記憶體
- Linux雲端計算技術學習:虛擬機器堆記憶體結構Linux虛擬機記憶體
- 浪潮資訊工程師:帶你瞭解裝置透傳虛擬機器的快速啟動技術最佳化方案 | 龍蜥技術工程師虛擬機
- 網路虛擬化技術棧
- win10虛擬記憶體怎麼設定 win10虛擬記憶體設定方法Win10記憶體
- win10怎麼更改虛擬記憶體_win10更改虛擬記憶體大小方法Win10記憶體
- win10怎麼加虛擬記憶體_win10系統增加虛擬記憶體教程Win10記憶體
- win10怎麼調整虛擬記憶體_win10怎麼調虛擬記憶體Win10記憶體