SQL Server-timingværdier kan være forkerte, når du bruger hjælpeprogrammer eller teknologier, der ændrer CPU-frekvenser

Resumé

Microsoft SQL Server 2005 anvender CPU-tælleren med høj opløsning til at give funktioner til tidsindstilling på mikrosekunder. Et mikrosekund er en milliontedel af et sekund (eller en tusindedel af et millisekund). SQL Server-timingværdier kan dog være forkerte, hvis du bruger teknologier, der ændrer CPU-frekvenser. Dette problem kan f.eks. opstå, når du bruger en af følgende teknologier:

  • CPU-stepping
  • AMD Cool'n'Quiet-teknologi
  • Forskellige strømstyringssystemer

Denne artikel indeholder metoder og yderligere oplysninger, der kan hjælpe dig med at løse dette problem.

Symptomer

Når du bruger sætningen SET STATISTICS TIME til at vise tider for serverudførelse, parse og kompilering, kan du få vist forkerte værdier. For eksempel bemærker du måske, at den forløbne tid for SQL Server-eksekveringstiden er meget længere end CPU-tiden. Dette problem kan påvirke nøjagtigheden af ydelsesjusteringen. Dette problem opstår, når du bruger en af de teknologier, der er angivet i afsnittet "Oversigt" på serveren.

Årsag

Dette problem opstår, fordi CPU-frekvenser ændres, når du bruger disse teknologier. SQL Server 2005 anvender CPU-tælleren med høj opløsning til at give funktioner til tidsindstilling på mikrosekunder. Hvis CPU-frekvenser ændres for at spare energi og reducere varmeproduktionen, kan beregnede varigheder være forkerte.

Løsning

Oplysninger om servicepakker

Løs dette problem ved at hente den nyeste servicepakke til SQL Server 2005. Du kan finde flere oplysninger ved at klikke på nedenstående artikelnummer for at få vist artiklen i Microsoft Knowledge Base:

913089 Sådan får du den nyeste servicepakke til SQL Server 2005
Bemærk! I SQL Server 2005 Service Pack 3 og senere servicepakker bruges processortidsstemplet ikke. Disse versioner af SQL Server 2005 bruger en mere pålidelig timer, der har en maksimal præcision på 1 millisekund.

Status

Problemet blev først løst i SQL Server 2005 Service Pack 3.

Løsning

SQL Server 2005 kræver kendte og stabile datapunkter for at kunne udføre nøjagtig justering af ydeevnen. Hvis dynamiske CPU-frekvensjusteringer er aktiveret på computeren, kan du deaktivere dem, så CPU'erne opretholder en stabil frekvens, før du begynder at overvåge og finjustere ydeevnen i SQL Server. Det kan du gøre ved at benytte følgende metoder.

Konfigurer strømstyringsmodellen på computeren for at tvinge CPU'erne til at forblive på maksimal frekvens

Det kan du gøre ved at udføre disse trin:

  1. Klik på Start, klik på Kør, skriv Powercfg.cpl, og klik derefter på OK.

  2. Klik på Altid til på listen Strømstyringsindstillinger i dialogboksen Egenskaber for strømstyring.

  3. Klik på OK.

Der kan forekomme en afvigelse. En afvigelse er en afvigelse mellem CPU-frekvensværdier. Du kan finde flere oplysninger i afsnittet "Drift". I dette tilfælde skal du genstarte Microsoft Windows for at synkronisere frekvenser for alle CPU'er, efter du har ændret strømstyringsskemaet.

Hvis du ikke kan genstarte computeren, skal du aktivere SQL Server-processortilknytning for at forhindre, at SQL Server-arbejdstråde flyttes mellem CPU'er. Når du gør dette, behøver du ikke at genstarte computeren, selvom der opstår en afvigelse mellem CPU-frekvensværdierne. Hvis du vil aktivere SQL Server-processortilhørsforhold for alle CPU'er på serveren, skal du bruge en anden maske, afhængigt af antallet af logiske processorer på serveren.

Følgende tabel viser eksempelscenarier.

CPU-nummer Erklæringer, der muliggør processortilhørsforhold
02 CPU'er Administrerende direktør sp_configure 'Affinity Mask', 0x00000003
START
konfigurer igen
START
04 CPU'er sp_configure "Affinity Mask", 0x0000000F
START
konfigurer igen
START
08 CPU'er Administrerende direktør sp_configure 'Affinity Mask', 0x000000FF
START
konfigurer igen
START
16 CPU'er Administrerende sp_configure 'Affinity Mask', 0x0000FFFF
START
konfigurer igen
START
32 CPU'er leder sp_configure 'Affinity Mask', 0xFFFFFFFF
START
konfigurer igen
START

Bemærk, at det muligvis ikke er tilstrækkeligt at deaktivere funktioner til CPU-frekvensvariation på BIOS-niveau. Forskellige tredjepartsværktøjer kan ændre CPU-frekvenser. Nogle implementeringer aktiverer frekvensjusteringer, selv når CPU'erne er under maksimal strømstyringsindstilling. I dette tilfælde skal du deaktivere disse tredjepartsværktøjer, når du justerer ydeevnen i SQL Server 2005.

Brug tredjepartsværktøjer og drivere til at synkronisere CPU-frekvenser og CPU-urtællere

I sjældne tilfælde kan et system kræve en opdatering fra producenten for at rette problemer med CPU-frekvens. Det er den bedste fremgangsmåde at kontrollere systemet for de seneste BIOS-, mikrokode- og firmwareopdateringer, hvis du har mistanke om, at systemet kan have et problem.

Flere oplysninger

Microsoft SQL Server 2000 og tidligere versioner af SQL Server bruger Windows-tidsmekanismerne. Tidsmekanismerne anvender millisekundpræcisionsværdier. Denne præcision er typisk 10 til 15 ms. Præcisionen kan dog være op til 55 ms. SQL Server-forespørgsler fuldføres ofte inden for étcifrede millisekund- eller mikrosekund-tidsintervaller. Denne præcision kræver en timer med høj opløsning. Derfor rapporterer disse versioner af SQL Server varigheden af nogle forespørgsler som 0 ms. Det er derfor svært at overvåge ydeevnen og finjustere ydeevnen i SQL Server i tidligere versioner af SQL Server.

SQL Server 2005 forbedrer nøjagtigheden ved at bruge CPU-tælleren med høj opløsning til at give funktioner til tidsindstilling på mikrosekunder. Når du bruger de teknologier, der er angivet i afsnittet "Oversigt", kan de rapporterede timingværdier være forkerte.

Dette problem kan påvirke følgende objekter og funktioner:

  • Spor hændelser:

    • Begivenheden Opmærksomhed

    • Hændelser i noden Lagrede procedurer

    • Hændelser i TSQL-noden

    • Hændelser i noden Objekter

    • Hændelser i noden Transaktioner

  • Dynamiske styringsvisninger:

    • sys.dm_exec_query_stats

    • sys.dm_exec_requests

    • sys.dm_exec_sessions

    • sys.dm_io_pending_io_requests

    • sys.dm_os_ring_buffers

    • sys.dm_os_sys_info

    • sys.dm_io_virtual_file_stats

    • sys.dm_os_wait_stats

  • Sætningen SET STATISTICS TIME

  • Systemtabellen sysprocesser

Når du har installeret SQL Server 2005 Service Pack 2 (SP2), logger SQL Server en fejlmeddelelse i fejlloggen, når SQL Server registrerer, at timerne til høj opløsning ikke er synkroniseret mellem CPU'erne. Fejlmeddelelsen angiver, at tidsindstillingerne for ydeevnen muligvis ikke er nøjagtige, og at brugerne bør være forsigtige med at bruge ydelsesdata.

Teksten i fejlmeddelelsen ligner en af følgende fejlmeddelelser:

Fejlmeddelelse 1

Bemærk

Tidsstempeltælleren for CPU på planlægger-id 2 synkroniseres ikke med andre CPU'er.

Fejlmeddelelse 2

Bemærk

CPU-tidsstempelfrekvensen er ændret fra 191469 til 1794177 ticks pr. millisekund. Den nye frekvens vil blive brugt

SQL Server bruger RDTSC-instruktionen (Real Time Stamp Counter) til at registrere antallet af 64-bit CPU-tick. Du kan dividere denne værdi med CPU-frekvensen for at konvertere værdien til millisekundværdier. Tidsvariationer kan forekomme, når CPU-frekvensen ændres, eller der opstår drift.

CPU-stepping

CPU-stepping defineres som en bevidst ændring i CPU-frekvens. CPU-stepping kan også være kendt som Intel SpeedStep-teknologi eller AMD PowerNow! Teknologi. Når CPU-stepping forekommer, kan CPU-hastigheden stige eller falde i trin så små som 50 MHz for at spare energi og reducere varmeafgivelsen. CPU'er, der er inden for den samme NUMA-node (non-uniform memory access), justerer ikke frekvenser uafhængigt.

Følgende tabel illustrerer, hvordan ændringer af CPU-trin kan påvirke timingberegninger.

Handling RDTSC-flåter Ticks pr. millisekund (frekvens) Tid på vægur
Start Batch 1 200 0
Frekvenstrin ned 200 100 1 ms
Afslut batch 500 3ms
TOTALER 500 4ms

SQL Server registrerer RDTSC-kryds ved både start og slut RDTSC-tick. Derefter dividerer SQL Server ticks med frekvensværdien.

I dette eksempel udføres følgende tidsberegninger, når du bruger en hyppighedsværdi på 200 eller 100:

  • Frekvens 200: 500/200 = 2,5 ms

  • Frekvens 100: 500/100 = 5 ms

Ingen af tidsberegningerne svarer til det faktiske klokkeslæt på væguret på 4 ms.

Hvis denne beregning bruges i en RPC:Completed-sporingshændelse, rapporteres datakolonnerne varighed og sluttid forkert. Hændelsen RPC:Completed registrerer starttiden for uret og antallet af tick for CPU. For at opnå en højere opløsningstiming end Windows-forsyninger i SQL Server 2005 beregnes datakolonnerne varighed og sluttidspunkt i en SQL Server-sporing ved hjælp af det forløbne antal CPU-tik. Kolonnen Sluttidspunkt beregnes ved at føje kolonnen Varighed til kolonnen Starttidspunkt. I dette eksempel beregnes kolonnen sluttidspunkt ved fejlagtigt at lægge enten 2,5 ms eller 5 ms til starttidspunktet.

Afdrift

Afvigelse er en afvigelse i CPU-urværdier. Systemer, der har flere CPU'er, kan producere forskellige CPU-urværdier for det samme tidspunkt. Selvom det ikke er almindeligt, kan CPU'er opleve adskillelse af ur over tid.

Følgende eksempel viser, hvordan afvigelsændringer kan påvirke resultatet af datakolonnen varighed i en SQL Server-sporing. I eksemplet antages det, at CPU-frekvensen forbliver stabil på 200 ticks pr. millisekund. Følgende tabel illustrerer hændelserne i dette scenarie.

Handling Windows planlagt CPU CPU 1 RDTSC CPU 2 RDTSC Tid på vægur
Start Batch 1 100 1100 0
Afslut batch 2 900 1900 4 ms
TOTALER 4 ms

SQL Server registrerer RDTSC-afkrydsningerne ved både start- og slutpunkterne. Derefter dividerer SQL Server RDTSC-ticks med frekvensværdien. I dette eksempel planlagde Windows SQL Server-arbejdstråden på to forskellige CPU'er. SQL Server-arbejdstråden, der servicerer batchen, kørte først på den første CPU (CPU 1).

Kørslen af batchen blev dog afbrudt på et tidspunkt, og SQL Server sendte køen af batchen til den ventende kø. Da SQL Server sendte SQL Server Worker-tråden, der servicerer denne batch, til køen igen, sendte Windows tråden til at køre på den anden CPU (CPU 2). SQL Server-arbejdstråden blev færdig med at køre på CPU 2. På grund af CPU-afvigelse var den endelige tick-værdi, der blev hentet fra CPU 2, 1900 i stedet for 900. Du kan undgå denne funktionsmåde, hvis du aktiverer SQL Server-processortilhørsforhold.

Følgende tidsberegninger bruges i dette eksempel:

  • Den forkerte, men rapporterede værdi: (1900 – 100 = 1800) / 200 = 9 ms
  • Korrekt værdi: (900 – 100 = 800) / 200 = 4 ms

Værdien af kolonnen varighed for hændelsen RPC:Completed rapporteres som 9 ms i stedet for 4 ms. Dette resultat er mere end det dobbelte af den korrekte værdi på 4 ms.

Afvigelsesadvarsler føjes til SQL Server 2005 for at angive, at de output, der er nævnt tidligere, muligvis ikke er pålidelige. I nogle afdækkede situationer kan SQL Server 2005 SP2 rapportere advarsler om følgende:

  • Falske advarsler om afvigelse
  • Drift kan blive til titusinder af millisekunder uden at forårsage en mærkbar systemeffekt

Du skal være forsigtig, når du evaluerer de ydelsesrelaterede output, og når du sammenligner de ydelsesrelaterede output med tidsindstillingerne for væguret. Hvis der ikke er tegn på andre problemer med ydeevnen, kan du typisk ignorere advarslerne om afvigelse. Du kan f.eks. typisk ignorere advarslerne om afvigelse i følgende situationer:

  • Processer kører som forventet.
  • SQL Server-forespørgsler kører ikke i underlige varighedsmønstre.
  • Du kan ikke se tegn på andre flaskehalse.

Før du ignorerer advarslerne om drift, anbefaler vi dog, at du kontakter producenten for at sikre, at der ikke findes nogen kendte RDTSC-problemer.

Du kan bruge sporingsflag 8033 (–T8033) for at vende tilbage til rapporteringsfunktionsmåden i den oprindelige version af SQL Server 2005 og i SQL Server 2005 SP1. Den oprindelige version af SQL Server 2005 og SQL Server 2005 SP1 rapporterer ikke afvigelsesadvarsler. Hvis du kører den oprindelige version af SQL Server 2005 eller SQL Server 2005 SP1 uden problemer, kan du typisk ignorere meddelelserne.

Hvorfor fungerer sætningen WAITFOR DELAY korrekt? Hvad med periodiske systemprocesser?

Timeoutmekanismer påvirkes ikke af designet med høj opløsning. SQL Server bruger ikke timeren med høj opløsning til timerbaserede aktiviteter. Nogle timeoutaktiviteter er baseret på timeren med reduceret opløsning, der anvender funktionen GetTickCount. Disse timeoutaktiviteter omfatter timeout for låsning, sætningen WAITFOR DELAY og registrering af baglås.

Du kan finde flere oplysninger ved at klikke på nedenstående artikelnumre for at få vist artiklerne i Microsoft Knowledge Base:

938448 En Windows Server 2003-baseret server kan opleve tidsstempeltællerafvigelse, hvis serveren bruger dual-core AMD Opteron-processorer eller AMD Opteron-processorer med flere processorer

895980 Programmer, der bruger funktionen QueryPerformanceCounter, kan fungere dårligt i Windows Server 2003 og Windows XP (artiklen er evt. på engelsk)

De tredjepartsprodukter, der er nævnt i denne artikel, er fremstillet af firmaer, der er uafhængige af Microsoft. Microsoft påtager sig intet ansvar, hverken underforstået eller på anden måde, for funktionaliteten eller pålideligheden af disse produkter.