我经常想创建一个真正精简且优化的 Windows XP 安装以便与 VMware 一起使用,禁用对于用例无用的所有功能。
我已经使用 nLite 好几天了,安装过程非常精简 — 不是太激进(伙计,使用 nLite 调整和删除东西时有一些注意事项!)。ISO 真的很棒。
现在,本着当下的精神,我正在尝试整理一个安装后批处理脚本,它将应用我无法使用 nLite 完成的最后一些调整,但我仍然想实现自动化。
其中一个调整是禁用磁盘缓存,因为我的主机操作系统中已经有缓存,所以我更希望 Windows 不要将其宝贵(且稀缺)的内存用于磁盘缓存。
一旦一切设置完毕,使用 GUI 就可以很容易地完成此操作,但如果我可以在批处理脚本中执行此操作,那就太棒了。要么专门关闭每个驱动器上的磁盘缓存(我的设置中有两个驱动器,其中一个用于交换和临时文件,因此它们不会在快照中浪费空间),要么可以关闭系统服务或类似服务,一次性禁用整个系统的缓存?
提前感谢任何想法:)
丹尼尔
编辑:只是为了避免“禁用写缓存是不好的”的争论(我真的只是想得到我的问题的答案:)谢谢)。
无写缓存(左)和写缓存(右)的 ATTO 基准测试:
编辑 2:根据 @techie007 的启发,我首先尝试确定关闭缓存对内存的好处。从这些屏幕截图中可以看出,关闭缓存实际上没有任何好处,至少在内存方面。此处的任何更改都完全在统计不确定性范围内。
顺便说一下,我不太清楚最好的方法,所以两次运行我都重新启动了机器,让它稳定一段时间,然后运行 ATTO 并在运行期间和运行后监控内存使用情况。
前两个启用了写入缓存(在 ATTO 期间,然后之后):
接下来的两个是相同的场景,但是禁用了写入缓存:
答案1
这是不可能的。Windows 实际上没有磁盘缓存,它有一个页面缓存,整个内存管理子系统都是围绕它构建的。甚至跟踪哪些内存处于活动状态以及哪些内存处于非活动状态等操作都是通过页面缓存上的页面保护来管理的。
如果客户机不控制缓存,则意味着客户机必须将所有磁盘访问传递给主机,这样它才会知道在内存中保留什么。程序将以极低的速度运行,因为每次代码遍历页面边界时都会导致一直到主机的软故障。这只是最明显的问题,还有许多其他问题会非常可怕。
这就像制造一辆汽车,每天开着它去上班。
答案2
好吧,进行这个基准测试实际上变成了一种橡皮鸭体验:)
除非您知道自己处于非常特殊的用例中,例如我使用 VMware,否则这不是一个真正好的答案。因为您可以通过注册表项执行此操作,但前提是你知道注册表项的路径。
就我的情况来说,命令如下:
reg add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3030303030303030303030303030303030303130\Device Parameters\Disk" /v UserWriteCacheSetting /t REG_DWORD /d 00000000 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3130303030303030303030303030303030303130\Device Parameters\Disk" /v UserWriteCacheSetting /t REG_DWORD /d 00000000 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3030303030303030303030303030303030303130\Device Parameters\Disk" /v UserWriteCacheSetting /t REG_DWORD /d 00000000 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\IDE\DiskVMware_Virtual_IDE_Hard_Drive___________00000001\3130303030303030303030303030303030303130\Device Parameters\Disk" /v UserWriteCacheSetting /t REG_DWORD /d 00000000 /f
这是针对 ide0 虚拟适配器上的两个驱动器 — 主驱动器和从驱动器。至少在 Fusion 6 中是这样的。
我更愿意搜索 UserWriteCacheSetting,然后禁用每一个,但目前我不知道如何从命令行执行此操作。如果我找到答案,我会更新 :)
答案3
最终的答案是,是的,您可以按照我之前描述的(不太好)方式进行操作,但这样做没有任何好处(至少对于 XP 来说)。
内存使用情况实际上相同,性能也是如此。
总而言之,这是个好消息,因为事实证明在我的脚本中实现它真的很困难!
感谢大家对我的鼓励 ;)