虛擬化: 將 Hyper-V 的記憶體使用最佳化

動態記憶體是實用的功能,但是設定虛擬機器和主機伺服器時必須小心。

Brien M. Posey

一提到裝載虛擬工作負載,就整體效能來說,或許沒有任何硬體資源要比實體記憶體來得重要。 確保每台虛擬機器 (VM) 擁有所需的記憶體並且在過程中不浪費記憶體,是配置記憶體最基本的方式。 以下是配置用於 Microsoft Hyper-V 的記憶體時幾項重要的考量事項。

NUMA 考量

Hyper-V 的記憶體管理是一門藝術, 您必須確保為每台 VM 佈建足夠的記憶體量, 同時還必須避免指派高於 VM 真正所需的記憶體。

這麼做的原因似乎很明顯。 配置過多的記憶體給 VM 會限制您能夠配置給同部伺服器上其他 VM 的記憶體量。 而且,配置太多記憶體給 VM 有時候其實會阻礙其效能。

大多數的新伺服器都使用非統一記憶體存取 (NUMA) 記憶體。 NUMA 記憶體的設計是依處理器指派記憶體來提升效能。 每個專用的記憶體區塊稱為 NUMA 節點。 CPU 存取本機 NUMA 節點 (直接指派給該 CPU 的記憶體) 要比存取非本機 NUMA 節點快得多。

Windows Server 2008 和 2008 R2 的 Hyper-V 版本並不直接支援每個 NUMA 節點的記憶體相似性。 換句話說,您無法直接設定 VM 來使用特定的 NUMA 節點。 據傳,Windows Server 8 的 Hyper-V 版本具有此功能。 儘管如此,您還是可以採取步驟降低 VM 使用非本機 NUMA 節點的可能性。

秘訣是計算每個 NUMA 節點的大小。 例如,假設您的伺服器配備了兩顆 Octa 核心處理器和 128GB 的 RAM。 您可以把記憶體大小 (128GB) 除以 CPU 核心數 (16) 來計算 NUMA 節點大小。 就本例來說,NUMA 節點的大小是 8GB。

Hyper-V 尚未提供讓您指派特定的 NUMA 節點給特定的 VM 的功能。 但是,因為您知道這部伺服器有 8GB 的 NUMA 節點大小,所以您可以推測被指派超過 8GB 的 VM 肯定會用到多個 NUMA 節點的記憶體。 因此,將指派給 VM 的記憶體限制為 8GB 或更少 (就本例而言),可提高 VM 使用單一 NUMA 節點的記憶體的可能性,從而提升效能。

Hyper-V 額外負荷

說到記憶體管理,NUMA 節點並不是唯一的考量因素。 在您規劃各種方法來使用主機伺服器的記憶體時,將虛擬化相關的額外負荷列入考量份外重要。 關於虛擬化額外負荷有兩大考量。 首先,您必須為父磁碟分割保留一些記憶體。

對於 Hypervisor 您必須至少保留 300MB,而對於在根磁碟分割上執行的主機 OS,則至少必須保留 512MB。 不過,大多數最佳作法的準則都表示您應該為父磁碟分割保留 2GB。

您不應該把主機磁碟分割用於 Hyper-V 以外的用途 (不過您可以執行像是管理代理程式、備份代理程式和防火牆等安全性和基礎結構軟體)。 因此,2GB 的建議是假定您不會在父磁碟分割上執行任何額外的應用程式或伺服器角色。

Hyper-V 並不讓您將記憶體直接配置到主機磁碟分割。 它基本上是使用剩餘的記憶體。 因此,您必須記得保留 2GB 的主機伺服器記憶體不要配置,以供父磁碟分割使用。

來賓機器記憶體配置

關於虛擬化額外負荷,要考量的另一件事是,VM 會將少量的記憶體用於 Integration Services 和其他虛擬化相關的處理程序。 這方面的記憶體量並不顯著,所以除非您打算只提供每台 VM 最低限度的記憶體量,否則通常不必特別為它指派額外的記憶體。

擁有 1GB 或更少 RAM 的 VM 只會使用約 32MB 的記憶體來應付虛擬化相關的額外負荷。 每多 1GB 的 RAM,您應該多加 8MB。 舉例來說,擁有 2GB RAM 的 VM 會使用 40MB (32MB 外加 8MB) 的記憶體來應付虛擬化相關的額外負荷。 同樣地,擁有 4GB 記憶體的 VM 會喪失 64MB 的記憶體處理額外負荷。

動態記憶體

Windows Server 2008 R2 SP1 推出了一項全新的動態記憶體功能,可讓 VM 根據目前的工作負載以動態的方式取用記憶體。 這項功能也可以讓您過度認可伺服器的實體記憶體,來執行更多的 VM,這在過去可能必須採用其他方式才可行。 雖說動態記憶體有這些優點,但是堅守一些最佳作法的準則來避免 VM 記憶體匱乏是很重要的。

首先,使用動態記憶體不一定都是最佳的選擇。 您可以個別就 VM 啟用或停用動態記憶體。 重要的是,只在真正能夠受益的 VM 上啟用動態記憶體。

其中一項最重要的考量因素是 VM 上的工作負載。 如果 VM 上的應用程式是設計使用固定的記憶體量,那麼最好是給 VM 它所需的確切記憶體量,而不要使用動態記憶體。

同樣的原則也適用於記憶體需求極大的應用程式。 有些應用程式的設計是盡可能取用可用的記憶體。 如果允許這類應用程式使用動態記憶體,它們可能很快就會耗盡伺服器的實體記憶體。 就這種情況而言,為執行這類應用程式的 VM 指派固定的記憶體量會比較妥當。

最後,如果 VM 試圖使用多個 NUMA 節點的記憶體,可能會損及伺服器的效能。 因此,如果您的伺服器使用 NUMA 記憶體,並且效能是一大考量,最好是避免使用動態記憶體。

啟動 RAM

關於動態記憶體,最需要了解的重要概念之一是啟動 RAM。 使用動態記憶體時,您必須為每台 VM 指派啟動 RAM 的值。 這個值反映了 VM 在開機時最初會使用的實體記憶體量。 更重要的是,啟動 RAM 也代表了 VM 始終會取用的最低實體記憶體量。 VM 不能將其記憶體使用量降得比啟動 RAM 值還低。

有基於此,Microsoft 建議您避免為 VM 指派大量的啟動 RAM。 最好是以 VM 執行的 OS 做為設定啟動 RAM 的基準。 對於執行 Windows 7、Windows Vista、Windows Server 2008 和 Windows Server 2008 R2 的 VM,Microsoft 建議的啟動 RAM 是 512MB。 如果您的 VM 是要執行 Windows Server 2003 或 Windows Server 2003 R2,Microsoft 建議使用 128MB 的啟動 RAM。

VM 若要使用動態記憶體,該 VM 上執行的 OS 必須支援動態記憶體才行。 Windows XP 並不支援動態記憶體。 如果您試圖在設定使用動態記憶體的 VM 上執行 Windows XP,則 OS 將只能夠存取啟動 RAM。

往下繼續其他設定工作之前,請務必確保所有 VM 加總的啟動 RAM 不超過伺服器上安裝的實體 RAM。 否則,您將需要移除一些 VM,或增加記憶體。

您也應該考慮調整最大 RAM 值。 這個值代表著 VM 可以使用的實體記憶體上限。 Hyper-V 預設是將每台 VM 的最大 RAM 設定為 64GB。 如果您有些 VM 不需要這麼多的實體記憶體,那麼您應該將最大 RAM 設定為較低的值。

記憶體權重

使用動態記憶體整個背後的概念是讓您過度認可記憶體。 如此可讓您的 VM 在需要的時候存取所需的記憶體。 過度認可任何硬體資源最大的缺點是,您最後可能會把資源消耗殆盡。 就動態記憶體的案例來說,您的 VM 很有可能在已經取用所有可用的實體記憶體後還需要更多記憶體。

這個問題的長期解決方案是,確保您的伺服器配備足夠的記憶體,可滿足 VM 的需求。 而短期的解決方案則是排定記憶體使用的優先順序。

幾乎任何主機伺服器都有一些 VM 比其他 VM 重要。 Hyper-V 可讓您排定 VM 的優先順序,以便在發生實體記憶體短缺的情況下,將記憶體先配置給優先順序較高的 VM。 您可以調整 VM 的記憶體權重來排定 VM 所需的動態記憶體的優先順序。 記憶體權重較高的 VM 將比記憶體權重較低的 VM 優先。

您必須為每台使用動態記憶體的 VM 設定的另一項設定是記憶體緩衝區。 記憶體緩衝區設定控制著每台 VM 應該試著保留多少記憶體做為緩衝。 這個值是以百分比表示。 例如,如果 VM 使用 4GB 的認可記憶體,並且將記憶體緩衝區設為 50%,那麼 VM 最多可取用 6GB 的記憶體。

記憶體緩衝區並不保證緩衝區記憶體隨時可供 VM 使用。 它只是控制 VM 應該試著宣告多少記憶體。 值得注意的是,因為記憶體緩衝區是以百分比表示,所以記憶體緩衝的量會隨著 VM 當時使用的記憶體量而變化。 所有使用動態記憶體的 VM 開始都是使用最少的記憶體量, 然後根據工作負載對其記憶體所施加的壓力,動態地調整記憶體使用量。

記憶體設定

實際設定 VM 記憶體使用量的程序很簡單。 方法是開啟 Hyper-V Manager,以滑鼠右鍵按一下 VM (因為每台 VM 的記憶體都是分開管理), 從捷徑功能表選擇 [設定] 命令。 出現 [設定] 對話方塊時,按一下 [記憶體]。

Hyper-V 提供您要為 VM 配置靜態記憶體量,還是使用動態記憶體的選項 (請參閱 [圖 1])。 如果您選擇動態選項,則可以直接透過 [設定] 對話方塊調整啟動 RAM、最大 RAM、記憶體緩衝區和記憶體權重。

You can adjust the memory allocation for a virtual machine through the Settings dialog box

[圖 1] 您可以透過 [設定] 對話方快調整虛擬機器的記憶體配置。

如果主機伺服器的實體記憶體資源有限,通常需要取捨使用靜態還是動態記憶體。 靜態記憶體通常能提供較佳的整體效能 (假定配置了足夠的記憶體)。 而動態記憶體可能比較難處理,但是可使用的 VM 密度通常較高。

Brien Posey

**Brien Posey**是一名 MVP,也是技術文件自由作家,發表過數千篇文章和十幾本書。 您可以造訪 Posey 的網站:brienposey.com

相關內容