openstack-KVM-Memory(5)
一、Memory
1、查看memory信息
free -g
cat /proc/meminfo
dmesg | grep Memory
2、xml文件中的內存信息:
vim /etc/libvirt/qemu/虛擬機名.xml
<memory unit=‘KiB‘>2097152</memory> <currentMemory unit=‘KiB‘>2097152</currentMemory>
二、 EPT和VPID
1、EPT(擴展頁表)
EPT (Extended Page Tables)屬於Intel的二代硬件虛擬化技術,針對內存管理單元(MMU)的虛擬化擴展。EPT降低了內存虛擬化的難度(影子頁表)也提升了內存虛擬化的性能。從基於Intel的Nehalem架構的平臺開始,EPT作為CPU的一個特性加入到CPU硬件中去了。
NPT (Nested PageTables)AMD稱為NPT。
2、EPT(擴展頁表)工作原理:
GVA (Guest Virtual Address) 客戶機虛擬地址 guest
GPA (Guest Physical Address) 客戶機物理地址
HPA (Host Physical Address) 宿主機物理地址 Hypervisor
1個EPT頁表=N個影子頁表
註:影子頁表即每個虛擬機各自都有的一個頁表。
地址轉換過程:
為了實現內存虛擬化,讓客戶機使用一個隔離的、從零開始且具有連續的內存空間,KVM 引入一層新的地址空間,即客戶機物理地址空間 (Guest Physical Address,GPA),這個地址空間並不是真正的物理地址空間,它只是宿主機虛擬地址空間在客戶機地址空間的一個映射。
對客戶機來說,客戶機物理地址空間都是從零開始的連續地址空間,但對於宿主機來說,客戶機的物理地址空間並不一定是連續的,客戶機物理地址空間有可能映射在若幹個不連續的宿主機地址區間。虛擬機本質上是Host機上的一個進程,按理說應該可以使用Host機的虛擬地址空間,但由於在虛擬化模式下,虛擬機處於非Root模式,無法直接訪問Root模式下的Host機上的內存。
這個時候就需要VMM 的介入,VMM 需要 intercept(截獲)虛擬機的內存訪問指令,然後 virtualize(模擬)Host上的內存,相當於VMM在虛擬機的虛擬地址空間和Host機的虛擬地址空間中間增加了一層,即虛擬機的物理地址空間,也可以看作是 Qemu的虛擬地址空間。
所以,內存虛擬化的目標就是要將虛擬機的虛擬地址(Guest Virtual Address,GVA)轉化為Host的物理地址(Host Physical Address,HPA),中間要經過虛擬機的物理地址(Guest Physical Address,GPA)和Host虛擬地址(Host Virtual Address)的轉化,即:GVA→ GPA →HVA→HPA
其中前兩步由虛擬機的系統頁表完成,中間兩步由 VMM 定義的映射表(由數據結構 kvm_memory_slot 記錄)完成,它可以將連續的虛擬機物理地址映射成非連續的 Host 機虛擬地址,後面兩步則由 Host 機的系統頁表完成。
3、VPID (虛擬處理器標識)
VPID (VirtualProcessor Identifiers)虛擬處理器標識,提升實時遷移的效率,同時節省實時遷移的開銷,提高速度,降低延遲。
TLB (translation lookaside buffer)旁路轉換緩沖,或稱為頁表緩沖;裏面存放的是一些頁表文件(虛擬地址到物理地址的轉換表)。
#查看ept和vpid信息:
grep ept /proc/cpuinfo
grep vpid /proc/cpuinfo
#查看ept和vpid信息:
cat /sys/module/kvm_intel/parameters/ept
cat /sys/module/kvm_intel/parameters/vpid
#關閉ept和vpid:
modprobe kvm_intel ept=0,vpid=0
三、 大頁(Huge Page)
x86-64CPU
支持2MB大頁
內核2.6以上支持大頁
內存頁數量減少,從而需要更少的頁表,節約頁表所占用的內存數量,減少地址轉換,提高內存訪問性能。
地址轉換信息一般保存在CPU緩存中,地址轉換信息減少,從而減少CPU緩存壓力。
註:一般內存頁大小4KB。
#查看Huge Page信息
getconf PAGESIZE
cat /proc/meminfo | grep Huge
#Huge Page掛載
mount | grep huge
mount -t hugetlbfs hugetlbfs /dev/hugepages
sysctl vm.nr_hugepages=1024
#開啟Huge Page
hugpages=yes
註:開啟大頁後:
不能swap out
不能ballooning方式增長
四、 Memory超配
(1)內存交換(swapping)
用交換空間(swap space)來彌補內存的不足。
(2)氣球(ballooning)
通過virio_balloon驅動來實現宿主機Hypervisor和客戶機之間的協作。
(3)頁共享(page sharing)
通過KSM(Kernel Samepage Merging)合並多個客戶機進程使用的相同內存頁。
openstack-KVM-Memory(5)