Memory Manager 与 Windows 系统缓存:paging、page combining 和 lazy write
本页内容
本系列检查了七个分页、相同页面合并、内核堆和文件缓存参数。在 Windows 11 25H2 中找到了每个参数的读取代码。实际收益取决于参数和工作条件。
DisablePageCombining 会禁用后台页面合并:内存管理器不再执行此工作,但 RAM 占用可能增加。DisablePagingExecutive 会将可换出的驱动程序代码保留在物理内存中;收益通常很小。其余参数仅适用于特定的内核或存储任务,或者在 25H2 中已有合适的默认值。
对每个值检查了:
- 注册表中的确切路径和类型;
- Windows 11 25H2 代码设定的默认值;
- 同一子系统的相关值;
- 系统读取代码及其执行时机;
- 范围限制、值转换和计量单位;
- 直接效果和适用范围。
除了读取代码之外,我们还检查了参数的适用位置、修改它的后果以及在哪些场景下可能有用。仅凭参数存在并不足以给出建议。
研究范围和证据
Section titled “研究范围和证据”- Windows 11 25H2 x64,build
26200.9168。 - 内核参数与
ntoskrnl.exe的主配置表及其在 Memory Manager 和 Cache Manager 中的应用代码进行了比对。 - 运行时的访问通过系统注册表跟踪进行了检查。阶段 0 和阶段 1 开始时的读取可能不会出现在常规启动跟踪中:跟踪驱动程序开始记录的时间较晚。
- 对于用户进程,单独检查了在
ntdll.dll中读取该值的情况。对于HeapDeCommitFreeBlockThreshold,在 25H2 中找到了内核中的读取,但用户进程的堆不使用此参数。 - 对系统组件的静态分析不能替代在物理 PC、其他 build 或其他类型存储设备上的复现。
| Registry path | Value | Type | Default Windows 11 25H2 | 应用 |
|---|---|---|---|---|
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management |
DisablePagingExecutive |
REG_DWORD |
0 |
系统驱动程序可分页代码的分页 |
| 同一路径 | DisablePageCombining |
REG_DWORD |
0 |
相同物理页面的后台合并 |
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager |
HeapDeCommitFreeBlockThreshold |
REG_DWORD |
0x1000 (4 KB) 用于 kernel heap |
kernel-mode heap 空闲块 decommit 阈值 |
| 同一路径 | ModifiedWriteMaximum |
REG_DWORD |
1 单位 = 1 MB |
clamp 后 modified page writer 的上限 |
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management |
EnableAsyncLazywrite |
REG_DWORD |
2 |
Cache Manager 异步模式 |
| 同一路径 | CacheUnmapBehindLengthInMB |
REG_DWORD |
8 MB |
顺序读取后方 unmap 窗口 |
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Kernel |
SplitLargeCaches |
REG_DWORD |
0 |
processor groups 之间 cache topology 的表示 |
DisablePagingExecutive
Section titled “DisablePagingExecutive”当 0 时,Windows 内存管理器可以将允许换出的系统代码和驱动程序区段换出到后备存储。当 1 时,可换出的系统驱动程序代码会保留在物理内存中。
读取代码在内核初始化早期阶段于 ntoskrnl.exe 中找到。该值用于 MmResetDriverPaging、MmPageEntireDriver 以及系统映像加载时。它的应用早于常规用户注册表跟踪开始的时间。要应用新状态需要重启。
0:Windows 的默认状态,允许分页。1:可换出的系统驱动程序区段保留在 RAM 中。- 该设置消耗 RAM 以减少后续系统代码加载回内存的次数;磁盘本身并不会变快。
该设置可防止这些驱动程序区段后续的换出和加载。它不会禁用单独的常驻 CPU 检查线程。在现代且 RAM 充足的系统上,收益通常非常小:即使不设置,代码也可能长时间留在内存中。当 RAM 不足时,强制保留会加剧内存短缺。
参数的读取和系统效果方向已由 ntoskrnl.exe 的代码确认。
DisablePageCombining
Section titled “DisablePageCombining”当 0 时,内存管理器会启动一个后台任务,查找并合并相同的物理页面。当 1 时,该任务不执行合并。
在 ntoskrnl.exe 中找到了带有池标记 MmCb 的后台页面合并代码,这证实了该机制的存在。
0:允许页面合并,Windows 的默认状态。1:合并已禁用。- 禁用可减少内存管理器的后台工作,但可能增加 RAM 占用。
如果页面合并造成明显的后台负载且系统有空闲 RAM,禁用是有用的。通常此任务活跃度很低,因此效果非常小。在内存有限时,合并节省的 RAM 比节省的处理器时间更有价值。
读取代码和后台任务已在 ntoskrnl.exe 中确认。Microsoft 描述了页面合并以及处理器工作与 RAM 节省之间的权衡。
HeapDeCommitFreeBlockThreshold
Section titled “HeapDeCommitFreeBlockThreshold”该值设定内核堆空闲块已分配内存释放(decommit)的阈值。阈值越大,此类操作对大型空闲块发生的频率越低。
在 Windows 11 25H2 中,读取代码位于 ntoskrnl.exe,参数的应用与内核函数 RtlCreateHeap 相关。在 ntdll.dll 中未找到针对普通进程堆的相应读取代码。
- 内核堆代码中的默认值:
0x1000(4 KB)。 0x40000(256 KB) 是内核堆的有效阈值。- Microsoft 的历史文档描述了旧版 Windows 中同名的 user-mode 场景,因此不能自动将其套用到 Windows 11 25H2。
对普通应用程序几乎没有收益:它们的堆不使用此值。该参数只能改变内核堆中内存释放的频率。如果没有实测到的正是该方面的问题,预期效果非常小。
内核模式下的读取已在 ntoskrnl.exe 中确认。在 25H2 中对用户进程的效果未得到确认。
ModifiedWriteMaximum
Section titled “ModifiedWriteMaximum”该参数设定已修改页面写入机制(modified page writer)的上限。代码中使用以 256 页为单位的单位,即一个单位等于 1 MB。
Windows 11 25H2 中的规范化:
0转换为1个单位,即 1 MB;- 大于
0x40的值被限制为0x40; - 最大有效上限为 64 MB,即 16 384 页。
该机制大约在达到设定限额的四分之一时开始主动写入。增大限额会改变写入启动的时机和累积的已修改页面数量。磁盘本身的速度不会因此提高。
限额越大,在主动写入开始前累积的已修改页面越多。写入可能启动得更少,但尚未保存的数据量和下一次写入的批量大小会增加。如果没有具体的写入问题,请保留默认值。有效上限被限制为 64 MB。
读取代码、计量单位和范围限制已在 ntoskrnl.exe 中确认。Microsoft 旧文档中同名的 BitLocker 参数属于另一个子系统;这些文档在此不作为来源使用。
EnableAsyncLazywrite 及相关值
Section titled “EnableAsyncLazywrite 及相关值”EnableAsyncLazywrite 控制 Cache Manager 的异步延迟写入。在 25H2 代码中默认值设为 2:此模式已启用。
同一子系统的相关值:
| Value | Default 25H2 | 作用 |
|---|---|---|
EnableAsyncLazywrite |
2 |
通用 async lazy-write mode |
EnableAsyncLazywriteMulti |
2 |
相邻的 multi-volume 模式 |
EnablePerVolumeLazyWriter |
2 |
Per-volume lazy writer |
0 会禁用异步延迟写入。1 需要每个卷上独立延迟写入处理器的模式。2 可在无此要求的情况下启用异步模式。Cache Manager 在处理卷配置时会重新读取这些值。
显式写入 2 只是重复 Windows 11 25H2 的默认配置,不会带来额外改善。该设置主要用于诊断:值 0 可以禁用默认运行的机制。
读取已在系统跟踪中观察到,并在 ntoskrnl.exe 中得到确认。默认值 2 已由代码和一份基于逆向分析结果编写的独立注册表参数说明确认。
CacheUnmapBehindLengthInMB
Section titled “CacheUnmapBehindLengthInMB”该参数设定一个以兆字节为单位的距离,超过该距离后 Cache Manager 会释放滞留在顺序读取当前位置之后的缓存视图。
参数的读取和应用代码位于 ntoskrnl.exe,在缓存映射和读取时被调用。该参数与大型文件的顺序读取有关;它不会禁用整个文件缓存。
值和 clamp
Section titled “值和 clamp”0或大于128的值会被代码替换为8。- 工作范围:
1..128MB。 - 代码默认值:
8MB。 - Registry value 的单位正是 MB,而不是字节。
该参数仅对大型文件顺序读取的专门任务有意义。窗口越大,当前位置之后的缓存映射保留越久;窗口越小,释放越早。对于常规工作,默认值 8 MB 即可;手动设置的收益通常很小。
读取、应用和范围限制代码已在 ntoskrnl.exe 中确认。未找到 Microsoft 针对此内部参数的现代公开文档。
SplitLargeCaches
Section titled “SplitLargeCaches”当 0 时,缓存拓扑描述 API 会为跨多个处理器组的相应结构返回单一记录。当 1 时,记录按处理器组分开。
读取代码位于 ntoskrnl.exe。该参数在处理 KeQueryLogicalProcessorRelationship 中的关系 RelationCache 时使用。
改变的只是系统 API 返回的拓扑描述。已分配的物理内存块不会被拆分,连续块不足的概率本身也不会降低。
0:默认值。1:按处理器组拆分拓扑记录。- 实际效果主要可能出现在具有多个处理器组的系统上,通常是在超过 64 个逻辑处理器时。
- 在普通的单组系统上没有效果。
该参数仅对在多处理器组机器上查询缓存拓扑的程序有用。它不会改变缓存的工作方式和内存分配。对于普通台式计算机没有收益。
读取和应用代码已在 ntoskrnl.exe 中确认。值和用途已与 KiSplitLargeCaches 的公开逆向分析说明核对。
| 参数 | 实际评估 |
|---|---|
DisablePagingExecutive |
通常收益非常小,只是将更多代码保留在 RAM 中 |
DisablePageCombining |
在确认存在后台页面合并负载且 RAM 充裕时有用 |
HeapDeCommitFreeBlockThreshold |
仅在内核中生效;对普通应用程序没有实际收益 |
ModifiedWriteMaximum |
改变已修改页面的写入条件;如果没有发现具体问题,请保留默认值 |
EnableAsyncLazywrite |
默认值 2 已启用该机制;重复写入不会带来任何改善 |
CacheUnmapBehindLengthInMB |
顺序读取设置;默认的 8 MB 适合常规工作 |
SplitLargeCaches |
改变多处理器组的拓扑描述;在普通系统上没有效果 |
已确认的内容和未测量的内容
Section titled “已确认的内容和未测量的内容”上述路径、类型、默认值、参数的读取代码和时机以及范围限制均已确认。结果适用于 Windows 11 25H2 build 26200.9168。在其他 Windows 更新、RAM 容量、存储设备类型或 CPU 拓扑下,行为可能不同。
如何复现观察中的动态部分——参见如何自行验证。
要恢复,请将参数恢复为默认值或删除可选记录。部分值会在下次 Windows 启动时应用。
本研究和其中使用的工具属于 BoosterX 开发者,因此开发者对结果有直接利益关系。方法和适用范围已在本文中说明;结论可通过公开数据和下列公开来源进行验证。
- Memory combining,Microsoft Learn:page combining 的用途和 CPU/RAM 权衡,检查于 2026-09-01。
- Registry key that controls device driver and system code pagination to disk,Microsoft archive:
DisablePagingExecutive的语义,检查于 2026-09-01。 - HeapDeCommitFreeBlockThreshold, KB315407,Microsoft 历史文档:旧的 user-mode 场景和 256 KB 阈值,检查于 2026-09-01。
- Windows system configuration descriptions,
SplitLargeCaches的公开 RE 说明,检查于 2026-09-01。
关于代码的陈述已通过对 Windows 11 25H2 系统组件的静态分析验证。反编译代码、偏移量、原始跟踪和内部材料不予公开。
公开来源检查于:2026-09-02。
- 2026-09-20: 添加了关于利益冲突的免责声明,以及在方法中自行验证动态观察的链接。
- 2026-09-02: 首次发布;确认了路径、defaults、clamps 和参数读取代码,添加了实际收益的适用范围。
