共享(sharing)和過量使用(overcommitment)這兩種內存管理技術都能夠幫助提升系統整合性,但是在使用它們之前,管理員應該首先了解二者之間的細微差別。
一臺服務器能夠支持的虛擬機數量通常取決于物理硬件所能夠提供的可用計算資源。大多數資源,比如處理器周期、存儲I/O和網絡帶寬等,都能夠相對簡單地進行共享。這種做法的原理在于負載并不總是處于忙碌狀態,因此共享——或者過度使用——資源能夠實現更高等級的負載整合,因此為虛擬機分配的資源總量和可以超過當前物理資源的總數量;就算在特殊情況下出現問題,也只不過是對負載性能產生輕微影響。
然而 ,服務器內存一直以來都被視為一種固定資源。由于每臺運行在內存當中的虛擬機都是應用程序和數據集合的完整鏡像,因此為所有虛擬機提供足夠的內存資源是十分重要的。否則,服務器將不得不使用硬盤上的交換文件(swap file)來補充內存空間——但是通常這種方式會對虛擬機的性能造成極為嚴重的影響。但是隨著內存過度使用和內存共享技術的出現,這種情況正在發生改變。
借助于內存過度使用技術,主機服務器所分配的內存數量可以超過現有的物理內存數量。比如,假設一臺主機服務器擁有4GB物理內存,那么借助于內存過度使用技術也許可以創建六臺內存為1GB的虛擬機。乍看之下,這是一種非常危險的方式,因為兩種負載不能同時共享相同內存地址空間當中的不同數據片——至少在將數據交換到硬盤之前是不可以的。
但是設計者很快意識到許多虛擬機并不會使用為其分配的全部內存空間,導致部分內存空間基本上被浪費了,因為一直處于空閑或者未使用狀態。Hypervisor能夠尋找處于空閑狀態的內存,并且將其提供給需要使用的虛擬機。如果沒有其他虛擬機需要額外的內存,那么這些空閑空間可以被用來創建新的虛擬機。可以在“共享(Shares)”虛擬內存配置當中定義虛擬機在內存池當中的優先級,并且還可以通過“預留(Reservation)”機制定義虛擬機能夠使用的最小內存空間,保證虛擬機擁有足夠內存以正常運行。
虛擬機還能夠共享大量內容。比如,上面提到的六臺1GB內存虛擬機全部運行Windows Server 2012 R2,其中兩臺虛擬機運行相同的業務應用。那么在這種情況下,五臺Windows Server 2012 R2和一個應用程序就是冗余的。內存共享技術允許不同虛擬機使用相同內存頁面當中的一個通用實例。這樣就能夠減少虛擬機需要使用的內存總數量,并且支持更高等級的過度使用。內存共享技術的實現方式非常類似于硬盤存儲當中的數據去重復化機制。
需要特別注意的是內存過度使用和內存共享都是高度動態的技術,會受到總計算負載和通用內容數量的影響。比如,很少使用的虛擬機能夠為內存過度使用釋放大量內存空間,但是隨著虛擬機使用頻率的增加和內存需求的增長,hypervisor必須將這些內存返還給虛擬機,否則就會面臨使用硬盤交換文件所帶來的性能問題。類似地,使用不同操作系統版本、應用程序和數據的虛擬機也許只有很少能夠共享的通用內存頁面。虛擬機遷移和負載均衡會改變通用內存頁面,對內存共享產生影響。