Share via


Timeout Detection and Recovery (TDR)

Hørt om TDR før? Kanskje ikke. Det er en del av Windows Display Driver Model, WDDM. En av de vanligste problemene med skjermkort (GPU og driver) er at disse henger seg mens de utfører prosessering.

TDR forsøker å detektere denne typen heng og resete både driver og GPU dersom problemet oppstår. Prosessen kan forklares ganske kort slik:

  1. Video Scheduler'n i Windows Vista detekterer at GPU'en bruker mer tid enn "tillatt" for å utføre den aktuelle operasjonen og prøver da å fjerne operasjonen (preempt). Den venter så 2 sekunder på tilbakemelding for denne operasjonen. Dersom GPU'en ikke klarer å hoppe over gjeldende instruksjon eller bli ferdig med den i løpet av 2 sekunder blir GPU'ens tilstand definert som "Heng".
  2. Forberedelse til feilretting. OS'et informerer da WDDM drivern (skjermdrivern) om at GPU'en skal resetes og instruerer drivern om å avslutte operasjoner mot hardware og minne. I tillegg samles informasjon som kan være nyttig til feilsøking.
  3. OS'et restarter så de nødvendige delen av Video stacken og WDDM drivern reseter GPU. Alt dette skjer uten at en OS restart er nødvendig.

 

Etter en slik reset kan det være at enkelte DirectX programmer ikke fungerer og må restartes. Spesielt eldre DirectX. Godt skrevne DirectX9 og 10 applikasjoner skal kunne håndtere dette gjennom å opprette Direct3D enheten og alle sine objekter på nytt.

Error Messaging

 

Innstillinger

Enkelte drivere pr idag oppfyller ikke kravet til å svare innen 2 sekunder og blir således restartet uten at det egentlig betyr at GPU'en har hengt seg. Det finnes en rekke registry settings for å editere på hvordan TDR skal oppføre seg.

Disse befinner seg under : HKLM\System\CurrentControlSet\Control\GraphicsDrivers.

  • TdrLevel: REG_DWORD. The initial level of recovery. The possible values are:
    • TdrLevelOff (0). – Detection disabled.
    • TdrLevelBugcheck (1) – Bug check on detected timeout, for example, no recovery.
    • TdrLevelRecover(3) – Recover on timeout. This is the default value.
  • TdrDelay: REG_DWORD. The number of seconds that the GPU is allowed to delay the preempt request from the scheduler. This is effectively the timeout threshold. The default value is 2.

Det er verdien TdrDelay som er den faktiske timeouten, som enkelte drivere synder mot idag. Spesielt enkelte nvidia drivere og kort klarer ikke oppfylle timeout'en på 2 sekunder. I enkelte tilfeller kan unødige resets av disse unngås ved å øke timeouten. Om du søker litt på nett vil du finne flere diskusjoner rundt denne løsningen. (Og som alltid, vær litt forsiktig når du leker i registry og spesielt editerer på innstillinger for såpass lavnivå tjenester som OS'et er avhengig av;)

 

 Sjekk denne blogposten om du vil lese mer om hva WDDM er.