动态内存是一个有用的特性,但是在配置虚拟机和主机服务器时必须小心。
在承载虚拟工作负载时,硬件资源对整体性能的重要性可能不如物理内存。重要的是要以这样一种方式分配内存,即每个虚拟机都有所需的内存,并且在此过程中不会浪费内存。以下是为MicrosoftHyper-V分配内存时需要注意的一些要点。
NUMA的考虑
Hyper-V的内存管理是一门艺术..您必须确保每个虚拟机都有足够的内存。同时,您必须避免向虚拟机分配超过实际需要的内存。
原因似乎很明显。为虚拟机分配过多的内存将会限制可分配给同一服务器上其他虚拟机的内存量。但是,有时给虚拟机分配太多内存实际上会对其性能产生负面影响。
大多数新服务器使用非统一内存访问(NUMA)内存。NUMA内存旨在通过按处理器分配内存来提高性能。每个专用内存块称为一个NUMA节点。CPU访问其本地NUMA节点(直接分配给CPU的内存)的速度比访问非本地NUMA节点的速度快(正如我们在前面讨论CPU的NUMA时提到的)。
WindowsServer2008和2008R2的Hyper-V版本不直接支持基于每个NUMA节点的内存依赖性。换句话说,您不能直接配置虚拟机来使用特定的NUMA节点。该功能自R2SP1的WindowsServer2008Hyper-V版本开始提供。
计算每个NUMA节点的大小。例如,假设您的服务器配备了两个八核处理器和128GB内存。NUMA节点大小可以通过将内存大小(128GB)除以CPU核心数(16)来计算。在这个例子中,NUMA节点的大小将是8GB(在关于CPU的NUMA章节中有一个计算NUMA的内存大小的公式)。
由于每个节点的内存大小只有8GB,可以推断所有分配内存超过8GB的虚拟机都会使用多个NUMA节点的内存。通过将分配给虚拟机的内存量限制为8GB或更少(在本例中),虚拟机使用单个NUMA节点的内存的机会将会增加,从而提高性能。也就是说,如果你的虚拟机内存只需要8GB左右,就可以设置在一个节点中,性能会是最好的。
Hyper-V开销
说到内存管理,NUMA节点并不是唯一需要注意的。当您计划如何使用主机服务器的内存时,考虑与虚拟化相关的开销是很重要的。虚拟化开销有两个主要考虑因素。首先,您必须为父分区保留一些内存。
您需要为虚拟机管理程序预留至少300MB,为根分区上运行的主机 *** 作系统预留512MB。但是,大多数最佳实践指南指出,应该为父分区保留2GB内存。
除了Hyper-V之外,您不应将主分区用于任何其他用途(但您可以运行安全和基础架构软件,如管理代理、备份代理和防火墙)。因此,在不运行父分区中任何其他应用程序或服务器角色的前提下,建议保留2GB。
Hyper-V不允许您直接将内存分配给主分区。它将基本上使用所有剩余的内存。因此,您必须记住保持主机服务器的2GB内存未分配给父分区。
来宾计算机内存分配
在虚拟化开销方面要考虑的另一件事是,虚拟机使用少量内存来进行集成服务和其他与虚拟化相关的进程。这个内存量有些微不足道,所以除非你只打算给每个虚拟机提供非常少量的内存,否则你通常不用担心为这些服务和进程分配额外的内存。
具有1GB或更少RAM的虚拟机仅使用大约32MB的内存用于虚拟化相关的开销。每增加1GB内存,应增加8MB内存。例如,具有2GBRAM的虚拟机使用40MB(32MB+8MB)内存用于虚拟化相关的开销。类似地,具有4GB内存的虚拟机使用64MB的内存来实现这一开销。
动态存储器
WindowsServer2008R2SP1引入了新的动态内存功能,允许虚拟机根据当前工作负载动态使用内存。此外,它还允许您过度使用服务器的物理内存来运行更多的虚拟机。尽管动态内存有一定的优势,但是必须遵循一些最佳实践指南,以避免虚拟机耗尽内存。
首先,使用动态内存并不总是最佳选择。您可以基于每个虚拟机启用或禁用动态内存。仅在能够真正受益的虚拟机上启用动态内存非常重要。
最重要的考虑因素之一是虚拟机上的工作负载。如果虚拟机上的应用程序被设计为使用固定数量的内存,那么最好将它刚刚需要的内存量分配给虚拟机,而不是使用动态内存。
对于需要大量内存的应用程序也是如此。有些应用程序被设计为使用所有可用的内存。如果允许这样的应用程序使用动态内存,它们将很快耗尽服务器的物理内存。在这种情况下,最好为运行此类应用程序的虚拟机分配固定数量的内存。
最后,如果虚拟机试图使用多个NUMA节点的内存,可能会影响服务器的性能。因此,如果您的服务器使用NUMA内存,并且性能是主要考虑因素,那么避免使用动态内存可能是最佳选择。
启动内存
关于动态内存,需要了解的最重要的概念之一是启动RAM。使用动态内存时,必须为每个虚拟机分配一个引导RAM值。该值反映了虚拟机在启动时最初使用的物理内存量。最重要的是,启动RAM还指示虚拟机在任何时候将使用的最小物理内存量。虚拟机的内存使用量不能低于启动RAM值。
因此,Microsoft建议您避免为虚拟机分配大量的启动RAM。最好根据虚拟机上运行的 *** 作系统来确定启动RAM。微软建议运行Windows7、WindowsVista、WindowsServer2008和WindowsServer2008R2的虚拟机使用512MB启动内存。如果您的虚拟机将运行WindowsServer2003或WindowsServer2003R2,微软建议使用128MB的启动内存。
为了让虚拟机使用动态内存,虚拟机上运行的 *** 作系统必须支持动态内存。WindowsXP不支持动态内存。如果您尝试在配置为使用动态内存的虚拟机上运行WindowsXP, *** 作系统将只能访问启动RAM。
在继续执行其他配置任务之前,您必须确保所有虚拟机的总启动RAM不超过服务器上安装的物理RAM。否则,您将需要移除一些虚拟机或添加内存。
记忆重量
使用动态内存的整个想法是,它允许您过度使用内存。这样,您的虚拟机可以在需要时访问所需的内存。过度使用任何硬件资源的最大问题之一是,您可能最终会用完它。当使用动态内存时,您的虚拟机完全有可能用尽所有可用的物理内存并需要更多的内存。
这个问题的长期解决方案是确保您的服务器配置有足够的内存来满足虚拟机的要求。然而,短期的解决方案是优先考虑内存使用。
几乎所有的主机服务器都有一些比其他虚拟机更重要的虚拟机。Hyper-V允许您对这些虚拟机进行优先级排序,以便在物理内存不足的情况下,首先将内存分配给优先级更高的虚拟机。您可以通过调整虚拟机的内存权重来确定虚拟机对动态内存需求的优先级。内存权重较高的虚拟机比内存权重较低的虚拟机具有更高的优先级。
另一个必须为每个使用动态内存的虚拟机配置的设置是内存缓冲区。缓冲区设置控制每个虚拟机应该尝试保留作为缓冲区的内存量。该值以百分比表示。例如,如果虚拟机使用4GB的已分配内存,并且内存缓冲区设置为50%,则虚拟机最多可以使用6GB的内存。
内存缓冲区不保证虚拟机可以使用缓冲内存,它只控制虚拟机应该尝试声明的内存量。值得注意的是,由于内存缓冲区是以百分比表示的,因此缓冲的内存量会随着虚拟机当前使用的内存量而变化。所有使用动态内存的虚拟机都以最小内存量启动。它们根据工作负载对内存造成的压力动态调整内存使用量。
存储格局
配置实际虚拟机内存使用的过程很简单。打开Hyper-V管理器,右键单击一个虚拟机(因为每个虚拟机的内存都是独立管理的)。从快捷菜单中选择“设置”命令。出现设置对话框时,单击内存。
使用Hyper-V,您可以选择为虚拟机分配固定数量的内存或使用动态内存(参见图1)。如果选择动态选项,可以通过设置对话框直接调整启动RAM、最大RAM、内存缓冲和内存重量。
添加图片
图1您可以通过设置对话框调整虚拟机的内存分配。
如果主机服务器的物理内存资源有限,通常应该在使用静态内存还是动态内存之间进行权衡。静态内存通常提供更好的整体性能(如果分配了足够的内存)。动态内存可能很难 *** 作,但它通常可以实现更大的虚拟机密度。
在之前的初级教程中,我们简单提到了关于动态内存的部分。让我们测试一下动态内存的分配,看看它们实际上是如何工作的。
首先,我们将Win2012R2-Test03虚拟机的启动RAM设置为512MB(虚拟机开启时启动RAM不可更改。而微软建议使用动态内存来管理虚拟机),然后勾选“启动动态内存”,这里设置了最小RAM和最大RAM。顾名思义,最大RAM只能用这么多内存,不能超过,但这不是必然的。还有两个内存缓冲区,按照百分比分配。如果你的最大RAM是1G,那么你可以缓冲的内存大小是1G*0.2=0.2G,加上之前分配的最大RAM,也就是1.2G(你只能在虚拟机关闭的时候改变RAM的大小,但是你可以随时改变缓冲区和权重。)
那么权重就是你的Hyper-V服务器内存不够用的时候。这时候Hyper-V服务器会根据虚拟机的内存权重得到更多的内存,低的得到更少的内存。
这里我们可以看到,虚拟机内存不加压的情况下,内存大小为509MB,与我们之前分配的512MB引导RAM相同。最大内存是:1GB,这是我们分配的大小。
我们通过HyperV_Mon可以看到,对应的内存是525MB,与之前的设置无关。
我们用记忆压力软件给它加压。
这时我们可以看到内存已经达到了1037MB,已经超过了1024MB,也就是虚拟机分配的最大RAM。
我们再来看看任务管理器的内存使用情况。达到了1021MB,其中页面缓存66.6MB,非页面缓存22.6MB,我们计算出该服务器最大使用内存为1.2G,但实际使用的内存约为1.1G,超过了分配的最大RAM1G,说明内存缓冲区有20%的内存已经启动。当我尝试用其他记忆工具加压时,我发现加压会导致系统堵塞。估计有一些工具的原因,但有一点可以确认的是,缓冲内存是可以使用的。
现在我们来测试一下在Hyper-V服务器内存资源不足的情况下,权重高的内存是否能获得更多的内存利用率。
在这里,我们先来看看Hyper-V服务器的内存大小,是3GB。如果去掉父分区和虚拟层的内存开销,虚拟机可以使用的内存就少了很多。
我们先把Win2012R2-Test03的最大RAM设置为1500MB,内存权重高。
同时Win2012R2-Test04服务器的内存也设置为1500MB,内存重量正常。
这个时候我们来看看两个虚拟机的内存开销:Win2012R2-Test04是525MB,Win2012R2-Test03是731MB。
启动虚拟机后,Hyper-V本身只能使用906MB的内存。
Win2012R2-Test03的内存使用情况如下:
接下来,开始加压Win2012R2-Test03。
这时内存使用量增加到了1.2GB。
同时我们会对Win2012R2-Test04服务器进行加压。
Win2012R2-Test04的默认内存使用情况如下:
进行以下压力处理:
此时,最大可用内存为715MB。
用HyperV_Mon这个工具,我们可以看到Win2012R2-Test04的内存是731MB,Win2012R2-Test04的内存是1035MB。我们会发现工具显示的内存情况和虚拟机本身实际看到的内存使用情况还是有一些差异的。这是因为它本身的工具计算存在一些误差。
这时我们可以看到Hyper-V主机的内存使用量已经达到了2.6GB。
此时,当我们停止给Win2012R2-Test04服务器加压时,会发现内存会立即迁移到Win2012R2-Test03服务器,内存大小为1305MB。
通过上面的压力测试可以看出,在虚拟机权重较高的情况下,如果Hyper-V服务器本身内存不足,同样的内存和内存缓冲会得到更多的内存。
Win2012R2-Test03:1.2GB
Win2012R2-Test04:715MB
最小内存:512MB
Win2012R2-Test03获得大小:1.2GB-512MB=1200MB-512MB=688MB
Win2012R2-Test04获取大小:715MB-512MB=203MB
Hyper-V的可用内存:906MB-688MB=218MB
win2012R2-test03:688/906*100=75.9%
Win2012R2-Test04胜率:218/906*100=24.06%
总结:从这个过程中我们可以发现,当Hyper-V服务器本身内存不足时,虚拟机启动加权功能,根据权重分配内存资源。当所有Hyper-V服务器内存分区都用完了可分配的内存时,此时会启动页面缓存,将内存中非急需的数据临时存储在硬盘缓冲区中。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)