作者:范军 (Frank Fan) 新浪微博:@frankfan7
VM内存资源控制是如何实现的?它可能带来的影响是什么?本文从概念到实战来阐述如何做好虚拟机上内存资源控制。
一概念
Reservations预留了一部分物理内存供VM或者资源池使用。一旦VM或资源池的内存需求达到了Reservation的规定值,这部分内存就完全分配给该VM或资源池,不可以再分配出去。
Shares定义了在出现资源竞争的情况下,VM或者资源池可以获得资源的份额。比如VM1和VM2的份额比例是2:1,VM1比VM2有2倍的机会抢到资源。
Limits决定了VM可以最大使用的内存。这是通过VMware Tools中包括的BallooningDriver来实现的。
二 实例
上图摘自frank denneman的文章Impact of memory reservation.该图很好的解释了内存控制中几个重要参数的关系。MPN指MachinePage Number,是用来映射真实物理内存的。
假设一台ESXi主机有8G内存,我们为图中所示VM1设置2G内存,那么ConfiguredMemory是2G。然后设置1G reservation。还有VM2,VM3,VM4和VM5分别设置了2G内存。但没有设置Reservatin
在VM1启动时,可能需要使用的内存很少,还没有达到Reservation的值。那么这部分多余的内存,还是可以供Hyperviosr调度给其他VM使用的。如果VM1上的应用需要更多的内存,一旦达到Rerservation的值之后,图中所示的Guaranteed MPN注明这部分预留内存会一直分配给VM1,而不允许其他VM使用。
VM1-VM5的configured Memory总和是2*5=10G,而该主机真实物理内存仅有8G, 假设这时VM2-VM5上的应用所需要的活动内存(Active Memory)的总和小于8G,那么是没有任何性能的影响的。
假如Active Memory总和接近甚至大于8G,那么意味着物理内存短缺,可能会造成VM之间资源竞争。这时候Share的设置就发挥作用了。
为了简化的目的,我们假设ESXi为保证Hypervisor运行的内存,再加上5个VM的memoryOverhead总和是1G
可供所有VM分享的内存=8G主机内存-1G Overhead - VM1的1G Reservation=6G。假设VM1的share分配是High ,其他VM的share是Normal。那么这6G内存分配是:VM1:33% VM2:16% VM3: 16% VM4:16% VM5: 16%
那么剩余的Active Memory的缺口,只能靠Swapping来实现了。VM Swap File 是在VM启动时自动生成的。通常存放在VM的Home Directory。
VM Swap File Size = Configured memory �C memory reservation
上面VM1 的 Swap Size = 2G �C 1G = 1G
特别要区分VM Swapfile 和 OS Swap file,VMware Swapfile是Hypervisor用来弥补该VM对物理内存的需要,把暂时不用的信息从物理内存中取出,存放在disk上的Swapfile中。
三考虑因素
Reservation,Share和limit在什么情况下适合使用呢?建议尽量在Resource Pool中设置资源控制,因为在VM中设置会增加系统管理员的负担,同时可能对整个虚拟化平台带来一些影响。
Reservation
如果是个别VM上运行关键的应用,可以考虑Reservation。简单的做法是设置和ConfiguredMemory一样大小。但这可能造成不必要的资源浪费。道理很简单,reservation是保证了该VM的一部分物理内存需求,但意味着整个主机可以共享的物理内存减少了。可能影响到能够运行在该主机上的VM的个数。
比如该VM的Configured Memory是2G,其实活动的内存只有1G,如果一定要设置Reservation的话,最好设置为1G。
Share
仅仅在资源有竞争的情况下才会发挥作用。
Limit
在VM上设置Limit,意味着该VM不能充分使用ConfiguredMemory. 除非物理内存严重不足,不建议在VM上使用Limit。因为这有可能会造成资源不能被使用,也会增加排错的复杂性。
参考:
Impact of memory reservation.