Lezen in het Engels

Delen via


Het duurt langer om query's te voltooien wanneer de grootte van de TokenAndPermUserStore-cache groeit in SQL Server

Dit artikel helpt u bij het oplossen van problemen met betrekking tot queryprestaties wanneer de grootte toeneemt TokenAndPermUserStore . Het biedt ook verschillende oorzaken en tijdelijke oplossingen.

Oorspronkelijk KB-nummer: 927396

Symptomen

In Microsoft SQL Server ondervindt u de volgende symptomen:

  • Het duurt langer voordat query's worden uitgevoerd die doorgaans snel worden uitgevoerd.

  • HET CPU-gebruik voor het SQL Server-proces is groter dan normaal.

  • U ondervindt verminderde prestaties wanneer u een ad-hocquery uitvoert. Als u echter query's uitvoert op de sys.dm_exec_requests of sys.dm_os_waiting_tasks dynamische beheerweergaven, geven de resultaten niet aan dat de ad-hocquery wacht op een resource.

  • De grootte van de TokenAndPermUserStore cache groeit met een constante snelheid.

  • De grootte van de TokenAndPermUserStore cache is enkele honderden megabytes (MB).

  • In sommige gevallen biedt het uitvoeren van de DBCC FREEPROCCACHE of DBCC FREESYSTEMCACHE opdracht tijdelijke verlichting.

Oorzaak

Prestatieproblemen, zoals een hoog CPU-gebruik en een verhoogd geheugengebruik, kunnen worden veroorzaakt door overmatige vermeldingen in TokenAndPermUserStore de cache. Standaard worden vermeldingen in deze cache alleen opgeschoond wanneer SQL Server interne geheugenbelasting aangeeft. Op servers met veel RAM-geheugen kan interne geheugendruk mogelijk niet vaak worden geactiveerd. Wanneer deze cache groeit, duurt het langer om te zoeken naar bestaande vermeldingen die opnieuw moeten worden gebruikt. Toegang tot deze cache wordt beheerd door een spinlock. Slechts één thread tegelijk kan de zoekopdracht uitvoeren. Dit gedrag zorgt er uiteindelijk voor dat queryprestaties afnemen en dat er meer CPU-gebruik plaatsvindt.

Als u de grootte van TokenAndPermUserStore de cache wilt bewaken, kunt u een query gebruiken die lijkt op de volgende query:

SQL
SELECT SUM(pages_kb) AS 
   "CurrentSizeOfTokenCache(kb)" 
   FROM sys.dm_os_memory_clerks 
   WHERE name = 'TokenAndPermUserStore'

De TokenAndPermUserStore cache onderhoudt de volgende typen beveiligingstokens:

  • LoginToken
    • Eén aanmeldingstoken per principal op serverniveau.
  • TokenPerm
    • Registreert alle machtigingen voor een beveiligbaar object voor een UserToken en SecContextToken.
    • Elke vermelding in deze cache is één machtiging voor een specifieke beveiligbare. Bijvoorbeeld een selectiemachtiging die is verleend voor tabel t1 aan gebruiker u1.
    • Deze tokenvermelding verschilt van vermeldingen in de ACR-cache (Access Check Results). ACR-vermeldingen geven voornamelijk aan of een gebruiker of aanmelding gemachtigd is om een volledige query uit te voeren.
  • UserToken
    • Eén gebruikerstoken per database voor een aanmelding.
    • Slaat informatie op over lidmaatschap van rollen op databaseniveau.
  • SecContextToken
    • Eén SecContextToken gemaakt per principal op serverniveau.
    • Slaat de serverbrede beveiligingscontext voor een principal op.
    • Bevat een hash-tabelcache met gebruikerstokens.
    • Slaat informatie op over lidmaatschap van serverfuncties.
  • TokenAccessResult
    • Er zijn verschillende klassen TokenAccessResult-vermeldingen aanwezig.
    • Access Check geeft aan of een bepaalde gebruiker in een bepaalde database gemachtigd is om een query uit te voeren die meerdere objecten omvat.
    • Vóór Microsoft SQL Server 2008 werden ACR-beveiligingscaches opgeslagen in één cache. TokenAndPermUserStore
    • In SQL Server 2008 werden de ACR-caches gescheiden en werden de ACR-cachevermeldingen bijgehouden in hun eigen afzonderlijke gebruikersarchieven. Door deze scheiding zijn de prestaties verbeterd en is het aantal buckets en het quotumbeheer voor de caches verbeterd.
    • TokenAndPermUserStore Momenteel zijn dit ACRCacheStores de enige soorten beveiligingscache die worden gebruikt. Zie toegangsbeheerserverconfiguratieopties voor meer informatie over ACR-cache.

U kunt de volgende query uitvoeren om informatie over de verschillende caches en de bijbehorende afzonderlijke grootten op te halen:

SQL
SELECT type, name, pages_kb 
FROM sys.dm_os_memory_clerks 
WHERE type = 'USERSTORE_TOKENPERM'

U kunt de volgende query uitvoeren om de soorten tokens te identificeren die groeien in het TokenAndPermUserStorevolgende:

SQL
SELECT [name] AS "SOS StoreName",[TokenName],[Class],[SubClass], count(*) AS [Num Entries]
FROM
(SELECT name,
x.value('(//@name)[1]', 'varchar (100)') AS [TokenName],
x.value('(//@class)[1]', 'varchar (100)') AS [Class],
x.value('(//@subclass)[1]', 'varchar (100)') AS [SubClass]
FROM
(SELECT CAST (entry_data as xml),name
FROM sys.dm_os_memory_cache_entries
WHERE type = 'USERSTORE_TOKENPERM') 
AS R(x,name)
) a
GROUP BY a.name,a.TokenName,a.Class,a.SubClass
ORDER BY [Num Entries] desc

Tijdelijke oplossing

SQL Server biedt twee traceringsvlagken die kunnen worden gebruikt om het quotum van het TokenAndPermUserStore quotum te configureren (standaard is er geen quotum. Dit impliceert dat er een willekeurig aantal vermeldingen in deze cache kan zijn).

  • TF 4618 - Beperkt het aantal vermeldingen in TokenAndPermUserStore 1024.
  • TF 4618+TF 4610 - Beperkt het aantal vermeldingen in TokenAndPermUserStore 8192.

Als het zeer lage aantal vermeldingen van 4618 andere prestatieproblemen veroorzaakt, gebruikt u de traceflags 4610 en 4618 samen.

Traceervlagmen 4610 en 4618 worden beschreven in het onderwerp Books Online, DBCCC TRACEON - Trace Flags.

Deze traceringsvlagmen moeten worden gebruikt voor scenario's waarin de niet-gebonden groei TokenAndPermUserStore te groot is voor de server. Dit gebeurt meestal in twee soorten omgevingen:

  • Low-end- of medium-endhardware waarvoor TokenAndPermUserStore een grote hoeveelheid beschikbaar geheugen voor de server in beslag neemt en waarvoor de snelheid van het maken van nieuwe invoer sneller of zo snel is als de snelheid van verwijdering van de cache. Dit kan leiden tot geheugenconflicten en vaker ongeldige cache voor andere onderdelen van de server (bijvoorbeeld proc-cache).

  • High-end computers met veel geheugen (bijvoorbeeld verschillende recente ondersteuningscases hebben meer dan 1 TB RAM-geheugen nodig). In deze omgevingen kan de cacheopslag groot worden voordat er geheugendruk op wordt uitgeoefend. Dit kan leiden tot prestatievermindering van lange bucketketens of wandelingen.

Als tijdelijke oplossing kunt u deze cache periodiek wissen met behulp van de volgende methode:

  • Items uit de TokenAndPermUserStore cache leegmaken.

Opmerkingen:

  1. Voer hiervoor de volgende opdracht uit:

    DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')

  2. Bekijk de drempelwaarde van de TokenAndPermUserStore cachegrootte wanneer er problemen worden weergegeven.

  3. Maak een geplande SQL Server Agent-taak die de volgende acties uitvoert:

    • Controleer de grootte van de TokenAndPermUserStore cache. Voer de volgende opdracht uit om de grootte te controleren:

      SQL
      SELECT SUM(pages_kb) AS 
       "CurrentSizeOfTokenCache(kb)" 
       FROM sys.dm_os_memory_clerks 
       WHERE name = 'TokenAndPermUserStore'
      
    • Als de cache groter is dan de waargenomen drempelwaarde, voert u de volgende opdracht uit:

      DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')