Затримка DPC: коли фризить сам драйвер

Драйвер усередині переривання працює вище за будь-який потік на машині, тож не з'являється ні в диспетчері завдань, ні на графіку часу кадрів — скільки це коштує, як виміряти це чесно, який файл до якого пристрою належить і єдине виправлення, що працює.

Ти пройшов увесь список. Нічого не запущено, температури в нормі, диск швидкий, гра стоїть на SSD, а машину все одно смикає. Диспетчер завдань показує систему без навантаження. Графік часу кадрів показує запізнілий кадр, але нічого не каже про те, чому він запізнився.

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

Спершу чесне речення. Виправлення для драйвера, який тримає ядро, — це сам цей драйвер, від його виробника. Частина w0a — це вимірювання, ім'я файла і виправлення значень, які лишили старіші програми. Єдиний перемикач, який він колись пропонував поруч із цим, — спрямування переривань пристрою на вибрані ядра, — з 8 жовтня 2026 року працює лише на читання, бо жоден A/B-тест у грі так і не показав завдяки йому жодного здобутого кадру.

Що насправді відбувається

Пристрій — мережева карта, контролер диска, звуковий чип, контролер USB — потребує уваги процесора. Він піднімає переривання, і Windows негайно виконує процедуру обслуговування переривання цього драйвера. Ця процедура працює вище за будь-який пріоритет потоку, який взагалі існує: це не «високий пріоритет», а взагалі поза планувальником потоків. Доки вона не повернеться, на це ядро не можна поставити нічого іншого.

Оскільки місце це дороге, драйвери мають робити там мінімум і відкладати решту у відкладений виклик — DPC, — який виконується трохи згодом, усе ще поперед будь-якого потоку на цьому ядрі.

Поки виконується будь-яке з двох, це ядро нічого не малює і не читає ввід. Якщо на ньому був твій потік рендеру — твій кадр запізнився. Якщо за ним стояв у черзі звіт твоєї миші — запізнився твій ввід. І жодна з цих подій не з'являється в диспетчері завдань, бо немає процесу, якому її можна приписати.

Чому тут одна мілісекунда — це багато

Вартою гонитви це робить проста арифметика:

Як це виміряти і два способи, якими вимірювання зривається

Тест затримки у w0a відкриває сеанс трасування ядра і записує протягом дванадцяти секунд справжнього руху мишею, скільки кожен драйвер тримав ядро. Йому потрібні права адміністратора. Чому тест просить дванадцять секунд пояснює тривалість; як читати тест затримки пояснює кольори.

Два результати не є відповідями, і обидва так і повідомляються, а не округлюються донизу до «чисто»:

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

Числа, точно

ЧислоПравило
Тривалість тестуТипово дванадцять секунд: досить довго, щоб спіймати драйвер, який поводиться погано раз на секунду, і досить коротко, щоб ти справді рухав мишею весь цей час.
Достатньо даних мишіДві секунди власних звітів пристрою, і ніколи не менше ніж 250 вибірок; для миші на 1000 Гц це 2 000. Нижче цього 99-й процентиль — це друга чи третя найгірша вибірка, а не статистика.
Вердикт щодо драйвераНайгірше одиничне виконання драйвера позначається як попередження від 1 мс і як критичне від 4 мс. Це межі, якими ця галузь користується вже два десятиліття; це домовленість, а не вимірювання, яке w0a зробив на твоїй машині.
Повне вимірюванняЧисла драйверів вважаються повними лише тоді, коли сеанс трасування ядра відпрацював і не втратив жодної події. Лічильник, який відмовляється відповідати, вважається прогоном із втратами, а не чистим.
Нижня межа системи99-й процентиль миші плюс половина інтервалу оновлення плюс найгірше виконання драйвера — останнє лише тоді, коли частину ядра було виміряно, бо додавання нуля за невиміряне ядро вивело б гарніше число саме тоді, коли інструмент знає найменше. Це нижня межа, а не сума: власне опитування вводу в грі, її черга рендерингу, робота GPU і відгук панелі — усе це поза нею. Затримка вводу, яку не виправить жодна програма — це решта ланцюжка.

Як читати список

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

Два прочитання, які роблять неправильно:

Який файл до чого належить і що робити з кожним

Ім'я файла — це і є вся підказка, а родина, до якої він належить, вирішує, яким буде виправлення:

РодинаЩо цеЩо справді допомагає
Бездротова мережаДрайвер адаптера Wi-FiДрайвер самого виробника замість загального, який постачає Windows Update. Кабель прибирає цей рядок повністю.
Дротова мережаМережева карта плати або окремаДрайвер від виробника плати. Вимкнення модерації переривань цей рядок не лікує: без неї пакети більше не збираються в пачки, кожен отриманий пакет викликає власне переривання, і драйвер працює не рідше, а частіше. Тому сторінка «Інтернет» не чіпає модерацію переривань на машинах із менш ніж шістьма фізичними ядрами — див. мережеві твіки.
НакопичувачКонтролер на шляху до твого дискаНа NVMe спробуй штатний драйвер Windows і фірмовий та залиш той, з яким тест затримки показує менше значення. Сторонній драйвер накопичувача варто прибрати.
USBХост-контролерДрайвери чипсета і перенесення миші в порт на платі, а не за хабом.
ЗвукКодек і все, що на нього накладеноДрайвер виробника; якщо не минає, загальний звуковий драйвер Windows зазвичай знижує це. Утиліти RGB і звуку працюють на цьому ж шляху.
ДисплейДрайвер відеокартиСайт самого виробника. Якщо почалося після оновлення, відкотися на попередню версію.
Власні компоненти WindowsЧас, витрачений за іншого драйвераТут нема чого «оновлювати» окремо — виправлення драйверів вище знижує і цей рядок.
Керування живленнямШлях, який змінює частоти й стани простоюПідняти мінімальний стан процесора і зменшити глибину C-станів у прошивці — обидва скорочують його, і обидва піднімають споживання в простої. Це обмін, а не виправлення.

Окремого рядка тут заслуговує драйвер-фільтр. Програми формування трафіку й перенаправлення з'єднань пропускають кожен пакет через власний драйвер, і багатосекундні мережеві ривки — їхній найвідоміший побічний ефект; сканування фризів називає їх, коли знаходить. Те саме стосується макронаборів і програм підсвітки, які ставлять фільтр у шлях миші та клавіатури.

Виправлення і не-виправлення

Виправлення — оновити саме той один драйвер, у виробника заліза. Не всю систему, не через програму-оновлювач драйверів і не перевстановленням Windows. Сторінка називає файл точно, щоб ти міг знайти, якому пристрою він належить.

Що цього не виправляє і саме тому тут відхиляється: підміна роздільності таймера, значення керування пам'яттю в ядрі (DisablePagingExecutive, LargeSystemCache) і списки значень реєстру, які ходять під словом «латентність». Жодне з них не змінює того, скільки драйвер тримає ядро, бо тримає його код самого драйвера. Вимикати пристрої навмання — теж не діагностика, хоча вимкнути один пристрій як перевірку, з вимірюванням до і після, — цілком добрий експеримент. Те саме стосується значень рівня пристрою, які ходять разом із цими списками: MSISupported перемикає режим переривань пристрою, і якщо виставити його неправильно, результатом може бути чорний екран, тому w0a ніколи його не записує, а картка відновлення спрямування переривань нижче його не чіпає.

Два сусідні налаштування, яких торкається w0a

Політика переривань пристрою: лише читання, з карткою відновлення

Де Windows її зберігає: для кожного пристрою, у HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\<device>\<instance>\Device Parameters\Interrupt Management\Affinity Policy. DevicePolicy (DWORD) визначає, як розміщуються переривання пристрою; коли воно дорівнює 4, «указані процесори», AssignmentSetOverride — це маска процесорів, якими вони можуть користуватися.

Стандарт Windows: жодного з двох значень немає. Тоді Windows сам обчислює розміщення, а Microsoft радить стандартну політику всюди, де вона застосовна.

Що робить w0a: читає ці значення й не записує їх. З 8 жовтня 2026 року спрямування, яке він колись пропонував зі сторінки «Тест затримки», прибрано, з трьох причин: жоден A/B-тест у грі не показав завдяки йому здобутого кадру, Microsoft радить розміщення, яке обчислює Windows, а неправильна маска — це пристрій, який не запускається.

Шлях назад: якщо якась програма прив'язала переривання пристрою і щось зламалося — миша відпадає, «Код 10» у Диспетчері пристроїв, — картка Спрямування переривань пристрою видаляє обидва значення з усіх пристроїв PCI, зокрема й спрямування, яке лишили старіші версії w0a. Вона просить перезавантаження лише тоді, коли справді щось прибрала, і не чіпає MSISupported.

«Під навантаженням: вимкнути контроль потоку, модерацію переривань і об'єднання сегментів» (сторінка «Інтернет»)

Що записує: 0 у ключове слово *FlowControl мережевого адаптера, на кожному адаптері, який його оголошує. *InterruptModeration, *RscIPv4 і *RscIPv6 записуються лише на машинах щонайменше із шістьма фізичними ядрами і лише на адаптерах, про які відомо, що вони працюють на швидкості нижче 2,5 Гбіт/с; на цих машинах прапорець також вимикає об'єднання сегментів на рівні мережевого стека, якщо воно ще не вимкнене.

Чому модерація лишається ввімкненою на менших машинах: коли модерацію й об'єднання обидва вимкнено, кожен отриманий пакет стає окремим перериванням, а не одним на інтервал модерації, і навантаження відкладених викликів лягає на ядро, яке приймає. Тож вимкнення модерації — не спосіб укоротити рядок мережевого драйвера в «Тесті затримки»: за власним описом w0a, воно прибирає очікування в десятки чи сотні мікросекунд, яке пакет проводить в адаптері, доки не спливе таймер пачки, а додає по перериванню на кожен пакет. Його вплив на список драйверів не виміряно. Якщо твій рядок — мережевий драйвер, прожени тест із застосованим прапорцем і без нього.

Що обіцяє сам прапорець: мікросекунди, для пінгу під навантаженням. Його повідомлення каже, що середній пінг не змінюється.

Коли діє: коли адаптер перезапускається; w0a просить перезавантаження щоразу, коли щось записав.

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

Перевір сам

Ці команди лише читають. У командному рядку або в PowerShell:

reg query "HKLM\SYSTEM\CurrentControlSet\Enum\PCI" /s /v DevicePolicy
reg query "HKLM\SYSTEM\CurrentControlSet\Enum\PCI" /s /v AssignmentSetOverride

Відповідь, яка каже, що пошук завершився без жодного збігу (в англомовному Windows — End of search: 0 match(es) found.), означає, що жоден пристрій не має перевизначення: це стандарт Windows. Збіг виводиться під розділом, у якому його знайдено, а частина PCI цього шляху визначає пристрій.

У PowerShell, для мережевого адаптера:

Get-NetAdapterAdvancedProperty -Name "*" -RegistryKeyword "*FlowControl","*InterruptModeration","*RscIPv4","*RscIPv6" -AllProperties

Це виводить для кожного адаптера поточне налаштування чотирьох ключових слів, які може записати прапорець на сторінці «Інтернет». Адаптер, якого немає у виводі для якогось ключового слова, його не оголошує, і прапорець там нічого не записує.

Потім виміряй ще раз

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

Якщо рядок драйвера опустився, а фризи лишилися, ти дізнався щось справжнє: причина була не в цьому, а решта списку — у чому ігри фризять на Windows 11. Якщо ж у тебе частота кадрів падає й лишається внизу, а не смикається, то це ніколи не було воно — тоді потрібен інший список, раптові просідання FPS в іграх.

Пов'язане

Граєш у CS2? Які параметри запуску ще щось роблять і де в меню відео насправді лежать кадри: Низький FPS і фризи в CS2: виміряний контрольний список

w0a не змінює жодного налаштування Windows, поки ти не попросиш, а твік зберігає старе значення, перш ніж записати нове. Бути в курсі

Ця сторінка допомогла?

Чого бракувало або що не спрацювало? Ми читаємо кожну таку відповідь.

Якщо ця сторінка не розв'язала проблему, напиши нам — скажи, яку статтю ти читав, і ми виправимо статтю.