简单的问题,我有 3 个主机运行 4.1 Essentials Plus 和 vmware HA。我尝试创建几个虚拟机,这些虚拟机占用了每个服务器 90% 的内存容量。我知道 vmware 在虚拟机中具有非常复杂的内存管理,但我不明白当主机故障转移仍可处理时,vCenter 如何允许我启动超过关键内存水平的虚拟机。
是否因为虚拟机不使用内存,所以它仍然被视为空闲,因此可以启动虚拟机?但是,如果在主机发生故障之前所有虚拟机都在使用 RAM,会发生什么情况 - 故障后它们无法迁移到其他主机。
XenServer 中的默认行为是,它会自动计算群集内可使用的最大内存级别,以便主机故障仍能得到保护。Vmware 是否也做同样的事情?
准入策略已启用。Vmware HA 已启用。
答案1
HA 的准入控制使用一种称为“槽位”的东西来计算在配置的主机数量发生故障时是否有可用空间容纳所有虚拟机。槽位计算允许您继续启动虚拟机,即使集群中的内存资源开始变得非常紧张。
准入控制和时隙
“插槽”机制旨在通过一种通用的方式将集群分成估计的 VM 大小的块,然后确保在配置的主机数量丢失的情况下,每个正在运行的 VM 仍然有可用的插槽。
计算槽大小
槽大小计算中首先要做的事情是。它要寻找的是预留资源,或者更具体地说集群中最大的虚拟机在预留资源方面。这样做的原因是为了确保集群中的每个资源槽都能够提供足够的资源来满足最大 VM 上的资源预留,以便在发生 HA 故障转移时,其资源不会低于其预留的最小值。
对于 CPU,会找到虚拟机上的最高预留并将其用作插槽大小。如果没有预留,则使用最小值,该值在集群的das.vmCpuMinMHz
设置中配置;4.1 中的默认值为 256Mhz,但在 5.0 中降至 32Mhz。
对于内存,内存预留加使用了虚拟机的内存开销 - 因此,在没有任何保留的情况下,您的插槽大小将是最高虚拟机的内存开销数或集群的das.vmMemoryMinMB
设置(如果已配置)中的较大值(文档目前默认值为 256MB;但事实并非如此,4.1+ 版本中的默认值为 0)。
这些数字结合起来为您提供集群的插槽大小。
假设您没有预留,您的插槽大小可能是最小值 - CPU 为 256Mhz,内存插槽大小将是开销最大的 VM 的内存开销大小。
另一方面,如果您有一台具有大量内存预留但没有 CPU 预留的 VM,而另一台 VM 具有大量内存预留,则您的插槽大小将根据每个预留上的大数字来计算 - 每个插槽在两种资源中都会非常大,这将是非常有限的 - 在您达到令人担忧的资源使用水平之前,您将被准入控制阻止启动 VM。
为了解决这个特殊问题,您可以手动设置每个资源的槽大小上限:
das.slotCpuInMHz
设置插槽计算的 CPU 部分的最大尺寸das.slotMemInMB
设置内存的最大值
如果您使用这些,则这些编号以上的虚拟机将被分配多个插槽,以便在故障转移后仍能保证它们具有其预留的资源价值。
计算槽位并执行限制
一旦确定了插槽大小,就会计算集群中每个主机上的插槽数量。
较低的资源决定了它们的限制 - 因此,如果主机在 CPU 资源方面可以容纳 100 倍的 CPU 插槽大小,但只能容纳 30 倍的内存限制,则该主机有 30 个插槽。
该数字是针对集群中每台主机累加的。此时配置的准入控制限制开始生效。如果您已将集群配置为容忍 1 台主机故障,则它会从计算中删除具有最多插槽的主机;如果设置了 2 台主机故障,则删除插槽数最多的两台主机。它假设您将失去最大的主机。
完成后,集群中剩余主机的插槽数将被加起来 - 这就是在阻止您启动虚拟机之前允许运行虚拟机的插槽数。
集群摘要选项卡中的“高级运行时信息”链接将告诉您插槽的设置。
(忽略 vCPU 数量;该数量不再用于插槽计算)
那样有用吗?
我知道你在想什么。
“等一下,我的虚拟机只有几 GB 的 RAM!它们怎么可能在 256MB 这样任意小的“插槽”中运行呢?“
它们应该以其资源预留指定的最低水平运行;如果没有预留,那么它们就不一定会运行良好。
如果在资源使用量已经相当大的情况下出现 HA 故障,那么在负载上添加额外的虚拟机时可能会遇到严重的资源争用。
如果争用的是 CPU 资源,则意味着所有正在运行的虚拟机的可用 CPU 时间都会减少。在某些情况下,这可能会产生相当严重的影响 - 当争用 CPU 时间时,具有多个 vCPU 的机器上使用的虚拟对称多处理可能会真正开始受到影响。
如果内存是存在争用的资源,那么事情就变得有趣了。
ESX(i) 有许多处理内存争用的技术。有一篇关于这些技术的深入文档这里总而言之,虚拟机管理程序采用以下方法:
- 透明页面共享
- 在客户虚拟机中查找重复的内存页面。如果有多个虚拟机运行相同的操作系统,则很有可能存在重复。多余的副本将被丢弃,并且所有读取内存的尝试都将指向单个副本。
- 它会按照设置确定的时间表一直运行
Mem.ShareScanTime
- 默认是每小时一次。
- 乘热气球
- 作为客户虚拟机中 VMware Tools 的一部分运行的代理会从虚拟机管理程序收到通知,告知它需要回收一些内存。运行在虚拟机中的代理开始尝试从客户机中回收内存,方法是向客户机操作系统请求内存,从而让代理的空内存使用量“膨胀”。这会迫使客户机操作系统采取措施释放内存,包括清除内存中的文件系统缓存或将内存页面交换到自己的交换空间。一旦内存页面成功被放入气球中,它就会通知主机可以回收内存。
- 这是主机遇到内存争用时将采取的第一个操作。
- 内存压缩
- VM 内存页面经过压缩,但仍存储在主内存中。这意味着访问该内存页面仍会受到惩罚,但它仍比从交换中拉取更快。
- 这是交换前的最后一个“好”选择。
- 虚拟机管理程序交换
- 您可能已经注意到,当启动虚拟机时,数据存储上会创建一个等于虚拟机内存大小的交换文件。这种预留实际上使得在绝对必要时,整个虚拟机的主内存可能驻留在磁盘上。如果发生这种情况,性能显然会很糟糕 - 但此选项是最后的手段。但是,整个内存页面都会移动到数据存储中的交换文件中;当访问时,需要从磁盘中检索它们。
它们的最小插槽大小与虚拟机的内存开销相关,这并非偶然。这是因为开销数字实际上是运行虚拟机绝对必要的唯一内存 - 虽然“运行”这个词可能太过强烈,如果虚拟机的整个内存最终都用于交换。
因此,准入控制并不是要确保所有虚拟机在 HA 故障转移后都能正常运行 - 而是要确保所有虚拟机都能运行。
所以我该怎么做?
准入控制试图在发生 HA 故障转移时强制执行最低级别的服务。但是,这只有在您实际定义了最低级别的服务时才会发生;许多环境不想要或不需要预留。
如果您要使用准入控制,我建议您调查您的插槽大小并将它们推向对您有意义的值;如果您不需要它们只是为了影响准入控制,请不要开始创建预留。
如果由于集群中缺少任何预留而将插槽大小设置为最小值或接近最小值,则将其调整为更适合环境的“正常”虚拟机大小。在集群的高级设置中设置如下内容:
das.vmCpuMinMHz = 500
das.vmMemoryMinMB = 2048
如果由于高预留虚拟机数量较少而导致插槽大小设置得太高,则请适当降低它。
das.slotCpuInMHz = 1000
das.slotCpuInMHz = 4096
确保准入控制为插槽大小提出的值对您的环境有意义 - 您绝对不希望从交换空间运行一半的虚拟机,因为准入控制认为您不关心它们的服务级别!