Перейти до вмісту

Memory Manager і системний cache Windows: paging, page combining і lazy write

На цій сторінці

У цій серії перевірено сім параметрів підкачки, об’єднання однакових сторінок, купи ядра та файлового кешу. У Windows 11 25H2 знайдено код читання кожного з них. Практична користь залежить від параметра та умов роботи.

DisablePageCombining вимикає фонове об’єднання сторінок: диспетчер пам’яті перестає виконувати цю роботу, але витрати RAM можуть зрости. DisablePagingExecutive утримує вивантажуваний код драйверів у фізичній пам’яті; користь зазвичай мала. Решта параметрів застосовні лише до окремих задач ядра або накопичувачів або вже мають відповідні значення за замовчуванням у 25H2.

Для кожного значення перевірялися:

  1. точний шлях у реєстрі та тип;
  2. значення за замовчуванням, задане кодом Windows 11 25H2;
  3. пов’язані значення тієї самої підсистеми;
  4. системний код читання та момент його виконання;
  5. обмеження діапазону, перетворення значень та одиниці вимірювання;
  6. прямий ефект і межі застосовності.

Окрім коду читання ми перевіряли, де застосовується параметр, які наслідки має його зміна та в яких сценаріях вона може бути корисною. Самого лише наявності параметра для рекомендації недостатньо.

Область дослідження та докази

Section titled “Область дослідження та докази”
  • 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 Paging pageable-коду системних драйверів
той самий шлях DisablePageCombining REG_DWORD 0 Фонове об’єднання однакових фізичних сторінок
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager HeapDeCommitFreeBlockThreshold REG_DWORD 0x1000 (4 KB) для kernel heap Поріг decommit вільних блоків kernel-mode heap
той самий шлях ModifiedWriteMaximum REG_DWORD 1 одиниця = 1 MB Верхня межа modified page writer після clamp
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 Представлення cache topology між processor groups

При 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 від об’єднання корисніша за збережений процесорний час.

Код читання та фонової задачі підтверджено в ntoskrnl.exe. Microsoft описує об’єднання сторінок і компроміс між процесорною роботою та економією RAM.

Значення задає поріг звільнення виділеної пам’яті (decommit) для вільного блоку купи ядра. При більшому порозі такі операції для великих вільних блоків відбуваються рідше.

У Windows 11 25H2 код читання знаходиться в ntoskrnl.exe, а застосування параметра пов’язане з функцією ядра RtlCreateHeap. У ntdll.dll відповідного коду читання для куп звичайних процесів не знайдено.

  • Значення за замовчуванням у коді для купи ядра: 0x1000 (4 KB).
  • 0x40000 (256 KB) є допустимим порогом для купи ядра.
  • Історичні документи Microsoft описували однойменний user-mode сценарій старих версій Windows, тому його не можна автоматично переносити на Windows 11 25H2.

Для звичайних застосунків користі практично немає: їхні купи не використовують це значення. Параметр може змінювати частоту звільнення пам’яті лише в купі ядра. Без виміряної проблеми саме з нею очікуваний ефект дуже малий.

Читання в режимі ядра підтверджено в ntoskrnl.exe. Ефект для користувацьких процесів у 25H2 не підтверджено.

Параметр задає верхню межу для механізму запису змінених сторінок (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 підтверджено кодом і незалежним описом параметрів реєстру, складеним за результатами зворотного аналізу.

Параметр задає відстань у мегабайтах, після якої 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. Параметр використовується під час обробки відношення RelationCache у KeQueryLogicalProcessorRelationship.

Змінюється лише опис топології, який повертає системний 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 і код читання параметрів, додано межі практичної користі.