有关虚拟机内存分配的建议 General/Hyper-V

有关虚拟机内存分配的建议 General/Hyper-V

我有一个关于虚拟机设置的基本问题。我使用的是 Hyper-V,但我认为这个问题很普通。这是针对家庭办公室的,我想在不做太多工作的情况下在虚拟机上获得相当好的性能。我使用虚拟机来测试/调试我的软件。理想情况下,我会启动所有操作系统,但一次只有一个(大多数情况下可能为零)会得到积极使用。

是否有一些针对虚拟机内存分配的通用准则?在一个极端情况下,您可以将总内存除以虚拟机数量(总共 4 GB,4 个虚拟机 -> 每个 1 GB)。在另一个极端情况下,您可以为每个虚拟机分配全部内存,然后让操作系统进行仲裁。我猜这两种方法都是错误的!我正在寻找合理性能的“经验法则”。我不知道虚拟机服务器如何管理虚拟机的内存。

[编辑] 我之所以问这个问题,是因为我错误地认为 Hyper-V(2008 R2 版)可以在有额外内存可用时动态地为虚拟机提供额外内存。我的想法是,只要我的使用率一次只达到一台虚拟机的峰值,我就可以过度分配内存。由于 Hyper-V 希望在启动时为每个虚拟机分配固定内存,因此我需要关闭一些虚拟机并只运行我需要的虚拟机,或者将虚拟机设置为较低的内存分配,并确保物理内存足以满足所有分配以及 Hyper-V 进程和(可能的)主机操作系统。

听起来 VMWare 在这方面有更多选择,正如提供的答案中指出的那样。[/编辑]

谢谢,布雷特

答案1

一般来说,您需要知道,在最坏的情况下,物理 RAM 刚好足够所有标准功能可靠地从 RAM 运行。这个神奇的数字因操作系统而异,并且根据客户操作系统的用途而有很大差异。您可以轻松启动具有几百兆 RAM 的 Windows 2003 Server,一些 Linux 紧凑型发行版具有 30M 或更少的 RAM,等等,但如果您想在具有多 GB 数据库的客户机中运行 SQL Server,那么您将需要确保它实际上具有真正的 RAM,以支持它认为拥有的几 GB RAM。

不同供应商和产品的虚拟机管理程序处理 RAM 的方式存在很大差异。Hyper-V 不支持所谓的内存过量使用,因此您只能根据物理可用内存分配 RAM。VMware 的 ESX 允许过量使用,设置争用仲裁 (共享) 规则,以控制当 VM 繁忙且物理 RAM 总量不足以满足负载时发生的情况。在 Hyper-V 环境中,您没有这种级别的控制权,因此您必须预先分配足够的 RAM。

VMware 还有其他一些技巧可以帮助解决内存过量使用问题:透明页面共享和内存膨胀。

透明页面共享基本上是 RAM 的单实例存储 - 虚拟机管理程序监视分配给每个 VM 的 RAM 块,如果它发现多个 VM 中存在公共块,它只保留一个副本并将所有 VM 指向该副本 - 如果任何 VM 随后尝试写入该块,它会拆分一个副本,以免发生不好的事情。在同构 VM 环境中,这可以节省大量 RAM 而不会影响性能。

内存膨胀是一种机制,允许虚拟机管理程序“借用”分配给一个虚拟机的 RAM,并通过在虚拟机管理程序中使用客户操作系统驱动程序将其提供给更重要的虚拟机,该驱动程序在该客户操作系统中分配(大)块内存。一旦分配完成,虚拟机管理程序就可以安全地重新分配物理 RAM,以支持膨胀驱动程序为其分配的内存。与直接方法(虚拟机管理程序只是将客户虚拟机的内存交换到磁盘以重新分配 RAM)相比,这样做的优势在于,失去物理 RAM 的客户操作系统知道内存正在被某些程序使用,并且“借用”的 RAM 被分配给客户操作系统中任何重要系统功能的风险大大降低。

编辑后添加: 我从未尝试过查看当您尝试启动 VM 时 Hyper-V 会发生什么情况,因为 VM 的内存需求超出了可用的物理 RAM 量,我能找到的所有文档都表明 VM 会获得您为其配置的所有 RAM,然后 Hypervisor 和主机操作系统会分配剩余的 RAM。Hyper-V 没有任何机制将最低 RAM 储备应用于 VM,然后从池中分配剩余部分,尽管它确实为 CPU 资源提供了这样的机制。VMware 的 ESX\ESXi 也提供了此选项。

值得记住的是,您还需要规划虚拟机管理程序和主机操作系统所需的物理内存(如果您运行的是裸机 Hyper-V 服务器,则忽略后者)。微软的Hyper-V 的性能调优建议指出除了虚拟机中拥有的 XGig RAM 之外,您还需要拥有:

  • 300 MB 用于虚拟机管理程序
  • 另加 32 MB 作为分配给每个虚拟机的第一个 GB RAM
  • 另外为每个虚拟机分配每 GB 的 RAM 增加 8 MB
  • 另加 512 MB 用于在根分区上运行的主机操作系统

如果没有足够的物理 RAM,那么性能将受到严重影响,并且稳定性也可能受到影响。

答案2

Windows Server 2008 R2 中的 Hyper-V支持动态内存功能(我正在运行 SP1 - 不确定它是否在 RTM 版本中)。我意识到你的问题已经很老了,所以你问的时候可能还没有。

我开始为每个客户虚拟机分配静态内存,但很快就超出了服务器的容量。动态内存允许您为每个虚拟机分配初始(可能较低)内存量和最大内存量。然后它将根据需要分配内存,还将恢复未使用的内存。您必须编辑每个虚拟机的设置才能进行设置 - 创建新虚拟机时不可用。我刚刚重新配置了一组虚拟机以使用动态内存,并将我的总体内存投入减少了近一半。

Hyper-V 管理器屏幕截图显示已分配的内存

我为动态内存配置的虚拟机显示了当前的内存需求和状态。突出显示的虚拟机仍在其初始分配的 1 GB 内运行。Exchange 服务器(从上往下第二个)是个大胖子,已经用完了其初始的 1GB,又分配了几个。该功能允许配置缓冲区(默认为 20%),因此 Hyper-V 为 Exchange 提供了它所需的数量以及一些额外的数量。

答案3

这不是一个一般性问题,因为 Hyper-V 无法像 VMWare 那样进行内存页面共享,该技术可以极大地改变 VM 内存的分配方式。如果 Hyper-V 支持该技术,我建议您为 VM 分配一个起始量,然后查看每个 VM 随时间的实际使用情况,随着您发现更多有关其行为的信息,更改分配。

相关内容