1. 程式人生 > >Intel虛擬化技術——EPT、VPID

Intel虛擬化技術——EPT、VPID

背景

記憶體用於暫存CPU將要執行的指令和資料,所有程式的執行都必須先載入到記憶體中才可以,記憶體的大小及其訪問速度也直接影響整個系統性能。在平臺虛擬化技術中,Guest的執行也需要依賴記憶體。和執行在真實物理硬體上的作業系統一樣,在Guest作業系統看來,Guest可用的記憶體空間也是一個從零地址開始的連續的實體記憶體空間。為了達到這個目的,Hypervisor(即KVM)引入了一層新的地址空間,即Guest實體地址空間,這個地址空間不是真正的硬體上的地址空間,它們之間還有一層對映。所以,在虛擬化環境下,記憶體使用就需要兩層的地址轉換,即Guest應用程式可見的Guest虛擬地址(Guest Virtual Address,GVA)到客戶機實體地址(Guest Physical Address,GPA)的轉換,再從Guest實體地址(GPA)到宿主機實體地址(Host Physical Address,HPA)的轉換。其中,前一個轉換由Guest作業系統來完成,而後一個轉換由Hypervisor來負責。為了解決這兩次地址轉換,Intel先後使用了不同的技術手段。

影子頁表

影子頁表(Shadow Page Tables)是從軟體上維護了從GVA到HPA之間的對映,每一份Guest作業系統的頁表也對應一份影子頁表。有了影子頁表,在普通的記憶體訪問時都可實現從GVA到HPA的直接轉換,從而避免了上面前面提到的兩次地址轉換。Hypervisor將影子頁表載入到物理上的記憶體管理單元(Memory Management Unit,MMU)中進行地址翻譯。GVA、GPA、HPA之間的轉換,以及影子頁表的作用如下圖。

儘管影子頁表提供了在物理MMU硬體中能使用的頁表,但是其缺點也是比較明顯的。

技術複雜

影子頁表實現非常複雜,導致其開發、除錯和維護都比較困難。

實體記憶體開銷大

由於需要為每個客戶機程序對應的頁表的都維護一個影子頁表,因此影子頁表的記憶體開銷非常大。

EPT

EPT(Extended Page Tables,擴充套件頁表),屬於Intel的第二代硬體虛擬化技術,它是針對記憶體管理單元(MMU)的虛擬化擴充套件。相對於影子頁表,EPT降低了記憶體虛擬化的難度(,也提升了記憶體虛擬化的效能。從基於Intel的Nehalem架構的平臺開始,EPT就作為CPU的一個特性加入到CPU硬體中去了。

Intel在CPU中使用EPT技術,AMD也提供的類似技術叫做NPT,即Nested Page Tables。都是直接在硬體上支援GVA-->GPA-->HPA的兩次地址轉換,從而降低記憶體虛擬化實現的複雜度,也進一步提升了記憶體虛擬化的效能。Intel EPT技術的基本原理如下圖

CR3(控制暫存器3)將客戶機程式所見的客戶機虛擬地址(GVA)轉化為客戶機實體地址(GPA),然後在通過EPT將客戶機實體地址(GPA)轉化為宿主機實體地址(HPA)。這兩次轉換地址轉換都是由CPU硬體來自動完成的,其轉換效率非常高。

在使用EPT的情況下,客戶機內部的Page Fault、INVLPG(使TLB]專案失效)指令、CR3暫存器的訪問等都不會引起VM-Exit,因此大大減少了VM-Exit的數量,從而提高了效能。

EPT只需要維護一張EPT頁表,而不需要像“影子頁表”那樣為每個客戶機程序的頁表維護一張影子頁表,從而也減少了記憶體的開銷。

VPID

TLB(Translation Lookaside Buffer)轉換檢測緩衝區是一個記憶體管理單元,用於改進虛擬地址到實體地址轉換速度的快取。

VPID(VirtualProcessor Identifiers,虛擬處理器標識),是在硬體上對TLB資源管理的優化,通過在硬體上為每個TLB項增加一個標識,用於不同的虛擬處理器的地址空間,從而能夠區分開Hypervisor和不同處理器的TLB。

硬體區分了不同的TLB項分別屬於不同虛擬處理器,因此可以避免每次進行VM-Entry和VM-Exit時都讓TLB全部失效,提高了VM切換的效率。

由於有了這些在VM切換後仍然繼續存在的TLB項,硬體減少了一些不必要的頁表訪問,減少了記憶體訪問次數,從而提高了Hypervisor和客戶機的執行速度。

VPID也會對客戶機的實時遷移(Live Migration)有很好的效率提升,會節省實時遷移的開銷,會提升實時遷移的速度,降低遷移的延遲(Latency)。

VPID與EPT是一起加入到CPU中的特性,也是Intel公司在2009年推出Nehalem系列處理器上新增的與虛擬化相關的重要功能。

Host上常看CPU對EPT、VPID支援情況

我Host上有8顆邏輯CPU

[[email protected] ~]# grep "ept vpid" /proc/cpuinfo -o
ept vpid
ept vpid
ept vpid
ept vpid
ept vpid
ept vpid
ept vpid
ept vpid
View Code

KVM虛擬化下如何開關EPT、VPID

在載入kvm_intel模組時,可以通過設定ept和vpid引數的值來開啟或關閉EPT和VPID。

當然,如果kvm_intel模組已經處於載入狀態,則需要先解除安裝這個模組,在重新載入之時加入所需的引數設定。

[[email protected] ~]# cat /sys/module/kvm_intel/parameters/ept
Y
[[email protected] ~]# cat /sys/module/kvm_intel/parameters/vpid
Y
View Code

一般不要手動關閉EPT和VPID功能,否則會導致Guest中記憶體訪問的效能下降。