[Virtualization]ESXi體系結構與記憶體管理(三)控制記憶體分配
3 高階記憶體技術
為了更加充分地利用有限的記憶體資源,提高ESXi主機在記憶體壓力過大時的系統穩定性,ESXi引入了空閒記憶體稅(IMT)、透明頁共享(TPS)、記憶體膨脹(Ballooning)、交換(Swapping)和記憶體壓縮(Compressing)五種高階記憶體管理技術。這些技術並不是始終處於工作狀態,工作與否依賴於主機記憶體使用的狀態。圖 2展示了各技術啟用工作與記憶體使用狀態的關係,其中記憶體使用狀態定義了四個等級:High、Soft、Hard和Low。不同等級依據主機當前可用記憶體與總記憶體的比例劃分,在ESXi 5上,四個等級的預設配置分別為總記憶體的6%、4%、2%和1%。
圖 2 記憶體回收
3.1 空閒記憶體稅
空閒記憶體稅(Idle Memory Tax,IMT)是為了防止虛擬機器累計閒置記憶體的技術。當虛擬機器未使用當前已分配的所有記憶體時,ESXi對閒置記憶體的消耗量大於對正在使用記憶體的消耗量,也就是說ESXi會讓空閒記憶體付出更多代價。
3.2 透明頁共享
透明頁共享(Transparent Page Sharing,TPS)技術允許同一塊記憶體頁在虛擬機器之間進行共享,以減少所需的記憶體頁總量。記憶體塊比較首先通過計算雜湊,雜湊一致再進行完整頁比較,當確定頁面完全相同時,VMX將會透明地重對映虛擬機器的記憶體頁面,以便共享相同的實體記憶體頁。通常情況下,ESXi工作在4 KB記憶體頁面上,透明頁共享會應用在所有記憶體頁面上。但是在某些具有硬體支援的特殊情況下,VMX會使用2 MB記憶體大頁面,ESXi不會共享這些大頁面。
3.3 記憶體膨脹
記憶體膨脹(Ballooning)是ESXi主機回收虛擬機器空閒記憶體的技術。膨脹技術實現需要安裝在客戶機作業系統上的記憶體虛擬增長驅動程式(vmmemctl,VMware工具的組成部分)支援。當ESXi主機執行的實體記憶體壓力過大時,VMX會控制驅動程式向客戶機作業系統請求記憶體,作業系統分配給驅動程式的記憶體最終將通過VMX提供給其它虛擬機器使用;當ESXi主機的記憶體壓力緩解時,驅動程式就會釋放記憶體,把記憶體返還給客戶機作業系統。由於其工作過程與氣球相似,記憶體虛擬增長驅動程式在某些文獻中也被稱為“氣球驅動程式”。
3.4 交換
交換(Swapping)也是ESXi主機回收虛擬機器空閒記憶體的技術。這裡介紹的交換技術不同於客戶機作業系統上的常規交換,而是特指ESXi主機上利用交換檔案(*.vswp)實現的交換。通常情況,只有當vmmemctl驅動程式不可用或未響應時,ESXi主機才會使用交換技術從虛擬機器中強制回收記憶體。由於交換不考慮客戶機作業系統是否使用這些頁面,且磁碟比記憶體的響應時間慢上千倍,因此採用交換技術將顯著影響客戶機作業系統的效能。
3.5 記憶體壓縮
記憶體壓縮(Memory Compression)可在ESXi主機使用交換技術時,減少必須交換到磁碟的頁面數量,從而改進虛擬機器效能。當需要交換頁面時,ESXi會首先嚐試壓縮虛擬頁面,將壓縮至2 KB甚至更小的頁面儲存在虛擬機器的壓縮快取中。由於訪問壓縮快取比訪問交換檔案更快,因此利用記憶體壓縮技術,不會顯著影響虛擬機器效能。
4 小 結
虛擬化技術的顯著優點就是能夠根據虛擬機器的實際效能需求動態分配資源。為了充分利用資源、解決資源壓力過大時的主機穩定性和虛擬機器競爭問題,ESXi提供了一整套記憶體分配控制和高階記憶體管理技術。讀者若想進一步瞭解文中介紹的內容,強烈建議查閱VMware官方文件。
5 參考文獻
[1] Charu Chaubal.The Architecture of VMware ESXi.20081024 WP-030-PRD-02-03.VMware,2007
[2] Forbes Guthrie and Scott Lowe. VMware vSphere Design 2nd Edition.SYBEX,2013
[3] Scott Lowe等著.趙俐,曾少寧譯.精通VMware vSphere 5.5[M].北京:人民郵電出版社,2015
[4] vSphere資源管理 ESXi 5.5 U2.ZH_CN-001584-00.VMware,2014
相關文章
- [Virtualization]ESXi體系結構與記憶體管理(二)控制記憶體分配記憶體
- [Virtualization]ESXi體系結構與記憶體管理(一)體系結構記憶體
- oracle記憶體結構與管理Oracle記憶體
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- C語言-記憶體管理之一[記憶體分配]C語言記憶體
- 垃圾收集器與記憶體分配策略_記憶體分配策略記憶體
- MySQL記憶體管理,記憶體分配器和作業系統MySql記憶體作業系統
- Oracle記憶體體系結構Oracle記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- Go:記憶體管理與記憶體清理Go記憶體
- 控制C++的記憶體分配C++記憶體
- JVM 記憶體模型 記憶體分配,JVM鎖JVM記憶體模型
- 記憶體管理 記憶體管理概述記憶體
- Oracle體系結構之-記憶體結構Oracle記憶體
- STM32記憶體結構介紹和FreeRTOS記憶體分配技巧記憶體
- JavaScript記憶體分配JavaScript記憶體
- JVM記憶體分配JVM記憶體
- java記憶體分配Java記憶體
- 記憶體結構記憶體
- 垃圾回收與記憶體分配——總結篇記憶體
- 記憶體管理篇——實體記憶體的管理記憶體
- Python如何管理記憶體?記憶體分配機制是什麼?Python記憶體
- MySQL整體架構與記憶體結構MySql架構記憶體
- 【記憶體管理】記憶體佈局記憶體
- 自動共享記憶體管理 自動記憶體管理 手工記憶體管理記憶體
- C/C++使用malloc為結構體陣列分配記憶體(及free釋放記憶體)的三種方法C++結構體陣列記憶體
- 物件的建立與記憶體分配物件記憶體
- JVM GC 與 記憶體分配策略JVMGC記憶體
- Oracle記憶體分配與調整Oracle記憶體
- Oracle記憶體分配與使用(zt)Oracle記憶體
- PostgreSQL-PG的體系架構之記憶體管理(三)SQL架構記憶體
- 結構體記憶體對齊結構體記憶體
- 記憶體_管理總結記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- 探索iOS記憶體分配iOS記憶體
- Java 記憶體分配策略Java記憶體
- java jvm 記憶體分配JavaJVM記憶體
- [C++]記憶體分配C++記憶體