標題中的儲存虛擬化,涉及到兩個方面,分別是記憶體和磁碟的虛擬化技術。記憶體的虛擬化就不得不提EPT和VPID 技術.
首先申明下本人其實不想寫一些純理論的東西,但是架不住面試經被問,為此特將一些特別複雜的技術底層都隱去,儘量將技術講的簡單,我個人信奉一句話'If you can't explain it simply, you don't understand it well enough.'
一次記憶體的存取要經過兩次地址轉換 GVA -> GPA -> HPA ,其效率可想而知是不高的。為了解決上述問題,一種叫影子頁表(Shadow Page Tables)技術從軟體上實現了客戶機虛擬地址 -> 宿主機的實體地址的直接轉換。
影子頁面雖然解決了兩次地址轉換的問題,但是其為每一個客戶機都維護一個影子頁表,其記憶體開銷也比較大,而且其技術基於軟體來實現,維護和偵錯都比較複雜。
為了解決影子頁表的問題,Intel的CPU提供了EPT技術(AMD提供的類似技術叫作NPT,即Nested Page Tables),直接在硬體上支援GVA→GPA→HPA的兩次地址轉換,從而降低記憶體虛擬化實現的複雜度,也進一步提升了記憶體虛擬化的效能.
而 VPID(Virtual Page Identifier)則是 EPT 技術中一個重要的識別符號。它用於區分不同虛擬機器器之間的頁表,確保每個虛擬機器器都有獨立的頁表和記憶體空間。
VPID 在虛擬化環境中起到類似身份證的作用。每個虛擬機器器都被分配一個唯一的 VPID,用於標識該虛擬機器器的頁表。這樣,不同的虛擬機器器可以同時執行,並且每個虛擬機器器都有自己獨立的記憶體空間,互相之間不會干擾彼此。
總結來說,EPT 是一種虛擬化技術,用於用硬體的方式來實現兩次地址轉換,改善虛擬機器器記憶體存取效率,而 VPID 則是在 EPT 技術中使用的識別符號,用於區分不同虛擬機器器的頁表和記憶體空間。
lscpu |grep -E "ept |vpid" 或
cat /proc/cpuinfo |grep -E "ept |vpid"
在預設情況下,如果硬體支援了EPT、VPID,則kvm_intel模組載入時預設開啟EPT和VPID特性,這樣KVM會預設使用它們
# cat /sys/module/kvm_intel/parameters/ept
Y
# cat /sys/module/kvm_intel/parameters/vpid
Y
如果發現自己的環境沒有開啟可以通過
modprobe kvm_intel ept=1,vpid=1
來開啟
記憶體也是可以超配的(也稱為過載使用over-commit),只是我們一般不這樣做,但是有些測試環境可以採用一些技術來允許記憶體的超配使用。
當計算機的記憶體不足時,宿主機作業系統可以採用一些技術來幫助解決這個問題。以下是三種常見的技術:
1)記憶體交換(swapping):這是一種利用硬碟上的交換空間來暫時儲存不常用的記憶體資料的方法。當記憶體不足時,作業系統會將一部分資料從記憶體中移出,並儲存到硬碟上的交換空間中。這樣,作業系統可以騰出更多的記憶體供其他程式使用。當需要存取被交換出去的資料時,它們將被再次載入回記憶體。
概括:將記憶體中資料,擠掉不常用資料放在硬碟上來釋放記憶體空間。對應就是linux上Swap 分割區。
2)氣球(ballooning):這是一種在虛擬化環境中使用的技術。它通過在客戶機和宿主機之間共同作業來管理記憶體。當宿主機的記憶體資源緊張時,它會使用一個特殊的驅動程式,即virio_balloon驅動,在客戶機中釋放一些未使用的記憶體。這些被釋放的記憶體可以供其他需要的客戶機使用。
概括:物理機記憶體不足時,膨脹客戶機記憶體氣球,擠壓出空閒記憶體供物理機使用,同理客戶機記憶體不足時,壓縮記憶體氣球,釋放出記憶體供客戶機使用。
kvm虛擬機器器加上如下設定
在客戶機裡面進行驗證
3)頁共用(page sharing):當多個程序在客戶機上執行時,它們可能會使用相同的記憶體頁,例如程式碼或庫檔案。為了節省記憶體空間,作業系統可以使用KSM(Kernel Samepage Merging)技術將這些相同的記憶體頁合併為一個,並讓多個程序共用該頁。這樣,作業系統可以減少記憶體的使用,提高資源利用率。
缺點:利用 KSM 使記憶體超用。這會導致消耗一定的計算資源用於記憶體掃描,加重了 CPU 的消耗。記憶體超用,使得頻繁地使用 swap 互動,導致 VM 效能下降。
概括:在有多個客戶機使用相同的作業系統時,其會存在大量相同的記憶體頁,將這些記憶體頁合併,進而來減少記憶體佔用。但其頻繁的記憶體掃描,加重CPU的消耗,本質上是一種以CPU換記憶體的措施,生產中是建議關閉。
echo 0 > /sys/kernel/mm/ksm/pages_shared
echo 0 > /sys/kernel/mm/ksm/pages_sharing
大頁記憶體是計算機系統中的一種記憶體管理機制,它將傳統的小塊記憶體(通常為4KB)組合成更大的記憶體塊(通常為2MB或1GB)。相比於小頁記憶體,大頁記憶體擁有更大的連續地址空間。
大頁記憶體的主要作用是改善系統的效能。這是因為在傳統的小頁記憶體中,每個頁面都需要額外的記憶體開銷來儲存頁表資訊。當系統處理大量的記憶體存取請求時,這些額外的開銷會導致快取不命中、TLB(Translation Lookaside Buffer)失效等問題,從而降低系統的效能。
通過使用大頁記憶體,系統可以減少頁表的數量和大小,從而降低了記憶體管理的開銷。這樣一來,系統在處理記憶體存取時可以更高效地利用快取和TLB,提高資料存取速度,減少對記憶體子系統的負載。特別是在需要大量連續記憶體的應用程式(如資料庫、虛擬化環境等)中,使用大頁記憶體可以顯著提升效能。
總而言之,大頁記憶體通過將小塊記憶體組合成更大的記憶體塊,減少了記憶體管理的開銷,提高了系統的效能,尤其適用於對連續記憶體需求較大的應用場景。
cat /sys/kernel/mm/transparent_hugepage/enabled
編輯 /etc/default/grub
#加上如下引數,這裡是開啟了大頁記憶體,大小為1G的大頁記憶體,有2頁,則大頁記憶體的總容量=1G*2
transparent_hugepage=always hugepagesz=1G hugepages=2
這裡先簡單介紹下大頁記憶體的載入,之後我們在DPDK的章節將會詳細介紹大頁記憶體的使用。