KVM 記憶體虛擬化

2021-08-15 20:36:31 字數 2675 閱讀 7244

除了 cpu 虛擬化,另乙個關鍵是記憶體虛擬化,通過記憶體虛擬化共享物理系統記憶體,動態分配給虛擬機器。虛擬機器的記憶體虛擬化很象現在的作業系統支援的虛擬記憶體方式,應用程式看到鄰近的記憶體位址空間,這個位址空間無需和下面的物理機器記憶體直接對應,作業系統保持著虛擬頁到物理頁的對映。現在所有的 x86 cpu 都包括了乙個稱為記憶體管理的模組mmu(memory management unit)和 tlb(translation lookaside buffer),通過mmu和tlb來優化虛擬記憶體的效能。

kvm 實現客戶機記憶體的方式是,利用mmap系統呼叫,在qemu主線程的虛擬位址空間中申明一段連續的大小的空間用於客戶機物理記憶體對映。

(** hva 同下面的 ma,gpa 同下面的 pa,gva 同下面的 va)

在有兩個虛機的情況下,情形是這樣的:

可見,kvm 為了在一台機器上執行多個虛擬機器,需要增加乙個新的記憶體虛擬化層,也就是說,必須虛擬 mmu 來支援客戶作業系統,來實現 va -> pa -> ma 的翻譯。客戶作業系統繼續控制虛擬位址到客戶記憶體實體地址的對映 (va -> pa),但是客戶作業系統不能直接訪問實際機器記憶體,因此vmm 需要負責對映客戶物理記憶體到實際機器記憶體 (pa -> ma)。

vmm 記憶體虛擬化的實現方式:

影子頁表技術:

kvm 中,虛機的物理記憶體即為 qemu-kvm 程序所占用的記憶體空間。kvm 使用 cpu 輔助的記憶體虛擬化方式。在 intel 和 amd 平台,其記憶體虛擬化的實現方式分別為:

ept 和 npt採用類似的原理,都是作為 cpu 中新的一層,用來將客戶機的實體地址翻譯為主機的實體地址。關於 ept, intel 官方文件中的技術如下(實在看不懂...)

ept的好處是,它的兩階段記憶體轉換,特點就是將 guest physical address → system physical address,vmm不用再保留乙份 spt (shadow page table),以及以往還得經過 spt 這個轉換過程。除了降低各部虛擬機器在切換時所造成的效能損耗外,硬體指令集也比虛擬化軟體處理來得可靠與穩定。

ksm 在 linux 2.6.32 版本中被加入到核心中。

2.3.1 原理

其原理是,ksm 作為核心中的守護程序(稱為 ksmd)存在,它定期執行頁面掃瞄,識別副本頁面並合併副本,釋放這些頁面以供它用。因此,在多個程序中,linux將核心相似的記憶體頁合併成乙個記憶體頁。這個特性,被kvm用來減少多個相似的虛擬機器的記憶體占用,提高記憶體的使用效率。由於記憶體是共享的,所以多個虛擬機器使用的記憶體減少了。這個特性,對於虛擬機器使用相同映象和作業系統時,效果更加明顯。但是,事情總是有代價的,使用這個特性,都要增加核心開銷,用時間換空間。所以為了提高效率,可以將這個特性關閉。

其好處是,在執行類似的客戶機作業系統時,通過 ksm,可以節約大量的記憶體,從而可以實現更多的記憶體超分,執行更多的虛機。 

2.3.3 合併過程

(1)初始狀態:

(2)合併後:

(3)guest 1 寫記憶體後:

這是kvm虛擬機器的又乙個優化技術.。intel 的 x86 cpu 通常使用4kb記憶體頁,當是經過配置,也能夠使用巨頁(huge page): (4mb on x86_32, 2mb on x86_64 and x86_32 pae)

使用巨頁,kvm的虛擬機器的頁表將使用更少的記憶體,並且將提高cpu的效率。最高情況下,可以提高20%的效率!

使用方法,需要三部:

mkdir /dev/hugepages
mount -t hugetlbfs hugetlbfs /dev/hugepages
#保留一些記憶體給巨頁

sysctl vm.nr_hugepages=2048 (使用 x86_64 系統時,這相當於從物理記憶體中保留了2048 x 2m = 4gb 的空間來給虛擬機器使用)

#給 kvm 傳遞引數 hugepages

qemu-kvm - qemu-kvm -mem-path /dev/hugepages

也可以在配置檔案裡加入:

驗證方式,當虛擬機器正常啟動以後,在物理機裡檢視:

cat /proc/meminfo |grep -i hugepages
老外的一篇文件,他使用的是libvirt方式,先讓libvirtd程序使用hugepages空間,然後再分配給虛擬機器。

參考資料:

虛擬化技術效能比較和分析,周斌,張瑩

KVM 記憶體虛擬化

dev kvm 裝置 虛擬化分為軟體虛擬化和硬體虛擬化,而且遵循 intercept 和 virtualize 的規律。記憶體虛擬化也分為基於軟體的記憶體虛擬化和硬體輔助的記憶體虛擬化,其中,常用的基於軟體的記憶體虛擬化技術為 影子頁表 技術,硬體輔助記憶體虛擬化技術為 intel 的 ept ex...

KVM 記憶體虛擬化及其實現

為保證客戶機作業系統在虛擬環境下觀察到的記憶體空間布局與在實際物理機環境下相同,就必須對記憶體進行虛擬化。對於記憶體虛擬化,目前主要有兩種實現方法,其一是利用傳統的影子頁表進行虛擬化,其二就是通過硬體輔助進行實現。本文主要闡述了這兩種記憶體虛擬化方法在 kvm 上的具體實現。kvm kernel v...

kvm記憶體虛擬化及其實現

kvm kernel virtual machine 作為開源的核心虛擬機器,越來越受到 ibm,redhat,hp,intel 等各大公司的大力支援,基於 kvm 的開源虛擬化生態系統也日益完善。而實現 kvm 虛擬化,使客戶機高效地 安全地使用宿主機的記憶體資源,就必須實現記憶體的虛擬化。為了實...