コンテンツにスキップ

Windowsのメモリマネージャーとシステムキャッシュ:ページング、ページ結合、遅延書き込み

目次

このシリーズでは、ページング、同一ページの結合、カーネルヒープ、ファイルキャッシュに関する7つのパラメータを検証しました。Windows 11 25H2では、そのそれぞれを読み取るコードが見つかりました。実用的な有用性はパラメータと動作条件によって異なります。

DisablePageCombiningはバックグラウンドでのページ結合を無効にします。メモリマネージャーはこの処理を実行しなくなりますが、RAM消費量が増える可能性があります。DisablePagingExecutiveはドライバーのページング可能なコードを物理メモリに保持します。有用性は通常わずかです。残りのパラメータは、カーネルやストレージの個別のタスクにのみ適用されるか、25H2ですでに適切なデフォルト値を持っています。

各値について以下を検証しました。

  1. レジストリ内の正確なパスと型。
  2. Windows 11 25H2のコードで定義されたデフォルト値。
  3. 同じサブシステムの関連する値。
  4. 読み取りを行うシステムコードとその実行タイミング。
  5. 範囲の制限、値の変換、測定単位。
  6. 直接的な効果と適用範囲。

読み取りコードに加えて、そのパラメータがどこで適用されるか、変更によってどのような結果が生じるか、どのようなシナリオで有用になり得るかを検証しました。パラメータが存在するだけでは推奨には不十分です。

  • Windows 11 25H2 x64、build 26200.9168。
  • カーネルパラメータは、ntoskrnl.exeの主要な構成テーブルおよびMemory ManagerとCache Managerにおける適用コードと照合しました。
  • 実行時のアクセスはシステムレジストリトレースで検証しました。フェーズ0およびフェーズ1の開始時の読み取りは、通常の起動トレースには存在しない場合があります。トレーストライバーは記録を後から開始するためです。
  • ユーザープロセスについては、ntdll.dllでの値の読み取りを別途検証しました。HeapDeCommitFreeBlockThresholdについては、25H2でカーネル内の読み取りが見つかりましたが、ユーザープロセスのヒープはこのパラメータを使用しません。
  • システムコンポーネントの静的解析は、実機、別の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-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の表現

0の場合、Windowsのメモリマネージャーは、許可されているシステムコードとドライバーのセクションをバッキングストレージにページングできます。1の場合、ページング可能なシステムドライバーのコードが物理メモリに保持されます。

読み取りコードはntoskrnl.exeのカーネル初期化の早い段階で見つかりました。値はMmResetDriverPaging、MmPageEntireDriver、およびシステムイメージの読み込み時に使用されます。これは通常のユーザーレジストリトレースが開始されるよりも早く適用されます。新しい状態を適用するには再起動が必要です。

  • 0: Windowsの標準状態、ページングが許可されています。
  • 1: ページング可能なシステムドライバーのセクションがRAMに保持されます。
  • この設定は、システムコードを後でメモリに読み戻す回数を減らすためにRAMを消費します。ディスク自体が速くなるわけではありません。

この設定は、これらのドライバーセクションの後続のページアウトとページインを防ぎます。CPUの独立した常時チェックスレッドを無効にするものではありません。十分なRAMを搭載した現代のシステムでは、有用性は通常ごくわずかです。設定がなくてもコードは長時間メモリに留まることがあります。RAMが不足している場合、強制的に保持するとメモリ不足が悪化します。

パラメータの読み取りとシステム効果の方向はntoskrnl.exeのコードで確認されています。

0の場合、メモリマネージャーは同一の物理ページを検索して結合するバックグラウンドタスクを実行します。1の場合、このタスクは結合を実行しません。

ntoskrnl.exeにプールタグMmCbを持つバックグラウンドページ結合のコードが見つかり、このメカニズムの存在が確認されています。

  • 0: ページ結合が許可されています。Windowsの標準状態です。
  • 1: 結合が無効です。
  • 無効にするとメモリマネージャーのバックグラウンド処理が減りますが、RAM消費量が増える可能性があります。

ページ結合が目立つバックグラウンド負荷を生み出し、システムに空きRAMがある場合、無効化は有用です。通常このタスクはあまり活発ではないため、効果はごくわずかです。メモリ容量が限られている場合、結合によるRAM節約の方が節約されたCPU時間よりも有用です。

読み取りコードとバックグラウンドタスクはntoskrnl.exeで確認されています。Microsoftはページ結合と、CPU処理とRAM節約のトレードオフについて説明しています。

この値は、カーネルヒープの空きブロックに対する割り当て済みメモリの解放(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におけるユーザープロセスへの効果は確認されていません。

このパラメータは、変更されたページの書き込みメカニズム(modified page writer)の上限を設定します。コードでは256ページ単位が使用されており、つまり1単位は1 MBに相当します。

Windows 11 25H2における正規化:

  • 0は1単位、つまり1 MBに変換されます。
  • 0x40より大きい値は0x40に制限されます。
  • 最大有効上限は64 MB、つまり16 384ページです。

このメカニズムは、指定された上限の約4分の1に達した時点で活発な書き込みを開始します。上限を増やすと、書き込みの開始タイミングと蓄積される変更済みページの量が変わります。ディスク自体の速度はこれによって向上しません。

上限が大きいほど、活発な書き込みが始まるまでにより多くの変更済みページが蓄積されます。書き込みの頻度は低くなる可能性がありますが、まだ保存されていないデータの量と次の書き込みバッチのサイズが増加します。書き込みに関する具体的な問題がなければ、デフォルト値のままにしてください。有効上限は64 MBに制限されています。

読み取りコード、測定単位、範囲の制限はntoskrnl.exeで確認されています。Microsoftの古いBitLockerに関するドキュメントの同名パラメータは別のサブシステムに関するものであり、これらのドキュメントはここでは情報源として使用していません。

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はコードおよびリバースエンジニアリングの結果に基づいて作成されたレジストリパラメータの独立した説明によって確認されています。

このパラメータは、Cache Managerがシーケンシャル読み取りの現在位置より後方に残ったキャッシュ済みビューを解放するまでの距離をメガバイト単位で設定します。

読み取りと適用のコードはntoskrnl.exeにあり、キャッシュのマッピングと読み取り時に呼び出されます。このパラメータは大きなファイルのシーケンシャル読み取りに関するものであり、ファイルキャッシュ全体を無効にするものではありません。

  • 0または128より大きい値は、コードによって8に置き換えられます。
  • 有効範囲: 1..128 MB。
  • コードのdefault: 8 MB。
  • Registry valueの単位はバイトではなくMBです。

このパラメータは、大きなファイルをシーケンシャルに読み取る特殊なタスクにのみ意味があります。ウィンドウが大きいほど、現在位置より後方のキャッシュマッピングがより長く保持され、小さいほど早く解放されます。通常の作業には標準値8 MBが適しており、手動設定の有用性は通常わずかです。

読み取り、適用、範囲の制限のコードはntoskrnl.exeで確認されています。この内部パラメータに関するMicrosoftの現代の公開ドキュメントは見つかりませんでした。

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の開発者に帰属するため、開発者は結果に対して直接の利害関係を持っています。方法論と適用範囲はこの記事で説明されており、結論は公開データおよび以下に挙げる公開情報源によって検証できます。

コードに関する主張は、Windows 11 25H2のシステムコンポーネントの静的解析によって検証されています。逆コンパイルされたコード、オフセット、元のトレース、内部資料は公開されていません。

公開情報源の確認日: 2026-09-02。

  • 2026-09-20: 利害関係の衝突に関する免責事項と、方法論における動的観測の自主検証へのリンクを追加。
  • 2026-09-02: 初回公開。パス、defaults、clamps、パラメータの読み取りコードを確認し、実用的な有用性の範囲を追加。