AHV Internals: Memory Overcommit | Nutanix



簡介

在虛擬化基礎架構中,相信大家對於「Memory Overcommit」機制應該很熟悉,簡單來說,透過 Memory Overcommit 機制,可以讓虛擬化基礎架構中的 VM 虛擬主機數量增加的一種技術,舉例來說,一台 Nutanix AHV 主機具備 128 GB 實體記憶體,但卻可以運作 10 台甚至 14 台,配置使用 16 GB Memory 的 VM 虛擬主機。

在本文中,將說明在 Nutanix HCI 超融合環境中,官方的最佳建議作法:
  • 建議,用於「測試或研發環境」(Test and Development environments)
  • 不建議,用於營運環境」(Production environments),因為可能會導致效能下降。





Ballooning 與 Swapping

如上所述,預設情況下,Nutanix 官方不建議啟用 AHV 的 Memory Overcommit 機制。那麼,在不啟用的情況下,AHV Hypervisor 是如何達成運作更多數量 VM 虛擬主機的目的? 答案就是透過 Ballooning 和 Swapping 機制。

首先,VM 虛擬主機必須確保已經安裝 VirtIO 驅動程式,那麼系統便會透過 VirtIO 驅動程式整合 Ballooning 機制,將 VM 虛擬主機中未使用到的記憶體空間,歸還給 AHV Hypervisor 以便提供給其它 VM 虛擬主機使用。

舉例來說,在下圖中可以看到,管理人員配置 3 台 20 GB 記憶體的 VM 虛擬主機,但是對於 AHV Hypervisor 來說只用了 40 GB 記憶體空間,這是怎麼辦到的? 簡單來說,Ballooning 機制會將 VM 虛擬主機中,記憶體的使用情況回報給 AHV Hypervisor,以便 AHV Hypervisor 可以收回 VM 虛擬主機中「未使用」到的記憶體空間後,提供給其它 VM 虛擬主機使用,達到動態配置記憶體的效果。


當然,如果 VM 虛擬主機需要使用到更多記憶體空間時,Ballooning 機制會通知 AHV Hypervisor 後,將剩餘可用的記憶體空間慢慢收回,並不影響 VM 虛擬主機的運作。然而,在資源爭奪強烈的環境中,可能 Ballooning 機制會來不及調度記憶體空間,並且超過 AHV Hypervisor 總記憶體空間時怎麼辦? 此時,就需要使用到 Swapping 機制了!

如下圖所示,當眾多 VM 虛擬主機因為同時忙碌,總共的記憶體使用空間,超過 AHV Hypervisor 實體記憶體空間時,將會採用「Least Recently Used (LRU)」演算法進行處理,並將不足的記憶體空間,透過 Host Swap 的方式,來滿足 VM 虛擬主機超用的記憶體需求。然而,因為是使用 Host Swap 的方式,給予 VM 虛擬主機記憶體,與實際使用記憶體空間在效能上有很大的差異。


因此,倘若管理人員發現 Host Swap 的情況經常發生時,首先應該考慮為 AHV 主機擴充實體記憶體空間,倘若無法擴充的情況下,則建議採用 VM 虛擬主機內的 Swap 機制,因為相比之下 Guest Swap 會比 Host Swap 來得有效率。

舉例來說,配置 VM 虛擬主機 20GB 記憶體時,會使用到 Host Swap 機制時,不如考慮配置成 VM 虛擬主機配置 10GB 記憶體,並搭配 VM 虛擬主機內作業系統的 Swap 機制 10GB Swap Disk 來滿足需求。





ADS 與 Memory Overcommit

接來下,談談啟用 Acropolis Dynamic Scheduler (ADS) 與 Memory Overcommit 的情境。在 AHV Hypervisor 具備 40GB 記憶體空間的環境中,配置 3 台 10GB 的  VM 虛擬主機,當需要啟動 1 台配置 15GB 的 VM 虛擬主機時,會發生什麼情況?

首先,AHV Hypervisor 會進行記憶體可用空間估算,假設 3 台 10GB 的  VM 虛擬主機,已經使用記憶體資源池 30GB 空間,當需要啟動 15GB 的 VM 虛擬主機時,先透過上述提到的 Ballooning 和 Swapping 機制,嘗試回收未被 VM 虛擬主機使用的記憶體空間,假設收回 5GB 記憶體空間,此時記憶體資源池降低為使用 25GB 空間,並透過 ADS 的 Initial Placement 機制,來啟動配置 15GB 的 VM 虛擬主機。






Memory Overcommit Ratio

預設情況下,每台 VM 虛擬主機,系統會確保至少有 25% 的記憶體空間來自 AHV Hypervisor 實體記憶體空間,表示透過 Ballooning + Swapping 機制,最多可以預留 VM 虛擬主機 75% 的虛擬記憶體。

當然,上述是理想的情況下,實際則是在配置 4 台 10GB VM 虛擬主機的環境中,每台 VM 虛擬主機最大化縮小至使用 25% 的記憶體空間,所以使用 AHV Hypervisor 記憶體資源池 10GB。

此時,可以在啟動 3 台配置 10GB 的 VM 虛擬主機,因為 VM 虛擬主機剛啟動時,需要使用全部的記憶體空間,但開機完成後經過一段時間,便可以透過 Ballooning + Swapping 機制,收回未使用的記憶體空間,提供給更多 VM 虛擬主機使用。

如下表所示,可以看到在 AHV Hypervisor 擁有 40GB 實體記憶體,然後每台 VM 虛擬主機配置 10GB 虛擬記憶體的情境下,最大可以達到 3.25 倍的集縮比,運作配置 10GB 虛擬記憶體最多達 13 台 VM 虛擬主機。


值得注意的是,上述表格中的估算,是假設 Nutanix 叢集未啟用 High Availability (HA) 高可用性機制,倘若啟用 HA 高可用性機制後,系統為了保留系統資源以便因應故障事件,所以集縮比將會下降至 1.33 倍





Upgrades 和 Live Migrations

在 AHV 升級過程中,通常會先將 AHV 主機進入維護模式,當升級程序執行完畢後,AHV 主機需要重新啟動以便套用生效,但在此之前必須將運作其上的 VM 虛擬主機,透過 ADS Live Migration 線上遷移至其它 AHV 主機繼續運作。 

倘若,有啟用 Guaranteed HA 功能,那麼每台 VM 虛擬主機要遷移的目地端 AHV 已經確認,系統就會直接將 VM 虛擬主機線上遷移過去,倘若未啟用 Guaranteed HA 功能的話,AHV 會識別每台 VM 虛擬主機適合運作的 AHV 主機環境。

因為線上遷移 VM 虛擬主機時,牽涉到記憶體複製的動作,並且要使用所有的實體記憶體空間。因此,倘若有啟用 Memory Overcommit 機制的 VM 虛擬主機,因為使用的記憶體空間並非全部都是實體記憶體空間,便會導致遷移時間較久。

簡單來說,「未啟用」Memory Overcommit 機制的 VM 虛擬主機,可以在較短時間遷移完畢,而「已啟用」Memory Overcommit 機制的 VM 虛擬主機,則因為要將 Swapping 空間寫回實體記憶體中,導致遷移時間較長並影響效能,這也是 ADS 在計算遷移時,啟用 Memory Overcommit 機制的 VM 虛擬主機,會是較高遷移成本的原因。






參考資源