作者:范军 (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就会比较这些页面,在物理内存去除冗余,仅仅保留单个页面的信息。从而减少了物理内存的消耗。
在虚拟机上安装的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到其他有充足内存的主机。
参考:
VMMemory (vRAM) Sizing Considerations
Impactof host local VM swap on HA and DRS