Hyper-V群集中未预留给VM虚拟机的物理内存量由主机使用,但是作为群集的一部分,主机通常会从群集中的其他节点接收VM 以保持其高度可用性, 这可以是用户发起的移动,例如从另一个节点实时迁移VM,也可以是资源或硬件故障的导致VM故障切换, 因此最初用户对主机预留的内存没有太多控制权,来自另一个节点的VM 可以轻松移动到特定节点并压倒其内存, 因此引入群集环境变量RootMemoryReserved,以确保群集主机具有最少量的主机物理内存储备


RootMemoryReserved属性于2008R2首次引入,存在于WSFC 2008R2 2012 2012R2,在2016中消失


RootMemoryReserved


尽管名称是这样,但RootMemoryReserved变量并不能确保根分区会为自己保留一定数量的物理内存, 而是指定主机操作系统与主机操作系统即将启动的VM(通过用户操作或故障转移移动到该节点)的时间进行比较的内存大小,如果通过启动VM,剩余的主机OS物理内存将低于RootMemoryReserved指定的限制以及主机当前使用的内存,则VM启动操作将失败。


例如,在具有16 GB物理内存并且RootMemoryReserved设置为1024 MB(1 GB),主机当前已使用1 GB内存的群集节点上,并且如果每个VM都占用1 GB内存,则虚拟机的最大数量联机为14个虚拟机,因为主机操作系统已使用1 GB的内存,而主机操作系统保留另外1 GB的内存。 这为主机保留了2 GB的内存,尝试启动第15 个虚拟机会使虚拟机的物理内存使用量超过15 GB,这会导致主机操作系统的物理内存保留时间低于主机操作系统当前使用的1 GB。 因此,第15 个 VM 的VM启动操作将失败。


RootMemoryReserved默认设置为512 MB,对于除管理虚拟机之外没有执行任何操作的主机虚拟机,这应该足够了,此变量可以由PowerShell cmdlet查看。


(get-cluster ). RootMemoryReserved


要更改RootMemoryReserved,可以使用以下PowerShell cmdlet将RootMemoryReserved设置为1024 MB:


(get-cluster ).RootMemoryReserved = 1024

2018-03-04_102558.png


更改RootMemoryReserved不会影响任何已经运行的虚拟机, 例如,在具有16 GB物理内存的节点上,如果RootMemoryReserved设置为512 MB,则主机当时使用480 MB,并且VM占用15 GB内存,这将是可行的,主机获得512MB+480MB的可用内存,并不会因此从VM中回收内存


另外如果由于某种原因(例如在主机上运行的另一个应用程序)导致系统速度变慢,将RootMemoryReserved更改为2048 MB(2 GB)将不会自动释放主机的物理内存,在这种情况下,释放主机物理内存的方法是脱机不重要的虚拟机, 因此,建议在使任何虚拟机联机之前正确设置所需的RootMemoryReserved


RootMemoryReserved的最大值是4096 MB(4 GB),对高于4 GB的值的任何更改都将被忽略,并使用以前的值。 此外,作为群集参数的RootMemoryReserved适用于群集中的所有节点,RootMemoryReserved中的值将用于保留集群中所有节点上的VM主机内存。


RootMemoryReserved变量不限制主机可以使用的内存量, 这个变量的目的是确保主机拥有最少的物理内存储备,超出了当前用来控制虚拟机的数量。 主机可以使用比RootMemoryReserved留出的值更多的内存。 因此,VM可用的物理内存量将等于或小于RootMemoryReserved未预留的内存量。


未经过预留设置的主机目前正在使用的内存可以会随着时间推移被VM挤压,设置了RootMemoryReserved后则将确保主机除了当前使用的内存,会有一部分预留内存,永远不会被VM占用,仅维系主机使用


老王点评:RootMemoryReserved可以用于在2008R2-2012R2时代,合理对于群集节点进行主机内存预留,防止主机完全被VM或应用淹没资源,确保主机性能,在没有SCVMM的情况下,可以自带原生控制主机内存预留,如果有SCVMM则更加智能,SCVMM不仅可以针对群集设置,也可以针对于单台宿主机,或整个主机组设置,SCVMM的主机预留可以从CPU、内存、磁盘空间、磁盘 I/O 、网络容量来设置预留情况。


主机预留和动态资源平衡功能可以相配合,主机预留生效在启动或移动虚拟机时,一旦检测到超过最小预留值,则阻止虚拟机移动过来或启动,动态资源平衡功能是设置一个平衡值,当一个主机组或群集运作过程中,一旦检测到某个主机的负载超过了平衡值,则和其它负载轻的节点平衡资源,两者并不冲突