作者:範軍 (Frank Fan) 新浪微網誌:@frankfan7
虛拟機需要配置多大的記憶體合适?怎樣才能最佳利用主機的實體記憶體?怎麼把握Over-Commitment的度?本文從概念到實戰來闡述如何做好虛拟機上記憶體資源規劃。
一如何配置設定記憶體?
首先我們明确一些概念。

上圖分三層,他們分别是是App層,OS層和Hypervisor層。對于實體伺服器而言,所有的記憶體資源都配置設定給單獨的作業系統和上面運作的應用。應用将請求先發送給作業系統,然後作業系統排程實體的記憶體資源。
我們以下面一個場景為例,來分析記憶體在各層中是如何配置設定的。
假設我們先啟動ESXi主機,這時Hypervisor加載實體記憶體,這和任何其他作業系統加載實體記憶體的原理一樣。在這一層Hypervisor加載的記憶體稱作“Machine memory”。然後我們在該ESXi主機上建立了虛拟機,并為其設定4G記憶體(Configured Memory Size),這也稱為“Guest Physical Memory”,由于這是Virtual Hardware為該虛拟機所配置設定的記憶體。對于作業系統而言,這和實體記憶體沒有差別,就認為自己是完全控制該4G記憶體的。然後我們啟動該VM,上面的OS開始運作。之後運作一個應用,該應用通過系統調用(syscall)向OS送出請求,然後獲得記憶體。這裡稱作“Virtual Memory”
上面說的是記憶體配置設定的過程,那麼記憶體是如何釋放的呢?
App通過系統調用告訴OS來釋放不需要的記憶體。可OS認為所有設定在虛拟機上的記憶體都是專門配置設定給自己的,并不會釋放Guest Physical Memory,而是建立一個Free List來記錄該記憶體是可以被重新配置設定的。而Hypervisor根本無法通路這個Free list。是以根本無法釋放實體記憶體。
二 Hypervisor如何釋放實體記憶體?
這下問題來了,根本别指望通過Guest來能釋放實體記憶體。那究竟Hypervisor是怎麼釋放記憶體的呢?主要有下面幾個技術:
TPS (Transparent Page Sharing)TPS預設是一直自動運作的。比如一台ESXi主機上運作多個虛拟機,他們的OS和App很類似,必然很多記憶體頁的内容是一樣的,Hypervisor就會比較這些頁面,在實體記憶體去除備援,僅僅保留單個頁面的資訊。進而減少了實體記憶體的消耗。
Blooning
在虛拟機上安裝的VMtools就包括了ballooningdriver。它告訴Hypervisor哪些不活動的記憶體頁面可以被收回。這對虛拟機上應用的性能是沒有任何影響的。關于Blooning技術的原理,delxu的博文圖解VMware記憶體機制解釋的非常清楚,贊一個。我在此不再贅述。
Compression:預設是啟動的。在啟動Swaping之前系統會嘗試将虛拟記憶體頁面壓縮,如果小于2KB,可以儲存在虛拟機的Comression Cache内。
Swapping:
如果在TPS,blooning和Compression都用上了的情況下,仍然有實體記憶體不足的情況。那麼不得已最後一招就是Swapping。因為頁面交換和Disk進行的,這對應用性能很可能造成大的負面影響。參見Frank Denneman博文Impactof host local VM swap on HA and DRS
三記憶體Over-commitment:
顧名思義,就是說配置設定出去的記憶體比實際擁有的記憶體多。那麼Over-commitment是如何衡量的呢?帶來的影響是什麼?
更多的關于記憶體的衡量名額參考:
http://www.vmware.com/support/developer/vc-sdk/visdk400pubs/ ReferenceGuide/memory_counters.html
上圖很好的解釋了在虛拟機這一層常用的一些與記憶體相關的術語和他們的關系。
這裡特别要注意的是Active Memory. 指的是虛拟機中應用經常通路的記憶體。它并不能等同于這個虛拟機最少需要的記憶體,可是它可以幫助你判斷該虛拟機的記憶體頁面的活動情況,以及在該虛拟機上運作的應用是繁忙還是空閑。
Configured MemoryOvercommitment = (Sum of VMs’ configured memory)/ Host memoryavailable for VMs
比方說ESXi主機實體記憶體是16G,運作6個VM,每個VM的Configured Memory是4G,那麼該值是(6*4)/16 = 1.5
Active MemoryOvercommitment = (Sum of VMs’ machineactive memory)/host memory available for VMs
ESXi主機實體記憶體是16G,運作6個VM,每個VM的Configured Memory是4G,假設每個VM的Active Memory是2.5G。那麼該值是(6*2.5)/16=0.93
在Configured MemoryOvercommitment > 1的時候,并不能說明什麼問題,也不能推斷出應用有性能下降。因為Hypervisor可以利用balloning,TPS和compression等方式把實體記憶體釋放。一般來講,這個值超過1.5甚至更多,可以最大化的利用好實體記憶體。
Active MemoryOvercommitment 接近1的時候,就需要格外注意了。有可能某些應用已經瀕臨性能下降的邊緣。ESXi主機的實體記憶體肯能已經不能滿足Active Memory的需要了。這時需要把一些VM vMotion到其他有充足記憶體的主機。
參考:
Vmworldsession 2010 TA7750
VMMemory (vRAM) Sizing Considerations
圖解VMware記憶體機制
Impactof host local VM swap on HA and DRS