在有没有办法重置 Windows 文件缓存?我们学习了如何使用 RamMap 来释放无限量的 Windows 文件缓存,这很不错。
难道只有我一个人认为减少 Windows VM 中的缓存大小是显而易见的吗?大多数客户机缓存都是浪费的资源。如果您可以减少缓存,则可以减少客户机内存分配而无需增加交换。
所以问题是,如何让类似于 RAMMap Empty Standby List 的东西作为计划进程运行?RamMap 除了日志记录之外不接受其他参数。刷新缓存的计划任务可能很粗糙,但总比不得不适应从未设计过的缓存算法要好,而且微软似乎没有费心去适应虚拟化。
欢迎提出其他建议。
答案1
经过一些实验,我通过以下方法获得了最佳效果:1. 减少客户机的 RAM 消耗;2. 在主机上缓存客户机 I/O。
例如,不要运行具有 2.5GB RAM 的 Win 7 64 并让其自行缓存,而是为其分配 1GB 内存,再加上至少 1GB 的交换空间,然后为相关虚拟磁盘控制器启用缓存。我碰巧使用的是 VirtualBox,这使得这变得简单。
这听起来效率不高,但似乎迫使客户机采用更保守的内存分配机制,从而减少(可见的)浪费。交换更多,但交换被缓存,因此其效果减弱。一些数据将被缓存两次,但由于客户机缓存较小(几百 MB 而不是接近 1GB),缓存量相应较少。
总体而言,这似乎是一种更好的优化策略。当客户机较少时,它们会从更大的主机缓存中获益。当客户机较多时,它们会根据需要分配更多资源(缓存),而不是根据固定的、悲观的内存分配。
总体结论:虚拟内存模型不太适合硬件虚拟化,并且至少微软没有做出太多努力来使其可调或适应在虚拟机中运行。
答案2
需要考虑的几点:
Windows 文件缓存(反应式,使用文件映射,自 NT 3.1 以来就一直存在)不存在于待机页面列表中。它曾经位于包罗万象的“系统工作集”中。从 Windows 7 开始,该工作集被分成四个,文件缓存现在位于其自己的工作集中。在 PerfMon 中,它是“系统缓存驻留字节”和“缓存字节”,均位于内存对象下。在 RAMmap 的“使用计数”选项卡中,这是“活动”、“映射文件”交叉点的一部分。RAMmap 中的“清空系统工作集”功能会刷新此工作集(但通常不会长时间保持刷新状态)。
Windows 文件缓存通常只涉及小文件(小于 1 MB 左右)。大多数程序使用文件映射来访问大文件,而文件映射不会经过 Windows 文件缓存(即使缓存在其处理的文件上使用文件映射)。
Superfetch 确实使用备用页面列表,但它不会从备用页面列表中删除任何内容,也不会向其中添加任何内容。它只是重新利用这些页面。因此,删除 Superfetch(通过禁用其服务即可轻松完成)不会改变备用页面列表的大小。这仅仅意味着该列表中的低优先级页面将不会重新用于 Superfetch。它们将继续用作在工作集替换期间最近从工作集中推出的页面的缓存。