1. 程式人生 > >openstack-KVM-Memory(5)

openstack-KVM-Memory(5)

開啟 nested side get 從零開始 ram 原理 hugepages 增長

一、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)