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

Драйвер внутри прерывания работает выше любого потока на машине, поэтому не попадает ни в один диспетчер задач и ни в один график времени кадра — чего это стоит, как измерить честно, какой файл какому устройству принадлежит и единственное решение, которое работает.

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

Есть одна причина, которая объясняет ровно эту картину, и она невидима почти во всех инструментах, к которым обычно тянутся, — потому что происходит под ними.

Сначала честная фраза. Решение для драйвера, который держит ядро, — сам этот драйвер, от его производителя. Доля w0a — измерение, имя файла и исправление значений, которые оставили старые инструменты. Единственный переключатель, который он раньше предлагал рядом, — направление прерываний устройства на выбранные ядра — с 8 октября 2026 года работает только на чтение, потому что ни один игровой A/B-тест так и не показал выигранного им кадра.

Что на самом деле происходит

Устройству — сетевой карте, контроллеру диска, звуковому чипу, контроллеру USB — нужно внимание процессора. Оно поднимает прерывание, и Windows немедленно выполняет процедуру обработки прерывания этого драйвера. Эта процедура работает выше любого приоритета потоков, какой только есть: не «высокий приоритет», а вообще вне планировщика потоков. Пока она не вернётся, на этом ядре не может быть запланировано ничего другого.

Поскольку находиться там дорого, драйверы обязаны делать в этом месте минимум и откладывать остальное в отложенный вызов процедуры — DPC, — который выполняется мгновением позже, всё ещё впереди любого потока на этом ядре.

Пока выполняется одно или другое, это ядро ничего не рисует и не читает ввод. Если на нём был твой поток отрисовки — твой кадр опоздал. Если за ним стоял в очереди отчёт мыши — опоздал твой ввод. И ни одно из этих событий не попадает в диспетчер задач, потому что приписать его нечему: процесса нет.

Почему миллисекунда здесь — это много

Гоняться за этим заставляет арифметика:

Как это измерить и два способа, которыми измерение проваливается

Тест задержки в w0a открывает сессию трассировки ядра и записывает, сколько каждый драйвер удерживал ядро в течение двенадцати секунд настоящего движения мышью. Ему нужны права администратора. Почему тест просит 12 секунд движения мышью — про длительность; Как читать тест задержки — про цвета.

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

Есть и третий, более тонкий: сессия, потерявшая события, могла пропустить как раз самое долгое выполнение, поэтому страница говорит, что число может быть не настоящим худшим. Это тот же принцип, который сканер фризов применяет везде: правило, которое не смогло отработать, считается непроверенным, а не чистым.

Числа, точно

ЧислоПравило
Длительность тестаПо умолчанию двенадцать секунд: достаточно долго, чтобы поймать драйвер, который сбоит раз в секунду, и достаточно коротко, чтобы ты действительно двигал мышью всё это время.
Достаточно данных мышиДве секунды собственных отчётов устройства и никогда не меньше 250 отсчётов; для мыши на 1000 Гц это 2000. Ниже этого 99-й процентиль — это второй или третий худший отсчёт, а не статистика.
Вердикт по драйверуХудшее одиночное выполнение драйвера помечается как предупреждение начиная с 1 мс и как критическое начиная с 4 мс. Это границы, которыми эта область пользуется два десятилетия; это соглашение, а не измерение, которое w0a сделал на твоей машине.
Полное измерениеЦифры драйверов считаются полными, только когда трассировка ядра отработала и её сессия не потеряла ни одного события. Счётчик, который отказывается отвечать, считается прогоном с потерями, а не чистым.
Нижняя граница системы99-й процентиль мыши плюс половина интервала обновления плюс худшее выполнение драйвера — последнее только тогда, когда трассировка ядра была измерена, потому что прибавление нуля за неизмеренное ядро напечатало бы более красивое число ровно тогда, когда инструмент знает меньше всего. Это нижняя граница, а не сумма: собственный опрос ввода в игре, её очередь отрисовки, работа видеокарты и отклик матрицы — всё это вне её. Задержка ввода, которую не исправит ни одна программа — остальная часть цепочки.

Как читать список

Каждый драйвер идёт со своим именем файла, самым долгим одиночным удержанием, своей долей измеренного времени и числом запусков. Сортируй по самому долгому удержанию — это то число, которое стоит тебе кадра.

Два прочтения, в которых ошибаются:

Какой файл чему принадлежит и что делать с каждым

Имя файла — это вся улика, а решение определяется семейством, к которому оно относится:

СемействоЧто этоЧто действительно помогает
Беспроводная сетьДрайвер адаптера Wi-FiСобственный драйвер производителя, а не универсальный из Центра обновления Windows. Кабель убирает эту строку целиком.
Проводная сетьСетевой контроллер на плате или отдельной картойДрайвер производителя платы. Отключение модерации прерываний эту строку не лечит: без неё пакеты больше не собираются в пачки, каждый принятый пакет вызывает собственное прерывание, и драйвер работает не реже, а чаще. Поэтому страница Интернет не трогает модерацию прерываний на машинах меньше чем с шестью физическими ядрами — см. Сетевые твики.
НакопителиКонтроллер на пути к твоему дискуНа 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 просит перезагрузку всякий раз, когда что-то записал.

Путь назад: карточка Разгрузка сетевого адаптера возвращает разгрузки, модерацию прерываний, Energy Efficient 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, пока ты не попросишь, а твик сохраняет старое значение, прежде чем записать новое. Сообщить мне

Эта страница помогла?

Чего не хватило или что не сработало? Мы читаем каждый такой ответ.

Если эта страница не решила проблему, напиши нам — скажи, какую статью ты читал, и мы её исправим.