VMware內存分配初探

【寫在前面的說明】

爲方便識別虛擬的資源和物理(或叫真實的)資源,本人文章中以小寫字母v前綴標識虛擬資源,小寫字母p前綴標識物理資源。例如:

vCPU = 虛擬CPU
pCPU = 物理CPU
vRAM = 虛擬機的內存,也稱之爲Guest OS配置內存(Configured Size),或者說GOS的物理內存
pRAM = 物理內存,也稱機器內存(Machine Memory),或主機物理內存(Host Physical Memory)

=============================================
VM的內存資源分配,有3個可以配置的項:Limit,Reservation和Shares

【Memory Limit】

Memory Limit,顧名思義,內存上限,就是Host可以分配給此VM的pRAM數的上限。
默認情況下是選中unlimited複選框的,也就是不設上限。不設上限不意味着沒有上限,隱含的上限值是分配給VM的內存值。

Q: 什麼情況下要設置Memory Limit呢?(或者說Memory Limt有什麼好處?)
A: 一般情況下不用設置Memory Limt。

Limit通常用來管理用戶預期。開始的時候,Host上的VM數量比較少,沒有資源爭用,因此VM的性能完全可以保證; 隨後,當一臺又一臺VM創建出來,對於資源的爭用漸漸變的頻繁起來。於是VM的性能下降了,用戶便會產生抱怨。因此,設置limit可以從一開始就限定 VM的性能,也就是讓用戶一開始就覺得他的VM就應該是這樣的性能,當VM數量增加的時候,也不會感覺到性能的下降。當然,Memory Limit設置在什麼數值比較合理應該具體情況具體分析。

那爲啥不把VM的內存(Configured Size)設小呢?這也是考慮用戶心理。有用戶會覺得自己的應用就是需要4GB內存,雖然我們經過分析得出的結論是只需要1GB內存就夠了,但是爲了考慮 用戶的感受,就給他設置VM的內存爲4GB,於是用戶看見自己的OS顯示有4GB內存,就很滿意,但是他不知道的是我們給他的VM設置了1GB 的Memory Limt,這樣,既保證了Host的資源可以更合理的利用,又讓用戶感到滿意。

當用戶的應用越來越頻繁,其對內存的需求增加的時候,這時再來調整Memory limt,以滿足其對性能的要求。調整Memory Limt無需停機,而如果開始時虛擬機的內存設的小了,此時調整內存數量就要停機了。設置Memory limt的好處就在於減少了不必要的downtime。

調整memory limit的動作,其實就是通知Hypervisor將某一VM可用的pRAM放大,而無需通知GOS,所以無需GOS重啓。(簡單的說,就是改Hypervisor,而和GOS無關)
 
專用名詞解釋 Configured Size
Configured Size可以翻譯成配置內存,就是用戶在創建一個VM的時候設定的內存值,也是Guest OS認爲自己擁有的內存值。Configured Size在VM看來就是自己可用內存的總量,有的時候我們也稱之爲Guest Physical Memory。如果
 

【Memory Reservation】

Memory Reservation就是給一臺VM保留的內存。這些pRAM將被佔用,只能用於此VM,而不會被重新分配。VM默認的Memory Reservation是0,也就是不保留內存。如果給1臺VM配置了1GB內存,但是Memory Reservation是默認的0MB,也就是說沒有給這臺VM分配任何專屬的pRAM,那麼這臺VM的內存從哪裏獲得呢?答案是Swap(可以翻譯爲交換文件),也叫VMKernel swap,這是一個存放在硬盤資源上的交換文件(擴展名爲vswp),這個swap文件大小在默認情況下等同於VM設定內存的大小。

所以,即使1臺VM沒有獲得任何pRAM,它還是可以運行的,因爲從VM Guest OS看來,自己還是有RAM的,這個RAM就是硬盤上的swap文件。

但是,我們知道,硬盤的訪問是一種機械運動(注:非SSD硬盤情況下),速度要遠遠比物理內存慢。慢到什麼程度呢?RAM速度大概是納秒級的,而硬盤的速度是毫秒級的,2者相差近100萬倍。所以使用swap越多,速度就越慢。對Windows Paging技術熟悉的同學們一定知道,缺少內存的電腦速度非常之慢,主要就是因爲經常訪問存放在硬盤上的pagefile,這種問題的解決方案就一定是添加物理內存。對於VM也是如此,如果大量使用swap,VM一定會顯得非常之慢。

那麼當ESX/ESXi還有可用內存的情況下,VM是不是還一定要用swap當內存呢?
答案是不用。Memory Reservation爲0的VM沒有專屬的pRAM,但並不意味着這臺VM沒有物理內存可以用,只是沒有獨佔某些物理內存而已,在共享物理內存池中的內 存還是可以使用的。VMware ESX/ESXi在物理內存資源充足的情況下,總是會給VM分配足額的pRAM,因此VM無需使用Swap,這保證了VM的運行速度。比如1臺可用物理內 存是3GB(忽略COS和Hypervisor所佔用的內存開銷)的ESX/ESXi主機上,運行了2臺VM,每臺VM各配置了1GB的內存,此時,共享 內存池中有3GB的內存,而實際需求只有2GB,因此2臺VM都能獲得1GB的pRAM。

當你給這2臺VM各自的Memory Reservation都設置成512MB的時候,這2臺VM將各自獲得512MB的專屬內存,也就是說,無論這2臺VM是否實際用到了這512MB內 存,這些內存都將保留給它們。此時,共享內存池中可用的內存就只有2GB了。當獲得了512MB專屬內存之後,VM就不需要1GB那麼大的swap了,而 只需要512MB的swap就足夠保證Guest OS不會沒有內存可用。所以此時的swap大小就只有512MB。如果繼續增大Memory Reservation到1GB,此時swap就爲0。

所以VM內存1GB可能有:

0MB的Memroy Reservation和1024MB的swap,或者
512MB的Memory Reservation和512MB的swap,或者
1024MB的Memory Reservation和0MB的swap

因此我們總結出以下公式:

VM的配置內存 (MB) = Swap文件大小 (MB) + Memory Reservation (MB)
(注:原文可參<vSphere resource mgmt guide> p31:"You must reserve swap space for any unreserved virtual machine memory (the difference between the reservation and the configured memory size) on per-virtual machine swap files.")

Q: 爲什麼要配置Memory Reservation?
A: 因爲硬盤內存的速度太慢,而保留一些物理內存給VM可以保證該VM能至少擁有一部分高速的pRAM資源。

Q: 那麼,是不是要給一臺VM配置等於其內存大小的Memory Reservation呢?
A: No,這是爲什麼呢?

這是因爲Memory Reservation設的越大,可共享的內存池中的內存也就越少,可配置的VM數量就越少。

還是拿上面的例子來說,如果每臺VM的Memory Reservation都是512MB的情況下,3GB的ESX/ESXi的主機最多隻能配置6臺VM(這是不考慮memory overhead的假想情況下,實踐情況可能不到6臺),如果Memory Reservation繼續增加到每臺VM 1GB,那就最多隻能配置3臺VM了。但是每臺VM實際在用內存數可能都沒那麼多,假設每臺VM在用內存的平均數只有256MB,這臺主機應該可以運行12臺VM,在做了Memory Reservation之後,就只能開啓3臺或者6臺的VM了。

Q:Memory Reservation的那部分內存是不是其他VM就無法使用?
A:不是絕對不能用。但是因爲Memory Reservation部分的內存不能被reclaim,所以當1臺VM開機的時候,如果當時使用的內存不到Memory reservation的大小,那多餘的部分還是可以被其他VM用的;但是當此VM佔用的內存達到過Memory Reservation的大小以後,這部分內存就不會交還到可以共享的內存pool中了,就不能再被其他VM用了。

【關於Swap的Q&A】

Q: Swap何時產生?何時消亡?
A: swap文件在一臺VM開機的時候生成,關機的時候被刪除。
 
Q: VM開機時,存放位置沒有足夠的空間來放置Swap,會發生什麼?
A: VM無法開機。

Q: Swap的大小?
A: Swap = VM Configured Memory Size - Memory Reservation
swap的大小是固定的,是靜態的,是預先分配好空間的,既不會變大也不會縮小。即使VM從來不去用它,也牢牢霸佔着磁盤 空間。大多數情況下,swap的利用率很低。(swap利用率高了就意味着VM缺少pRAM,就要想辦法調整內存設置,或者增加Host的物理內存,或者 調整配置以滿足VM需求)

Q: Swap的默認位置?
A: 和VM的文件 e.g. VMX, VMDK等在同一目錄下

Q: Swap的位置可以改變麼?爲什麼?
A: 可以改,但不建議改。

Swap的存放位置可以改到共享存儲的另外的位置,或者Host本地存儲的某個位置(Host-local方式)。 但是Host-local有個缺點,就是會影響到VMotion的效率,因爲在Host本地存儲的Swap文件必須在VMotion的時候遷移到另外的主 機上;而swap如果是在共享存儲上的話,就不需要移動。

Q: Host-local Swap如何設置?如果修改默認swap位置到Host-local?
A: 見vSphere Resouce Management Guide p31

關於host-local swap的更多精妙解釋,強烈推薦您讀以下Frank的這篇文章:http://frankdenneman.nl/2010/02/impact-of-host-local-vm-swap-on-ha-and-drs/

【Memory Shares】

Memory share簡單的說就是份額。當內存資源不足時,VM之間就會產生內存資源的爭用。Share就是用來設定VM在爭用時能夠獲得多少份額的內存。

還是拿前面的例子舉例。3GB pRAM的ESX/ESXi主機上配置了2臺VM,沒有配置Reservation,當它們都只有1GB內存的時候,這1GB都可以使用pRAM,現在讓我們把這2臺VM的內存增加到2GB。現在內存需求的總量是4GB了,VMware將如何分配內存?

首先要明確的是,內存資源只有在爭用的情況下才會用到share。上面2臺VM雖然都分配了2GB vRAM,但是如果其應用還是都只用到1GB的話,此時沒有爭用發生,share也就沒有發生作用。

當這2臺VM都請求2GB內存的時候,就發生了爭用。假設他們的share都是1000,那麼也就是說,我們把可用內存3GB分成2000份,每臺VM可以分到1000份。因此此時每臺VM可以獲得3GB*1000/2000=1.5GB的內存。

假設VM1用於開發,VM2用於生產,所以我們想把VM2的優先級別設高,便調整VM2的share爲2000。此時VM1將獲得3GB*1000/(1000+2000)=1GB內存。而VM2將獲得3GB*2000/(1000+2000)=2GB的物理內存。

當我們調整VM1的share爲500,VM2的share爲2000. 此時,根據計算,VM2爭用獲得的內存是3GB*2000/(500+2000)=2.4GB,而VM1將獲得3GB*500 /(500+2000)=0.6GB。對嗎?且慢,還記得內存limit隱含的上限是VM的配置內存嗎?VM2只配置了2GB內存,因此最多只用到2GB 內存。所以VM2還是隻用2GB內存,而VM1可以使用剩下的1GB內存。

本文出自 “delxu的Live記事本” 博客,請務必保留此出處http://delxu.blog.51cto.com/975660/281559
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章