我有一台 Hyper-V 2012 R2 服务器,运行着许多启用了动态内存的虚拟机。它们都表现出这种行为,但这里有一个例子:
其中一个虚拟机是 Windows Server 2012 R2 客户机,它没有做太多事情。基本上闲置在那里。它曾是正在做很多工作(它启动了许多进程,分配了大量内存,使用了一些 CPU,然后退出),但现在已经完成。
虚拟机内部的任务管理器显示以下内存统计信息:
- 使用中:5.5 GB
- 可用:302 MB
- 已承诺:5.6/6.9 GB
- 缓存:299 MB
“内存构成”图表显示,5629 MB 被应用程序、驱动程序等“使用中”(即,它未被用作文件系统缓存)。我还运行了 perfmon,那里的计数器与任务管理器的计数器一致。
切换到虚拟机内任务管理器中的进程列表,没有任何进程使用接近 5 GB 的内存。总计不到 1 GB。
有关更多信息,主机系统上的 Hyper-V 管理器显示此虚拟机已
- 分配内存:706 MB
- 内存需求:593 MB
这与我通过汇总虚拟机任务管理器中的进程列表获得的内存使用情况相符。
所以问题是:
为什么我的虚拟机中的任务管理器认为它使用了 5.5 GB,而实际上似乎没有进程使用该内存,并且 Hyper-V 主机知道它只需要 593 MB?发生了什么?
答案1
您在构建虚拟机时安装的集成组件包含一个驱动程序,当不需要内存时,该驱动程序会从虚拟机中删除内存。删除内存的方式是从客户操作系统中的内存管理器分配内存,然后将其返回给 Hyper-V。然后,从虚拟机内部看,它就像“正在使用”一样,因为它已被分配。这通常被称为“膨胀”,大多数虚拟机管理程序都可以做到这一点,甚至一些物理系统也可以做到这一点,使用硬件中的内存压缩引擎。
答案2
我在 Windows Server 2012 R2 上遇到了同样的问题。
主机运行正常。但在虚拟机上,内存消耗高达 99%。我尝试了各种方法进行测试,包括RAMmap
卸载所有内存,但仍然不起作用。
当我尝试在虚拟机设置中禁用“动态内存”时,它运行得很顺畅。自己尝试一下吧。