DPC-latency: wanneer het stuurprogramma zelf de hapering is

Een stuurprogramma binnen een interrupt draait boven elke thread op de machine, dus het duikt in geen enkele taakbeheerder en in geen enkele frametime-grafiek op — wat dat kost, hoe je het eerlijk meet, welk bestand bij welk apparaat hoort, en de ene oplossing die werkt.

Je hebt de lijst afgewerkt. Er draait niets, de temperaturen zijn in orde, de schijf is snel, de game staat op een SSD, en de machine schokt nog steeds. Taakbeheer laat een systeem zien dat niets doet. De frametime-grafiek laat het late frame zien maar zegt niets over waarom het te laat was.

Er is één oorzaak die precies deze vorm verklaart, en die is onzichtbaar in elk hulpmiddel waar de meeste mensen naar grijpen, omdat hij eronder gebeurt.

Eerst de eerlijke zin. De oplossing voor een stuurprogramma dat een kern vasthoudt, is dat stuurprogramma, van de fabrikant. Het deel van w0a is de meting, de bestandsnaam en het herstellen van waarden die oudere programma's hebben achtergelaten. De enige schakelaar die het hier vroeger aanbood, de interrupts van een apparaat naar gekozen kernen sturen, is sinds 8 oktober 2026 alleen-lezen, omdat geen enkele A/B-test in een game ooit een frame liet zien dat erdoor werd gewonnen.

Wat er werkelijk gebeurt

Een apparaat — een netwerkkaart, een schijfcontroller, een geluidschip, een USB-controller — heeft de aandacht van de processor nodig. Het geeft een interrupt af, en Windows draait meteen de interrupt service routine van het stuurprogramma. Die routine draait boven elke threadprioriteit die er is: niet "hoge prioriteit", maar volledig buiten de threadplanner om. Er kan niets anders op die kern worden ingepland tot hij terugkeert.

Omdat dat een dure plek is om te zijn, horen stuurprogramma's daar het minimale te doen en de rest uit te stellen naar een uitgestelde aanroep — een DPC — die een moment later draait, nog steeds vóór elke thread op die kern.

Zolang een van beide draait, tekent die kern niets en leest hij geen invoer. Zat je renderthread erop, dan is je frame te laat. Stond je muisrapport erachter in de wachtrij, dan is je invoer te laat. En geen van beide gebeurtenissen duikt in een taakbeheerder op, want er is geen proces om ze aan toe te schrijven.

Waarom een milliseconde hier veel is

Het rekenwerk is wat dit de moeite van het najagen waard maakt:

Het meten, en de twee manieren waarop de meting mislukt

De Latencytest van w0a opent een kerneltracesessie en legt twaalf seconden lang, tijdens echte muisbeweging, vast hoe lang elk stuurprogramma een kern vasthield. Hij heeft beheerdersrechten nodig. Waarom de test twaalf seconden muisbeweging vraagt gaat over de lengte; De latencytest lezen gaat over de kleuren.

Twee uitslagen zijn geen antwoord, en beide worden ook zo gemeld in plaats van naar "schoon" te worden afgerond:

Er is een derde, subtielere: een sessie die gebeurtenissen heeft laten vallen kan de ergste uitvoering helemaal hebben gemist, en daarom zegt de pagina dat het getal misschien niet het echte maximum is. Dit is hetzelfde principe dat de stotterscan overal toepast — een regel die niet kon draaien telt als niet gecontroleerd, nooit als schoon.

De getallen, precies

GetalDe regel
Duur van de testStandaard twaalf seconden: lang genoeg om een stuurprogramma te betrappen dat één keer per seconde misgaat, en kort genoeg dat je de muis echt de hele tijd blijft bewegen.
Genoeg muisgegevensTwee seconden van de eigen rapporten van het apparaat, en nooit minder dan 250 metingen; voor een muis van 1000 Hz is dat 2.000. Daaronder is het 99e percentiel de op een na of op twee na slechtste meting, geen statistiek.
Oordeel over het stuurprogrammaDe slechtste enkele uitvoering van een stuurprogramma wordt vanaf 1 ms als waarschuwing gemarkeerd en vanaf 4 ms als kritiek. Dat zijn de grenzen die dit vakgebied al twintig jaar gebruikt; ze zijn een afspraak, geen meting die w0a op jouw machine heeft gedaan.
Een volledige metingDe getallen van de stuurprogramma's tellen alleen als volledig wanneer de kerneltracesessie heeft gedraaid en geen gebeurtenissen heeft laten vallen. Een teller die weigert te antwoorden, wordt behandeld als een run met verlies, niet als een schone.
Ondergrens systeemHet 99e percentiel van de muis, plus een half verversingsinterval, plus de slechtste uitvoering van een stuurprogramma — dat laatste alleen als het kerneldeel is gemeten, want nul optellen voor een niet-gemeten kernel zou een mooier getal tonen precies wanneer het hulpmiddel het minst weet. Het is een ondergrens, nooit een totaal: de eigen invoerbemonstering van de game, de renderwachtrij, het werk van de GPU en de reactie van het paneel vallen er allemaal buiten. De invoervertraging die geen software oplost is de rest van de keten.

De lijst lezen

Elk stuurprogramma verschijnt met zijn bestandsnaam, zijn langste enkele vasthoudtijd, zijn aandeel in de gemeten tijd, en hoe vaak het heeft gedraaid. Sorteer op langste vasthoudtijd; dat is het getal dat je een frame kost.

Twee dingen die mensen verkeerd lezen:

Welk bestand bij wat hoort, en wat je aan elk doet

De bestandsnaam is de hele aanwijzing, en de familie waar hij bij hoort bepaalt de oplossing:

FamilieWat het isWat werkelijk helpt
Draadloos netwerkDe driver van de wifi-adapterDe eigen driver van de fabrikant in plaats van de generieke die Windows Update levert. Een kabel haalt de regel helemaal weg.
Bekabeld netwerkNetwerkkaart op het moederbord of een insteekkaartDe driver van de moederbordfabrikant. Interruptmoderatie uitzetten verhelpt deze regel niet: zonder moderatie worden pakketten niet meer gebundeld, geeft elk ontvangen pakket een eigen interrupt en draait de driver niet minder vaak, maar vaker. Daarom laat de pagina Verbinding interruptmoderatie met rust op machines met minder dan zes fysieke kernen — zie Netwerk-tweaks.
OpslagDe controller op het pad naar je schijfProbeer op NVMe de eigen driver van Windows en die van de fabrikant, en houd de driver die in de latencytest lager uitkomt. Een opslagdriver van derden is het weghalen waard.
USBHostcontrollerChipsetdrivers, en de muis verplaatsen naar een poort op het moederbord in plaats van achter een hub.
AudioDe codec, en alles wat erbovenop is gelegdDe driver van de fabrikant; blijft het, dan verlaagt de generieke audiodriver van Windows het meestal. RGB- en audiohulpprogramma's draaien over dit pad.
BeeldschermDe GPU-driverDe site van de fabrikant zelf. Begon het na een update, ga dan terug naar de vorige versie.
Windows' eigen onderdelenTijd die namens een ander stuurprogramma is besteedOp zichzelf niets om bij te werken — de stuurprogramma's hierboven oplossen verlaagt deze regel ook.
EnergiebeheerHet pad dat klok- en rusttoestanden wijzigtDe minimale processorstatus verhogen en de C-state-diepte in de firmware verlagen korten het allebei in, en verhogen allebei het verbruik in rust. Dat is een ruil, geen oplossing.

Een filterstuurprogramma verdient hier een eigen regel. Programma's die verkeer vormgeven of verbindingen omleiden, sturen elk pakket door een eigen driver, en netwerkhaperingen van meerdere seconden zijn hun bekendste bijwerking; de stotterscan noemt ze bij naam als hij ze vindt. Hetzelfde geldt voor macropakketten en verlichtingsprogramma's die een filter in het pad van muis en toetsenbord installeren.

De oplossing, en de niet-oplossingen

De oplossing is dat ene stuurprogramma bijwerken, bij de hardwarefabrikant. Niet het hele systeem, niet met een driver-updatertool, en niet door Windows opnieuw te installeren. De pagina noemt het bestand precies, zodat je kunt opzoeken bij welk apparaat het hoort.

Wat dit niet oplost, en om die reden hier wordt geweigerd: het overschrijven van de timerresolutie, kernelwaarden voor geheugenbeheer (DisablePagingExecutive, LargeSystemCache), en de registerlijsten die onder het woord "latency" rondgaan. Geen daarvan verandert hoe lang een stuurprogramma een kern vasthoudt, want het is de code van dat stuurprogramma die vasthoudt. Apparaten lukraak uitschakelen is ook geen diagnose — al is één apparaat bij wijze van test uitschakelen, met een meting ervoor en erna, een prima experiment. Hetzelfde geldt voor de waarden op apparaatniveau die samen met deze lijsten rondgaan: MSISupported wisselt de interruptmodus van een apparaat, en verkeerd gezet kan het resultaat een zwart scherm zijn, dus w0a schrijft hem nooit, en de reparatiekaart voor de interruptsturing hieronder laat hem met rust.

De twee instellingen in de buurt die w0a aanraakt

Interruptbeleid van een apparaat: alleen-lezen, met een reparatiekaart

Waar Windows het bewaart: per apparaat, onder HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\<device>\<instance>\Device Parameters\Interrupt Management\Affinity Policy. DevicePolicy (DWORD) kiest hoe de interrupts van het apparaat worden geplaatst; staat die op 4, "opgegeven processors", dan is AssignmentSetOverride het masker van de processors die ze mogen gebruiken.

Windows-standaard: geen van beide waarden is aanwezig. Windows berekent de plaatsing dan zelf, en Microsoft raadt het standaardbeleid aan overal waar het van toepassing is.

Wat w0a doet: het leest deze waarden en schrijft ze niet. Sinds 8 oktober 2026 is de sturing die het vroeger vanaf de pagina Latencytest aanbood verdwenen, om drie redenen: geen enkele A/B-test in een game liet een frame zien dat erdoor werd gewonnen, Microsoft raadt de plaatsing aan die Windows berekent, en een verkeerd masker is een apparaat dat niet start.

Terug: heeft een programma de interrupts van een apparaat vastgepind en is er iets stukgegaan — een muis die wegvalt, een "Code 10" in Apparaatbeheer —, dan verwijdert de kaart Interruptsturing van apparaten beide waarden van elk PCI-apparaat, ook de sturing die oudere versies van w0a hebben achtergelaten. Hij vraagt alleen om een herstart als hij echt iets heeft verwijderd, en hij laat MSISupported met rust.

"Onder belasting: flow control, interrupt moderation en segmentsamenvoeging uit" (pagina Verbinding)

Wat het schrijft: 0 in het sleutelwoord *FlowControl van de netwerkadapter, op elke adapter die het opgeeft. *InterruptModeration, *RscIPv4 en *RscIPv6 worden alleen geschreven op machines met minstens zes fysieke kernen, en alleen op adapters waarvan bekend is dat ze onder 2,5 Gbit/s draaien; op die machines zet het vakje ook de segmentsamenvoeging op het niveau van de netwerkstack uit, tenzij die al uit staat.

Waarom de moderatie op kleinere machines aan blijft: met moderatie en samenvoeging allebei uit wordt elk ontvangen pakket een eigen interrupt in plaats van één per moderatie-interval, en de last van uitgestelde aanroepen komt terecht op de kern die ontvangt. Interruptmoderatie uitzetten is dus geen manier om de regel van het netwerkstuurprogramma in de Latencytest korter te maken: volgens de eigen beschrijving van w0a haalt het de wachttijd van tientallen tot honderden microseconden weg die een pakket in de adapter doorbrengt tot de timer van de bundel afloopt, en voegt het een interrupt per pakket toe. Het effect ervan op de lijst met stuurprogramma's is niet gemeten. Is het netwerkstuurprogramma jouw regel, voer de test dan uit met het vakje toegepast en zonder.

Wat het vakje zelf belooft: microseconden, bij de ping onder belasting. De melding ervan zegt dat de gemiddelde ping niet verandert.

Wanneer het ingaat: wanneer de adapter opnieuw start; w0a vraagt om een herstart zodra het iets heeft geschreven.

Terug: de kaart Offloads van de netwerkadapter zet de hardware-offloads, interruptmoderatie, Energy Efficient Ethernet, selectieve onderbreking en ontvangstbuffers terug op de standaarden van het stuurprogramma zelf, zoals het stuurprogramma ze opgeeft.

Controleer het zelf

Deze opdrachten lezen alleen. In de opdrachtprompt of in PowerShell:

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

Een antwoord dat zegt dat de zoekactie zonder enige overeenkomst eindigde (in een Engelstalige Windows End of search: 0 match(es) found.), betekent dat geen enkel apparaat een overschrijving heeft: de Windows-standaard. Een overeenkomst wordt getoond onder de sleutel waarin ze is gevonden, en het PCI-deel van dat pad wijst het apparaat aan.

In PowerShell, voor de netwerkadapter:

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

Dit toont per adapter de huidige instelling van de vier sleutelwoorden die het vakje op de pagina Verbinding kan schrijven. Een adapter die voor een sleutelwoord niet verschijnt, geeft het niet op, en het vakje schrijft daar niets.

Meet daarna opnieuw

Dezelfde methode, dezelfde twaalf seconden, dezelfde machine. De pagina vergelijkt met je vorige run en meldt een verandering onder 5% als geen verandering in plaats van als verbetering, want twee runs op een onaangeroerde machine verschillen sowieso een paar procent — een hand beweegt elke keer anders.

Is de regel van het stuurprogramma gedaald en het gestotter niet, dan heb je iets echts geleerd: dit was je oorzaak niet, en Waarom games stotteren op Windows 11 heeft de rest van de lijst. Heb je een framerate die daalt en laag blijft in plaats van een schok, dan was het dit nooit — Plotselinge FPS-drops in games is dan de lijst die je nodig hebt.

Gerelateerd

Speel je CS2? Welke startopties nog iets doen en waar de frames in het videomenu werkelijk zitten: Lage FPS en gestotter in CS2: een gemeten checklist

w0a verandert geen enkele Windows-instelling tot je erom vraagt, en een tweak bewaart de oude waarde voordat hij een nieuwe schrijft. Herinner me

Heeft deze pagina geholpen?

Wat ontbrak, of wat werkte er niet? We lezen elk van deze berichten.

Heeft deze pagina het niet opgelost, schrijf ons dan — noem het artikel dat je hebt gelezen, dan verbeteren we het.