內存虛擬化的概念


- 軟件方式:通過軟件實現內存地址的翻譯,比如 Shadow page table (影子頁表)技術
- 硬件實現:基於 CPU 的輔助虛擬化功能,比如 AMD 的 NPT 和 Intel 的 EPT 技術

2.2 KVM 內存虛擬化
- AMD 平台上的 NPT (Nested Page Tables) 技術
- Intel 平台上的 EPT (Extended Page Tables)技術
EPT 和 NPT采用類似的原理,都是作為 CPU 中新的一層,用來將客戶機的物理地址翻譯為主機的物理地址。關於 EPT, Intel 官方文檔中的技術如下(實在看不懂...)
EPT的好處是,它的兩階段記憶體轉換,特點就是將 Guest Physical Address → System Physical Address,VMM不用再保留一份 SPT (Shadow Page Table),以及以往還得經過 SPT 這個轉換過程。除了降低各部虛擬機器在切換時所造成的效能損耗外,硬體指令集也比虛擬化軟體處理來得可靠與穩定。
2.3 KSM (Kernel SamePage Merging 或者 Kernel Shared Memory)
KSM 在 Linux 2.6.32 版本中被加入到內核中。
2.3.1 原理
其原理是,KSM 作為內核中的守護進程(稱為 ksmd)存在,它定期執行頁面掃描,識別副本頁面並合並副本,釋放這些頁面以供它用。因此,在多個進程中,Linux將內核相似的內存頁合並成一個內存頁。這個特性,被KVM用來減少多個相似的虛擬機的內存占用,提高內存的使用效率。由於內存是共享的,所以多個虛擬機使用的內存減少了。這個特性,對於虛擬機使用相同鏡像和操作系統時,效果更加明顯。但是,事情總是有代價的,使用這個特性,都要增加內核開銷,用時間換空間。所以為了提高效率,可以將這個特性關閉。
2.3.2 好處
其好處是,在運行類似的客戶機操作系統時,通過 KSM,可以節約大量的內存,從而可以實現更多的內存超分,運行更多的虛機。
2.3.3 合並過程
(1)初始狀態:
(2)合並后:
(3)Guest 1 寫內存后:
2.4 KVM Huge Page Backed Memory (巨頁內存技術)
這是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
也可以在配置文件里加入:
<memoryBacking> <hugepages/> </memoryBacking>
驗證方式,當虛擬機正常啟動以后,在物理機里查看:
cat /proc/meminfo |grep -i hugepages
老外的一篇文檔,他使用的是libvirt方式,先讓libvirtd進程使用hugepages空間,然后再分配給虛擬機。
參考資料:
http://www.cnblogs.com/xusongwei/archive/2012/07/30/2615592.html
https://www.ibm.com/developerworks/cn/linux/l-cn-vt/
http://www.slideshare.net/HwanjuKim/3cpu-virtualization-and-scheduling
http://www.cse.iitb.ac.in/~puru/courses/autumn12/cs695/classes/kvm-overview.pdf
http://www.linux-kvm.com/content/using-ksm-kernel-samepage-merging-kvm
http://blog.csdn.net/summer_liuwei/article/details/6013255
http://blog.pchome.net/article/458429.html
http://blog.chinaunix.net/uid-20794164-id-3601787.html
虛擬化技術性能比較和分析,周斌,張瑩
http://wiki.qemu.org/images/c/c8/Cpu-models-and-libvirt-devconf-2014.pdf
http://frankdenneman.nl/2011/01/11/beating-a-dead-horse-using-cpu-affinity/