在Windows Server 2008 R2 SP1 Hyper-V中已经增加了内存优化功能,不过在Windows Server 8 现更名为Windows Server 2012中有了更亮眼的改变!

在Windows 2008 R2增加的动态内存中,允许设置动态物理内存共享区域,这样可以保证在Hyper V中将物理内存视为共享资源,根据虚拟机的需求动态分配和回收可用内存。

不过由于虚拟机操作系统启动时往往需要的内存空间大于启动以后进入不活跃状态所需要的内存,但是为了确保虚拟机再次启动可以成功,因此这部分大于系统最小保留的“启动所需”内存空间需要考虑设置为启动内存保留在内,因此可能造成了一定的内存空间浪费。

考量虚拟化密度很多时候各厂商都在强调内存超量分配技术,例如可以通过内存页共享(当然尽量使用大的内存页否则计算冗余内存页将耗费很多时间和CPU),内存压缩,内存释放等技术;但是请不要忘记一个问题,就是当释放掉的某虚拟机的非活跃内存用于其他虚拟机使用时,很可能会造成该物理环境的物理内存启动虚拟机预留内存不足的启动失败,因此无论如何设置启动的内存部分还是要浪费不必要的启动内存空间;那么有没有更好的办法解决呢?

 

 

Windows Server 2012中给出了很好的答案:

我们可以设置

 

  • 虚拟机所用的最大内存
  • 可以在线的修改虚拟机设置动态内存部分设置 (动态在线内存修改)
  • 设置启动内存,最小内存和最大内存
  • 在虚拟机创建时就可以激活动态内存功能

 

Dynamic Memory Windows Server 8

动态内存主要用到了以下一些机制:

  • 最小内存

允许Hyper-V从虚拟机内部回收不活跃内存,这样就可以大幅度增加共享物理内存资源,对于高密度(尤其是虚拟桌面环境)会有很大的帮助。

当然,考虑到上述启动内存的一些要求和限制,一般方面为了避免启动虚拟机失败,另一方面又要综合考虑充分利用物理内存资源提高密度,新的“智能页调度功能”产生了。

  • 智能调页

当设置最小内存引起潜在的系统启动失败问题时,Hyper-V会自动在指定的物理磁盘上映射一个临时的页面缓冲区,当然考虑到磁盘的寻址时间比内存慢很多,因此智能调页仅用于:

    • 虚拟机启动

    • 物理内存不足

    • 没有其他物理内存可以被回收使用的情况

个人感觉可以适当采用一些固态盘作为临时缓冲区,降低启动时可能引起的一些IO响应延迟。

对于调页这个部分需要强调一下,虽然有些厂商强调其可以利用二级调页提高内存超用技术,这显然是有前提的;对于内存调页机制来说本来系统就有此功能,试想一下真要是到了物理内存吃紧,Hypervisor需要乱序Paging到物理硬盘的时候,你懂得:Hypervisor是不会顾及到虚拟机内部哪些物理内存是系统运行时需要的,这是很恐怖的“压缩比性能响应效应”,你知道DDR3-1600内存的响应时间是5ns,高性能磁盘寻址响应时间是8ms左右,这是1,6000000倍的差别,如果不能做到智能调页那么最好选择的方式还是在虚拟机内部自己系统调页解决啊~

 

  • 虚拟机内部调页

考虑到上述问题,虚拟机内部的内存页控制是必不可少的。

  • 内存空间气球技术利用

为了减少智能调页可能产生的影响,虚拟机完成了启动之后;Hyper-V会自动气球回收技术讲虚拟机内部的这部分临时内存空间释放。

  • 内存动态配置

可以在线分配(增加减少)虚拟机的物理内存