Přeskočit na obsah

Memory Manager a systémová cache Windows: paging, page combining a lazy write

Na této stránce

V této sérii bylo prověřeno sedm parametrů stránkování, slučování shodných stránek, jádrové haldy a souborové cache. V Windows 11 25H2 byl nalezen kód pro čtení každého z nich. Praktický přínos závisí na parametru a podmínkách provozu.

DisablePageCombining vypíná slučování stránek na pozadí: správce paměti přestává tuto práci vykonávat, ale spotřeba RAM může vzrůst. DisablePagingExecutive udržuje odkládatelný kód ovladačů ve fyzické paměti; přínos je obvykle malý. Ostatní parametry se vztahují pouze na konkrétní úlohy jádra nebo úložišť, případně již mají v 25H2 vhodné výchozí hodnoty.

Pro každou hodnotu bylo prověřováno:

  1. přesná cesta v registru a typ;
  2. výchozí hodnota daná kódem Windows 11 25H2;
  3. související hodnoty téhož subsystému;
  4. systémový kód pro čtení a okamžik jeho vykonání;
  5. omezení rozsahu, převod hodnot a jednotky měření;
  6. přímý efekt a hranice použitelnosti.

Kromě kódu pro čtení jsme prověřovali, kde se parametr uplatňuje, jaké důsledky má jeho změna a ve kterých scénářích může být užitečný. Samotná existence parametru pro doporučení nestačí.

Rozsah výzkumu a důkazy

Sekce “Rozsah výzkumu a důkazy”
  • Windows 11 25H2 x64, build 26200.9168.
  • Parametry jádra byly porovnány s hlavní konfigurační tabulkou ntoskrnl.exe a s kódem jejich uplatnění v Memory Manager a Cache Manager.
  • Přístupy za běhu byly prověřeny systémovým trasováním registru. Čtení ve fázi 0 a na začátku fáze 1 mohou v běžném trasování zavádění chybět: ovladač trasování začíná zapisovat později.
  • Pro uživatelské procesy bylo samostatně prověřováno čtení hodnoty v ntdll.dll. Pro HeapDeCommitFreeBlockThreshold bylo v 25H2 nalezeno čtení v jádře, ale haldy uživatelských procesů tento parametr nepoužívají.
  • Statická analýza systémových komponent nenahrazuje opakování na fyzickém PC, jiném buildu nebo jiném typu úložiště.
Registry path Value Type Default Windows 11 25H2 Použití
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management DisablePagingExecutive REG_DWORD 0 Stránkování odkládatelného kódu systémových ovladačů
stejná cesta DisablePageCombining REG_DWORD 0 Slučování shodných fyzických stránek na pozadí
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager HeapDeCommitFreeBlockThreshold REG_DWORD 0x1000 (4 KB) pro kernel heap Práh decommit volných bloků kernel-mode heap
stejná cesta ModifiedWriteMaximum REG_DWORD 1 jednotka = 1 MB Horní limit modified page writer po clamp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management EnableAsyncLazywrite REG_DWORD 2 Asynchronní režim Cache Manager
stejná cesta CacheUnmapBehindLengthInMB REG_DWORD 8 MB Okno unmap za sekvenčním čtením
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Kernel SplitLargeCaches REG_DWORD 0 Zobrazení cache topology mezi processor groups

Při 0 může správce paměti Windows odkládat sekce systémového kódu a ovladačů, které to umožňují, do záložního úložiště. Při 1 je odkládatelný kód systémových ovladačů udržován ve fyzické paměti.

Kód pro čtení byl nalezen v ntoskrnl.exe v rané fázi inicializace jádra. Hodnota se používá v MmResetDriverPaging, MmPageEntireDriver a při načítání systémových obrazů. Uplatňuje se dříve, než začíná běžné uživatelské trasování registru. Pro uplatnění nového stavu je nutné restartovat.

  • 0: standardní stav Windows, odkládání je povoleno.
  • 1: odkládatelné sekce systémových ovladačů jsou udržovány v RAM.
  • Nastavení spotřebovává RAM, aby omezilo následné načítání systémového kódu zpět do paměti; samotný disk rychleji nepracuje.

Nastavení zabraňuje následnému odkládání a načítání těchto sekcí ovladačů. Nevypíná samostatné trvale kontrolující vlákno CPU. Na moderním systému s dostatečným objemem RAM je přínos obvykle velmi malý: kód může v paměti zůstat dlouho i bez nastavení. Při nedostatku RAM jeho vynucené udržování prohlubuje nedostatek paměti.

Čtení parametru a směr systémového efektu jsou potvrzeny kódem ntoskrnl.exe.

Při 0 správce paměti spouští úlohu na pozadí, která vyhledává a slučuje shodné fyzické stránky. Při 1 tato úloha slučování nevykonává.

V ntoskrnl.exe byl nalezen kód slučování stránek na pozadí s pool tagem MmCb, což potvrzuje existenci mechanismu.

  • 0: slučování stránek je povoleno, standardní stav Windows.
  • 1: slučování je vypnuto.
  • Vypnutí omezuje práci správce paměti na pozadí, ale může zvýšit spotřebu RAM.

Vypnutí je užitečné, pokud slučování stránek vytváří znatelnou zátěž na pozadí a systém má volnou RAM. Obvykle je tato úloha málo aktivní, proto je efekt velmi malý. Při omezeném objemu paměti je úspora RAM ze slučování užitečnější než ušetřený procesorový čas.

Kód pro čtení a úlohu na pozadí je potvrzen v ntoskrnl.exe. Microsoft popisuje slučování stránek a kompromis mezi procesorovou prací a úsporou RAM.

HeapDeCommitFreeBlockThreshold

Sekce “HeapDeCommitFreeBlockThreshold”

Hodnota určuje práh uvolnění přidělené paměti (decommit) pro volný blok haldy jádra. Při vyšším prahu se tyto operace pro velké volné bloky provádějí méně často.

V Windows 11 25H2 se kód pro čtení nachází v ntoskrnl.exe a uplatnění parametru souvisí s funkcí jádra RtlCreateHeap. V ntdll.dll nebyl odpovídající kód pro čtení pro haldy běžných procesů nalezen.

  • Výchozí hodnota v kódu pro haldu jádra: 0x1000 (4 KB).
  • 0x40000 (256 KB) je přípustný práh pro haldu jádra.
  • Historické dokumenty Microsoft popisovaly stejnojmenný user-mode scénář starších verzí Windows, proto jej nelze automaticky přenášet na Windows 11 25H2.

Pro běžné aplikace nemá prakticky žádný přínos: jejich haldy tuto hodnotu nepoužívají. Parametr může měnit četnost uvolňování paměti pouze v haldě jádra. Bez změřeného problému právě s ní je očekávaný efekt velmi malý.

Čtení v režimu jádra je potvrzeno v ntoskrnl.exe. Efekt pro uživatelské procesy v 25H2 potvrzen není.

Parametr určuje horní limit pro mechanismus zápisu změněných stránek (modified page writer). V kódu se používají jednotky po 256 stránkách, tedy jedna jednotka se rovná 1 MB.

Normalizace v Windows 11 25H2:

  • 0 se převádí na 1 jednotku, tedy 1 MB;
  • hodnoty větší než 0x40 jsou omezeny na 0x40;
  • maximální efektivní limit je 64 MB, tedy 16 384 stránek.

Mechanismus začíná aktivně zapisovat přibližně při dosažení čtvrtiny zadaného limitu. Zvýšení limitu mění okamžik spuštění zápisu a objem nahromaděných změněných stránek. Rychlost samotného disku tím neroste.

Při větším limitu se do začátku aktivního zápisu nahromadí více změněných stránek. Zápis může být spouštěn méně často, ale objem dosud neuložených dat a velikost následující dávky zápisu rostou. Pokud nemáte konkrétní problém se zápisem, ponechte výchozí hodnotu. Efektivní limit je omezen na 64 MB.

Kód pro čtení, jednotky měření a omezení rozsahu jsou potvrzeny v ntoskrnl.exe. Stejnojmenný parametr ze starších dokumentů Microsoft o BitLocker se vztahuje k jinému subsystému; tyto dokumenty zde nejsou použity jako zdroj.

EnableAsyncLazywrite a související hodnoty

Sekce “EnableAsyncLazywrite a související hodnoty”

EnableAsyncLazywrite řídí asynchronní odložený zápis Cache Manager. V kódu 25H2 je zadána výchozí hodnota 2: tento režim je již zapnutý.

Související hodnoty téhož subsystému:

Value Default 25H2 Role
EnableAsyncLazywrite 2 Obecný async lazy-write mode
EnableAsyncLazywriteMulti 2 Sousední multi-volume režim
EnablePerVolumeLazyWriter 2 Per-volume lazy writer

0 vypíná asynchronní odložený zápis. Pro 1 je vyžadován režim samostatného zpracovatele odloženého zápisu na každém svazku. 2 zapíná asynchronní režim bez tohoto požadavku. Cache Manager znovu načítá hodnoty při práci s konfigurací svazků.

Explicitní zápis 2 opakuje standardní konfiguraci Windows 11 25H2 a nic dalšího nezlepšuje. Nastavení je vhodné především pro diagnostiku: hodnota 0 umožňuje vypnout mechanismus, který je ve výchozím stavu zapnutý.

Čtení bylo pozorováno v systémovém trasování a potvrzeno v ntoskrnl.exe. Výchozí hodnota 2 je potvrzena kódem a nezávislým popisem parametrů registru sestaveným na základě reverzního inženýrství.

CacheUnmapBehindLengthInMB

Sekce “CacheUnmapBehindLengthInMB”

Parametr určuje vzdálenost v megabajtech, po jejímž překročení Cache Manager uvolní zakešované pohledy, které zůstaly pozadu za aktuální pozicí sekvenčního čtení.

Kód pro čtení a uplatnění parametru se nachází v ntoskrnl.exe a je volán při mapování a čtení cache. Parametr se vztahuje na sekvenční čtení velkých souborů; celou souborovou cache nevypíná.

  • 0 nebo hodnota větší než 128 je kódem nahrazena za 8.
  • Pracovní rozsah: 1..128 MB.
  • Výchozí hodnota v kódu: 8 MB.
  • Jednotky Registry value jsou právě MB, nikoli bajty.

Parametr má smysl pouze pro specializované úlohy sekvenčního čtení velkých souborů. Při větším okně je mapování cache pozadu za aktuální pozicí zachováno déle, při menším je uvolněno dříve. Pro běžnou práci se hodí standardní hodnota 8 MB; přínos ručního nastavení je obvykle malý.

Kód pro čtení, uplatnění a omezení rozsahu je potvrzen v ntoskrnl.exe. Moderní veřejná dokumentace Microsoft pro tento interní parametr nebyla nalezena.

Při 0 API pro popis topologie cache vrací jediný záznam pro odpovídající strukturu zahrnující několik skupin procesorů. Při 1 jsou záznamy rozděleny podle skupin procesorů.

Kód pro čtení se nachází v ntoskrnl.exe. Parametr se používá při zpracování vztahu RelationCache v KeQueryLogicalProcessorRelationship.

Mění se pouze popis topologie, který vrací systémové API. Přidělené fyzické bloky paměti se nerozdělují a pravděpodobnost nedostatku souvislého bloku se sama o sobě nesnižuje.

  • 0: výchozí hodnota.
  • 1: rozdělovat záznamy topologie podle skupin procesorů.
  • Praktický efekt je možný především na systémech s několika skupinami procesorů, obvykle při více než 64 logických procesorech.
  • Na běžném jednoskupinovém systému je efekt nulový.

Parametr je potřebný pouze pro programy, které dotazují topologii cache na stroji s několika skupinami procesorů. Práci cache ani přidělování paměti nemění. Pro běžný stolní počítač nemá přínos.

Kód pro čtení a uplatnění je potvrzen v ntoskrnl.exe. Hodnota a účel byly ověřeny s veřejným popisem reverzního inženýrství KiSplitLargeCaches.

Parametr Praktické hodnocení
DisablePagingExecutive Obvykle dává velmi malý přínos, udržuje více kódu v RAM
DisablePageCombining Užitečný při potvrzené zátěži slučování stránek na pozadí a velké rezervě RAM
HeapDeCommitFreeBlockThreshold Působí pouze v jádře; pro běžné aplikace nemá praktický přínos
ModifiedWriteMaximum Mění podmínky zápisu změněných stránek; bez zjištěného problému ponechte standardní hodnotu
EnableAsyncLazywrite Standardní hodnota 2 již mechanismus zapíná; opakovaný zápis nic nezlepšuje
CacheUnmapBehindLengthInMB Nastavení sekvenčního čtení; standardní 8 MB se hodí pro běžnou práci
SplitLargeCaches Mění popis topologie pro několik skupin procesorů; na běžném systému nemá efekt

Co je potvrzeno a co nebylo měřeno

Sekce “Co je potvrzeno a co nebylo měřeno”

Jsou potvrzeny výše uvedené cesty, typy, výchozí hodnoty, kód a okamžik čtení parametrů a také omezení rozsahů. Výsledky se vztahují na Windows 11 25H2 build 26200.9168. Chování se může lišit při jiné aktualizaci Windows, objemu RAM, typu úložiště nebo topologii CPU.

Jak zopakovat dynamickou část pozorování — viz Jak ověřit samostatně.

Pro návrat obnovte standardní hodnoty parametrů nebo odstraňte volitelné záznamy. Část hodnot se uplatní při příštím spuštění Windows.

Výzkum a nástroje v něm použité patří vývojáři BoosterX, proto má vývojář na výsledcích přímý zájem. Metodika a hranice použitelnosti jsou popsány v tomto článku; závěry lze ověřit podle otevřených dat a níže uvedených veřejných zdrojů.

Tvrzení o kódu byla ověřena statickou analýzou systémových komponent Windows 11 25H2. Dekompilovaný kód, offsety, zdrojová trasování a interní materiály se nezveřejňují.

Veřejné zdroje ověřeny: 2026-09-02.

  • 2026-09-20: přidán disclaimer o střetu zájmů a odkaz na samostatné ověření dynamických pozorování v metodice.
  • 2026-09-02: první publikace; potvrzeny cesty, defaults, clamps a kód pro čtení parametrů, přidány hranice praktického přínosu.