图解VMware

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内存。

关于VMware Memory分配机制的进一步探讨,敬请期待续篇。



在写《 VMware内存机制初探》 之后,原本是计划写一篇《VMware内存机制再探》的,讲一讲VMware内存机制中的另外几个重要内容,比如透明内存共享(TPS,  Transparent Page Sharing), Relaim Memory, Ballooning,  swapping等等。但有网友反映说前面的文章还是不好懂。于是想,如果如同官方文档那样条条框框地列出来,那还不如大家都去看原版手册呢,所以有了这 么一篇东西。

首先,大家要记住,在内存没有过量配置(Memory  Overcommitment)的情况下,内存的调度机制完全不会启动,就没有Reclaim内存。很明显嘛,主机总的物理内存(Host  Physical Memory)大于所有虚机配置内存的总额的情况下,每台虚机想要多少内存,都能得到满足,当然不需要调度。

所以,以下探讨的VMware的内存机制,都是在内存过量配置的情况下发生的。

我的故事发生在一个有智慧的水池(Host)中,水池有不少水(4GB物理内存),里面还有2个水箱(配置了2台VM),水箱有一定的容量(配置内存是4GB),原本是空的(没有开机)。
snap0049

但是现在水箱1里面要养鱼了,必须放点水进去以便鱼可以存活(开机了)。最少需要1GB内存。于是水箱1(VM1)就向水池(Host)要水(物理内存),水池里面有足够的水,就满足了水箱1的要求。现在水箱1有1GB的活水,而水池里面只剩下3GB的水了。
snap0050
现在我们又向水箱1里面多丢了些鱼(启动新的应用),原来1GB的水不够用了,于是水箱1就继续向水池要水,水池里面还有足够的水,就又满足了水箱1的要求。现在水箱1里面有3GB的水,而水池里面只剩下1GB的水了。    


解释:要注意的是,此时VM1里面的应用程序都是活动的(active),所以这些内存都属于活跃状态,叫做活动内存(Active Memory)。
snap0051
经过了一段时间以后,水箱1里面的鱼被捕走了,现在水箱1不需要那么多水也足够养活剩下的鱼了。但是水池并不知道水箱1的状况。于是水箱1还是有那么多水。

解释:
VM1 的某些应用结束后,释放了部分内存,但是这些内存释放动作是在VM的Guest  OS层面释放的,因此Host并不知道有内存被释放了,这些内存没有归还Host,仍然由VM1霸占着。VM1中就有一部分内存属于idle,另外一些正 在使用的内存就是active memory。当然,就VM1自己的GOS看起来,有3GB空闲内存(idle  memory),1GB的活动内存;而此时就Host看来,只看见有3GB内存是分配给了VM1的。Host通过VMware  Tools中的驱动,每隔一定的时间(ESX4中默认是60秒,ESX3中默认是30秒)去扫描一下VM1的内存使用状态,以便了解它到底有多少活动内存 (active memory)

snap0052
此时,我们开始在水箱2中养鱼了(VM2开机),水箱2也开始从水池中抽水。但是水池里面的水不能枯竭,因此水池有警戒水位,第一条警戒水位是6%,当下降到第一警戒水位以下并仍然在不停下降时,就要开动其他机制从其他水箱反抽水。

解释:
VM2 开机时也需要1GB内存,在启动时,它也不断向Host请求内存。Host则将自己的内存源源不断地分配给VM2,直到下降到第一条警戒位6%。Host 内存有4种状态,分别是High, Soft, Hard和Low,它们间的分界线分别是6%, 4%,  2%和1%。可用内存高于6%时,不会启动Balloon或Swap机制。当低于6%并往4%逼近的时候(soft状态),Balloon机制就启动了。 (关于内存的4种状态的更多解释,请参阅官方文档《Understanding Memory Resource Management in VMware ESX Server》。如何查看这4种状态?可以用esxtop或者resxtop)

image
那到底向哪个水箱抽水呢?谁的水最富裕就向谁抽。

解释:
如何判断呢?刚才我们说过,Host每隔一定时间就会扫描Guest OS的内存使用状况,此时,Host会计算每个VM的份额内存比ρρ和VM的空闲内存还有空闲内存税(IMT, Idel Memory Tax)密切相关,对ρ最小的那台虚机启动气球驱动(balloon driver),气球开始膨胀(inflating)。关于ρ和IMT的算法,请参见本人博文《 空闲内存税的算法 》。

snap0054
于是,气球开始膨胀,并将多余的水挤出水箱。

解 释:Balloon驱动如同普通驱动那样,不断向Guest OS索取内存,Guest  OS尽自己可能满足气球驱动,并优先将空闲部分的内存分配给它,注意,此时可能出现Guest OS自己的物理内存不足,并引起Guest  OS的paging机制,将一部分内存page  out到自己的swap中。这个例子中,VM1还有很多空闲内存,因此足够让主机回收并满足VM2的需求。

主机将比较气球膨胀获得的这部分内存的地址,如果原先是分配给VM1独享的,(也就是没有TPS共享),那么就可以收回。主机将不停的通过气球驱动收回内存,收回的目标是保持至少6%的内存。这个回收内存的过程就叫Reclaim。

注意:此时内存没有出现争用情况,因此shares仍然没有起作用,但是Overcommitment是存在的,所以会有reclaim,会有ballooning。
snap0056
Ballooning回收内存是比较慢的,通常需要几分钟。

如 果主机可用内存池的内存减少速度大于气球驱动返还主机的内存,那么可用内存会进一步下降,当突破4%的第2警戒线时,进入到hard状态,主机就会启用第 2种reclaim机制——swapping,将VM1的一部分物理内存交换到swap文件中,以加快回收内存的速度。目的是将可用内存保持在4%的警戒 线以上。

如果可用内存继续下降到2%以下,进入到low状态的时候,ESX不仅会继续加速Swapping,还会阻止其上所有VM的内存请求。

现 在,情况又发生了变化,水箱2中的鱼越来越多了,它不停地向水池要水,而水池也通过气球驱动,不停地将水箱1中的空闲内存挤出来,直到水箱1和2的总需求 量大于了水池能供给的水量。水池再也不能提供更多的水了,只能部分满足2个水箱的要求了。不够的部分怎么办?用一些脏水(swap)来满足。脏水虽然脏 (swap内存速度很慢),鱼在脏水里面生存的很困难,但毕竟还是有水的,不至于因为没有足够的水而导致鱼死掉。
snap0058

此时,VM1和VM2的active memory由2部分组成,1部分是获得的主机物理内存,另一部分是swap。请注意,Guest OS是不知道自己的一部分物理内存是硬盘上的swap文件的。

当 机器内存不足竞争开始的时候,shares开始起作用。但是,请注意,如果IMT是0,对空闲内存不征税,由于4GB的VM1和4GB的VM2的份额都是 40960,因此它们最终会拿到相同的物理内存2GB。但是如果IMT是默认值,那么空闲内存的代价更大,那么这2台VM会根据active内存数量的不 同,获得不同数量的物理内存。
【本文的知识要点回顾】

(1) 在内存没有过量配置(Memory Overcommitment)的情况下,不需要Reclaim内存     
(2) 什么时候开始Reclaim内存?当突破6%的警戒线,内存状态从High变成了Soft的时候     
(3) Reclaim优先用Ballooning,只有Ballooning不够用的时候,才会用Swapping     
(4) 什么时候开始swapping? 当主机可用内存跌破4%警戒线,内存状态变成Hard的时候     
(5) Host无法知道VM内的哪些内存块已经处于空闲(idle)状态。必须用Ballooning才能收回空闲内存。     
(6) 尽量避免资源争用,否则造成的Chasing-the-tail效应,会导致更严重的性能负面影响。

【参考文档】

(1) Carl, A. Waldspurger, 2002,  Memory Resource Management in VMware ESX Server
http://waldspurger.org/carl/papers/esx-mem-osdi02.pdf
(2) VMware Inc.   Understanding Memory Resource Management in VMware ESX Server
http://www.vmware.com/files/pdf/perf-vsphere-memory_management.pdf      
(3
) VMware Inc.   Understanding Host & Guest Memory Usage (2007)      
http://mylearn.vmware.com/courseware/12400/PS_TA21_288707_166-1_FIN_v3.pdf
(4) Idel memory tax     
http://www.boche.net/blog/index.php/2009/01/29/idle-memory-tax/

本文出自 “delxu的Live记事本” 博客,请务必保留此出处http://delxu.blog.51cto.com/975660/288682

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值