再議Hyper-V 動態內存管理和內存過量使用
實際操作中,慢慢成長起來的經驗將會成為一份可遇而不可求的金玉。幾年前,堅信虛擬化將會讓我們的IT運維變得隨心所欲,到現在我反而發現了這項全新業務的管理讓我們常常犯下新的錯誤。因為家庭中的一些瑣事,我退出了MVP連任申請(雖然已經連續3+1年享受這一榮耀),但我發現這和老方所來信中提供得那樣:“這并不意味著離開,我隨時會回來”。很早以前寫過一篇《用一份PPT開始你的Hyper-v虛擬化之旅》,我想還是應該延續接下來的討論。
內存過量和動態內存都是在追求虛擬機密度最大化
我們知道,在一個虛擬化的服務器環境中,缺乏足夠的物理內存,將會直接影響到虛擬機的設計密度,而設計時我們會將遷移所用的物理內存技術器精確到MB,當然這肯定還會影響到整個系統的投資回報率,內存成了虛擬化的短板。而后,我發現vSphere開始提供內存過量使用技術,這項技術可以讓VMware虛擬機使用超過物理主機實際的內存容量,而虛擬機的位置又可以根據業務時段的不同,在不同的父分區下蹭吃蹭喝。但慢慢的,我開始關注這項前所未有的虛擬特性,這是因為與之相比的機械磁盤速率實在低下,當使用過多的虛擬內存之時,虛擬機的性能直線下降,而這恰恰是我們在引入虛擬化之前盡量避免的一種錯誤設計。
還記得首次聽到“內存過量使用”這個術語時,有人大膽的提出了幾份觀點,但誰料想這些可能會引發今天挨板磚的局面。“內存過量使用”這個術語讓人曾經讓不熟悉虛擬化的人們有一種誤解,“內存溢出”?因為過量使用似乎意味著過度利用資源。實際上,其想法是,即便沒有物理內存來支持為系統配置的資源,也可以創建通常需要一定數量內存的多個虛擬機。基本上,借助內存過量使用技術,分配給物理主機上多個虛擬機的內存數量可以超過主機上的物理內存數量,這允許物理主機上可以有更大的虛擬機密度。
動態內存(Dynamic Memory)是微軟Hyper-V R2 SP1讓人雞凍的新增功能,由于改進了虛擬內存分配的機制,這便同樣可以增加虛擬機和主機之間的比率,也就是虛擬機密度。但毋容置疑,缺少軟件廠商的支持策略,比如一些黑心的應用程序仍然會擴大其內存需求,捆綁硬件來銷售,這些都可能限制這一優勢的發揮。
一些嘮叨和建議
非常贊同Brien Posey(MVP)說的:“Hyper-V 的內存管理是一種藝術!”
動態內存應該是一項創舉,但必須遵守微軟的Hyper-V最佳實踐指南,以避免虛擬機缺少內存管理的藝術。我在查閱了kb and lib資料并進行了有針對性的測試之后,希望以下幾點能對你的工作有些幫助:
當Hyper-V動態內存在一個虛擬機上被啟用以后,這個虛擬機能立刻斷定它需要多少內存。然后主機分配給虛擬機要求的數量,以及一些額外的容量來作為緩沖,如圖片中的“內存緩沖區”。如果一個主機中有多個虛擬機在運行,主機會自動在所有虛擬機間平衡內存的分配,圖片中的“內存權重”。

應該說,動態內存有時并非總是最佳選擇。有些虛擬機我們應該禁用動態內存,把這些資源基于哪些根據應用程序特性可真正獲益的虛擬機上啟用動態內存,這一點非常重要。除非你對于分析運行性能指標方面非常在行,正確分配這些值是異常困難的。可以演示軟件或使用負載測試工具去決定真實的內存需求,但是仍然有一些未知事件因為不是在生產環境,所以你需要長期摸索去使用動態內存容量規劃。
例如,如果配置windows server 2008 TS 網關采用的NAP 方案 ,TS Server和NPS可能在夜里需要非常多的內存,這是相反的業務峰值時間(回家加班的人還是很多,唉),內存需求快速下降。

還比如,對于一個虛擬的DNS或者AD主機,當它只需要512MB內存的時候,卻被分配了2GB內存,你就在浪費寶貴的主機資源了。但如果這是一臺我在DELL訪談中(《如何開啟你的虛擬化之路》)提到的學籍管理服務器,因為只是入選和離校時才達到高峰期,動態內存絕對是最佳的設計選擇。
還比如,有些SQL數據庫采用動態內存的這個行為加快了數據庫處理大量查詢信息時的速度,并且在靜態分配的世界中是可行的。可是對于動態內存分配來說,過量使用和動態內存絕對都會遇到一個問題:前面提到的磁盤速度和內存速度的對比。這些程序在非峰值時間你可能會看到內存水平下降,但是內存減少很可能性很少。因此,一些調用大型SQL數據庫的程序,你可以使用Hyper-V動態內存的最大內存設置來限制虛擬機的內存。你也可以在SQL數據庫中限制內存的消耗,當然,最好的做法是改善程序調用機制,或者采用“應用程序級別”來控制它們,而非是動態內存技術。
【編輯推薦】