动态内存(Dynamic memory)是微软应对虚拟化中常见问题所做的努力:如何有效地分配内存给不是一直需要它的虚拟机。
内存一直是人们最先耗尽的关键资源。结果是,缺少内存会是固结率低的起源。压力还来自于某些应用所有人,他们为应用索要尽可能多的内存,即使是没有必要分配他们需要的内存量。
在理想世界中,用户能分配大量内存并在需要使用这些内存时按需使用它们。有时候Hyper-V的情况并不如此:如果在虚拟机启动时给它分配4GB内存,不管它需不需要,它占有这4GB的内存,在VM关闭之前它不会把内存返还给Hyper-V。这不可避免地会导致固结率低于微软的竞争者,这也让它很难以有效的方式分配内存。
随着Hyper-V R2 SP1的发布,微软添加了动态内存支持,这和它主要的竞争产品VMware ESX中利用的内存过量使用(memory over-commitment)非常不一样。微软长时间声称,虚拟机承担的内存超过物理量很危险,因为所有这些虚拟机也许同时需要分配。不管这是否是真实情况,我们一般在其它IT领域使用超额认购(over-subscription),如存储,微软的立场在微软社区得到应用。
动态内存本质上平衡了来宾操作系统的管理系统功能来达成其目的。它主要依赖于大部分现代服务器和操作系统的容量来实现实时的内存添加和移除。动态内存背负该功能,允许Hyper-V在虚拟机运行时在其上添加或移除内存。一旦服务器启动,Hyper-V显示一池免费内存。虚拟机都是从这个池中分配内存。如果Hyper-V主机本身需要更多内存,也可以用恰好相同的方式增加。动态内存和内存过量使用不同,因为Hyper-V会拒绝保证超过池中可用的物理内存。通过从来宾操作系统中平衡热添加和热移除功能来保证内存从虚拟机返回到系统。让我们来看看动态内存评价该方法功绩的要求。
首先,Hyper-V和现有的Windows虚拟机必须有应用其上的SP1。新版的Windows 7和Windows 2008 R2可能已经安装好了服务包。
另外,Hyper-V可以在每虚拟机的基础上完成,所有虚拟机都默认地与静态内存模式一致。
图1:VM内存分配
虚拟机都分配到启动量的内存用于启动程序。由于动态内存有赖于负载在来宾操作系统上的服务和驱动,需要一次只用于启动程序(图1)的内存分配。这是个自相矛盾的问题,在OS启动前没有动态内在,但是启动OS又需要内存。大部分人建议,用户分配大量启动内在来满足启动OS和用于它们正常运作的应用程序,留下动态内在来处理“爆发”需求。微软官方的说法是,用户只需分配足够的启动内存来满足OS的需求。
虚拟机必须设置最大的内存量,这为虚拟机可以从池中获得的内存量设了限制。最大的这个值可能是64GB。
最后,用户可以配置一个“内存缓冲区”,这是基于虚拟机承担量的额外分配。这个缓冲区是用来抵消所有由动态内存自身分配和向下分配程序引起的所有过量。所以实际的内存分配是承担内存加上这个内存缓冲。
这个缓冲默认是20%,所以如果一个虚拟机限额是16GB,且使用4GB的内存,那么要分配大概820MB(4GB的20%或总共4.8GB)。随着虚拟机内的内存需求增长,缓冲适当增长,直到到达配置最大量。如果从内存角度Hyper-V主机变得饱和,可以牺牲该缓冲,而主机可以首先为承担的内存需求服务。缓冲用作一般的缓存来提高性能,即使动态内存并没有施压要完成该工作。
有人会说,这个缓冲只不过是为了动态内存的执行添加了20%的内存,而其他人则认为该功能提供了附加的管理能力,所以额外的内存也是值得的。记住,动态内在只在某些受支持的来宾系统上工作。它们在完全由管理程序控制的内存管理解决方案中有一些优势,因为它们为运行在大部分企业数据中心的一般范围的操作系统提供更好的兼容性。
如果配置内存的IT管理员不能正确地监控或管理它们,就有性能降低的可能。重要的事情是理解该模式的好处,并采取正确的行为来监控它们,用专用的警示来引导管理员采取步骤在他们生根之前避免问题。
【编辑推荐】