动态内存是一个有用的功能,但在配置虚拟机和主机服务器时,必须小心谨慎。
谈及承载虚拟工作负载,硬件资源对整体性能的重要性可能不如物理内存。以确保每台虚拟机都具有所需内存且不会浪费进程中的内存的方式分配内存非常重要。下面是分配供 Microsoft Hyper-V 使用的内存时需要注意的一些关键事项。
NUMA 注意事项
Hyper-V 的内存管理是一种艺术。您必须确保为每台虚拟机提供足够的内存量。同时,还必须避免向虚拟机分配超出真正需要的内存。
其中的原因似乎很明显。向虚拟机分配过多内存会限制可向同一服务器上其他虚拟机分配的内存量。但有时向虚拟机分配过多内存实际会对其性能产生不良影响。
大多数新服务器使用非一致性内存访问 (NUMA) 内存。 NUMA 内存旨在通过基于每处理器分配内存来提高性能。 每个专用内存块称为一个 NUMA 节点。 CPU 访问其本地 NUMA 节点(直接分配给该 CPU 的内存)的速度比它访问非本地 NUMA 节点的速度快(前面在说到CPU的NUMA的时候我们有说到)。
在Windows Server 2008 和 2008 R2 的 Hyper-V 版本不直接支持基于每个 NUMA 节点的内存相关性。换句话说,您不能直接将虚拟机配置为使用特定 NUMA 节点。从Windows Server 2008 R2 SP1版本的Hyper-V开始已经提供了此功能。
计算每个 NUMA 节点的大小。 例如,假定您的服务器配备有两个八核处理器和 128GB 的 RAM。 可通过用内存大小 (128GB) 除以 CPU 内核数 (16) 来计算 NUMA 节点大小。 在本示例中,NUMA 节点的大小将是 8GB(在关于CPU的NUMA章节中有说到关于NUMA内存大小的计算公式)。
由于每一个节点的内存大小只有8GB,可推断出分配内存量超出 8GB 的所有虚拟机都必定会使用多个 NUMA 节点的内存。 通过将分配给虚拟机的内存量限制为8GB或更少(在此示例中),会增加虚拟机使用单个 NUMA 节点的内存的机会,从而提高性能。也就是说如果你的虚拟机内存只需要8GB左右,那就可以将到设置在一个节点内,这样子它的性能将是最棒的。
Hyper-V 开销
谈到内存管理,NUMA 节点并不是唯一需要注意的事项。 在您规划使用主机服务器的内存的方法时,考虑与虚拟化相关的开销非常重要。对于虚拟化开销,主要有两个注意事项。 首先,您必须为父分区保留一些内存。
您将至少需要为虚拟机监控程序保留300MB,为在根分区上运行的主机操作系统保留 512MB。 但是,大多数最佳实践指南表明,您应为父分区保留 2GB 内存。
您不应将主分区用于 Hyper-V 以外的其他任何项目(但您可以运行管理代理、备份代理和防火墙等安全和基础结构软件)。 因此,建议保留 2GB 的前提是您不会在父分区中运行任何其他应用程序或服务器角色。
Hyper-V 不允许您直接向主分区分配内存。 它基本上会使用剩下的所有内存。 因此,您必须记得将主机服务器的 2GB 内存保留为未分配状态,以供父分区使用。
来宾计算机内存分配
在虚拟化开销方面要考虑的另一件事是,虚拟机对集成服务和其他与虚拟化相关的进程使用少量内存。该内存量有些微不足道,所以除非您只计划向每台虚拟机提供极少量的内存,否则您通常不必担心为这些服务和进程分配了额外内存。
RAM 为 1GB 或更少的虚拟机仅将大约 32MB 内存用于与虚拟化相关的开销。 每增加 1 GB 的 RAM 应增加 8MB 内存。 例如,RAM 为 2GB 的虚拟机将 40MB(32MB + 8MB)内存用于与虚拟化相关的开销。 同样,内存为 4GB 的虚拟机将 64MB 内存用于此开销。
动态内存
Windows Server 2008 R2 SP1 引入了一种新的动态内存功能,该功能允许虚拟机基于当前的工作负载动态使用内存。 并且,还允许您超量使用服务器的物理内存,以运行更多虚拟机。 虽然动态内存具有一定优势,但必须遵守某些最佳实践指南,以避免虚拟机缺少内存。
首先,使用动态内存并非总是最佳选择。 您可以基于每台虚拟机启用或禁用动态内存。 应只在可真正获益的虚拟机上启用动态内存,这一点非常重要。
最重要的注意事项之一是虚拟机上的工作负载。 如果虚拟机上的应用程序设计为使用固定内存量,则最好向该虚拟机分配其正好需要的内存量,而不是使用动态内存。
对于内存需求很大的应用程序也是如此。 一些应用程序设计为使用可用的所有内存量。 如果允许此类应用程序使用动态内存,则它们会很快耗尽服务器的物理内存。 在这种情况下,最好向运行此类型应用程序的虚拟机分配固定内存量。
最后,如果虚拟机尝试使用多个 NUMA 节点的内存,则可能会影响服务器的性能。因此,如果您的服务器使用 NUMA 内存,并且性能是主要考虑因素,则避免使用动态内存或许是最佳选择。
启动 RAM
在动态内存方面要了解的一个最重要的概念是启动 RAM。 使用动态内存时,必须向每台虚拟机分配一个启动 RAM 值。 此值反映虚拟机在启动时最初使用的物理内存量。 最重要的是,启动 RAM 还表示虚拟机将随时使用的最少物理内存量。 不能将虚拟机的内存使用量降到启动 RAM 值以下。
因此,Microsoft 建议您避免向虚拟机分配大量启动 RAM。 最好根据虚拟机上运行的操作系统确定启动 RAM。 Microsoft 建议对运行 Windows 7、Windows Vista、Windows Server 2008 和 Windows Server 2008 R2 的虚拟机使用 512MB 启动 RAM。 如果您的虚拟机将运行 Windows Server 2003 或 Windows Server 2003 R2,则 Microsoft 建议使用 128MB 启动 RAM。
为使虚拟机使用动态内存,该虚拟机上运行的操作系统必须支持动态内存。 Windows XP 不支持动态内存。 如果尝试在配置为使用动态内存的虚拟机上运行 Windows XP,则该操作系统将只能访问启动 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,和我们前面分配的启动RAM为512MB相同。最大内存为:1GB,即我们分配的大小。
我们可以通过HyperV_Mon看到对应的内存为525MB与前面的设置相关不太。
下面我们采用内存压力软件对其加压
这时候我们可以看到内存已经达到了1037MB了,这个量已经超过了1024MB,即虚拟机分配的最大RAM。
我们再查看一下任务管理器的内存使用情况,已经达到了1021MB,其中页面缓存为66.6MB,非页面缓存为22.6MB。前面我们计算此服务器的最大使用内存为1.2G,实际使用在1.1G左右,超出所分配最大RAM 1G,说明已经启动了内存缓冲区里面的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
最小RAM: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服务器内存分区完无内存可分配的情况下,这时候会启动页面缓存将内存中的非急需数据临时存放在硬盘缓冲区。