Thursday, 10 April 2014

Memory Ballooning

VMware vSphere資源分配管理觀念入門

熊信彰
在虛擬化的世界裡,資源的分配與管理是很重要的課題,但也最容易被忽略或誤解。在此要介紹的是一些有關VMware vSphere虛擬化資源的重要觀念,主要內容為Virtual CPU、Memory的運作概念,以及VM的資源設定配置基礎,還有了解何謂資源池(Resource Pool)。
圖5的範例是整合了10個VM的ESX(i) host,因有了TPS技術,所以10GB的實體RAM並沒有被佔滿,依然還剩下25%可再利用。


▲圖5 整合10個VM的ESX(i) host。





Memory Ballooning

承上題,現在有10個VM在新採購的伺服器上運作,考量到實體記憶體還沒有被用滿,你決定再轉移5部老舊機器,P2V到新伺服器上。如今,這個ESX/ESXi host已經承載到15個VM。

假設這5部老舊機器的條件都不變,一樣需要耗費5GB的記憶體容量,照道理說,新伺服器只剩下25%(2.5GB)左右的記憶體,鐵定會造成實體記憶體不足的情況。

但是連續幾天的實際使用狀況,這15個VM依然運作順暢,沒有因為Memory導致的效能問題產生(在此不考慮Network、Disk I/O等其他因素)。這就令人更納悶了,為何會這樣?

這就是接下來要探討的問題—Balloon driver,也稱為Vmmemctl Driver。

在圖6裡,我們可以知道目前記憶體的使用量已經超過,可能在95%∼105%之間遊走,而一旦使用超過實體的RAM,就必須要拿硬碟空間來當作Swap,這意味著有部分VM的記憶體使用,其實是在硬碟上運作(黑色陰影部分)。


▲圖6 記憶體使用量在95%~105%之間遊走。


試想一下,如果是一般的PC使用情形,當電腦記憶體不足的時候,OS就會嘗試著將RAM裡面的資料放置到硬碟上暫存,自行做記憶體管理。

如果記憶體一直持續不足,就必須一直在硬碟做存取置換的動作,造成效能下降的狀況。當記憶體空間釋放出來以後,暫存於硬碟上的Page file就可以再寫回實體RAM,此時PC的效能就會回復正常。

但是,圖6(範例3)的情形由於已經是虛擬化的狀態,實體記憶體資源並非OS掌控。假設hypervisor分配給它2GB,VM就會認為自己有2GB的實體記憶體,但是一旦hypervisor沒有辦法給它這麼多,VM完全不會察覺自己已經沒有記憶體,它會持續的一直使用下去,而不會自行記憶體管理。

當它在沒有察覺到RAM不足的情況之下,此時VM「自認」還有足夠的記憶體而持續使用的部分,通通跑進硬碟裡。在硬碟的哪裡呢?就是vswp這個檔案(也稱為VMkernel Swap或Virtual Swap)。

這個檔案的大小恰好等於VM所配置的記憶體,而且當VM開機vswp檔案就會出現,VM關機就消失。這是hypervisor為了保證在Memory over-commit的情況之下,假使最壞的狀況,所有VM都還是能維持運作的一種手段。

不見得會用到,我們也不希望用到,但是必須先預留硬碟空間,以防止最壞的狀況:實體已經沒有一絲一毫的記憶體,但是VM仍要開機,這時運作的vRAM就全部在vswp這個檔案。

一旦大量的vRAM進入VMkernel Swap之後,這個時候的VM運作速度就會異常的緩慢,效能便會變非常的差。

為什麼呢?因為有些屬於核心程式是一定要保留在實體記憶體中運作,不應該在硬碟上面運作,但是由於VM不曉得記憶體不夠用,所以它並不會自行Paging,將該留在RAM的東西保留住。

那麼有沒有辦法讓VM察覺到自己的RAM不夠,而自己主動先做Paging機制呢?

Balloon driver的作用這時候就可以發揮了,當VM安裝好VMware tools的時候,就會有Balloon driver,平常這個氣球(Balloon)在實體記憶體充足的時候是不會啟動的。

當VM的RAM越要越多,VMkernel沒辦法再供應足夠實體記憶體的時候,這時它就會通知VMware tools現在記憶體是吃緊的狀態,無法再供應記憶體了,請VM自行先做記憶體管理吧!

這個時候VMware tools就會開始將氣球膨脹,慢慢越變越大,不斷地佔據VM的Available Memory,Guest OS就會發現到有一個應用程式一直在吃掉它的記憶體,就真正察覺到記憶體已經不夠用,便會自行先Paging,將部分vRAM的資料放置到硬碟Local Swap上面(例如Windows預設是「C:\pagefile.sys」),這樣的好處是不會先進VMkernel Swap,雖然結果都是在硬碟上面,但是效能卻是差很多。

這個氣球是空心的,當它就開始膨脹,就會佔據Guest OS原本的記憶體,使Guest OS自己開始做Swap,將部分資料放置於Disk,等到VMkernel又開始有實體記憶體可以分配給VM的時候,氣球就可以縮小體積,Guest OS便會察覺自己又有RAM了,於是會將硬碟上的資料再搬回來,恢復正常的效能(圖7)。


▲圖7 VMware Resource Management Guide


所以Balloon driver也可以用於當VMkernel要收回某個VM的記憶體而拿來支援別的VM時,VMkernel會去掃描是否有VM的RAM正處於閒置狀態,再藉由吹氣球的方式,強迫Guest OS釋放部分閒置的記憶體(Idle Memory)。 

http://www.netadmin.com.tw/article_content.aspx?sn=1206130001&jump=4