Il completamento delle query richiede più tempo quando le dimensioni della cache TokenAndPermUserStore aumentano in SQL Server

Questo articolo consente di risolvere i problemi relativi alle prestazioni delle query quando le dimensioni di TokenAndPermUserStore aumentano. Fornisce anche varie cause e soluzioni alternative.

Numero KB originale: 927396

Sintomi

In Microsoft SQL Server si riscontrano i sintomi seguenti:

  • Il completamento delle query che in genere vengono eseguite rapidamente richiede più tempo.

  • L'utilizzo della CPU per il processo SQL Server è maggiore del solito.

  • Si verifica una riduzione delle prestazioni quando si esegue una query ad hoc. Tuttavia, se si eseguono query sulle sys.dm_exec_requests viste a gestione dinamica o sys.dm_os_waiting_tasks , i risultati non indicano che la query ad hoc è in attesa di alcuna risorsa.

  • Le dimensioni della TokenAndPermUserStore cache aumentano a una velocità costante.

  • La dimensione della TokenAndPermUserStore cache è di diverse centinaia di megabyte (MB).

  • In alcuni casi, l'esecuzione del DBCC FREEPROCCACHE comando o DBCC FREESYSTEMCACHE fornisce un sollievo temporaneo.

Causa

I problemi di prestazioni, ad esempio la CPU elevata e l'uso maggiore della memoria, possono essere causati da voci eccessive nella TokenAndPermUserStore cache. Per impostazione predefinita, le voci in questa cache vengono pulite solo quando SQL Server segnala la pressione interna della memoria. Nei server con molta RAM, la pressione interna della memoria potrebbe non essere attivata spesso. Quando la cache aumenta, la ricerca delle voci esistenti da riutilizzare richiede più tempo. L'accesso a questa cache è controllato da uno spinlock. La ricerca può essere eseguita da un solo thread alla volta. Questo comportamento determina infine una riduzione delle prestazioni delle query e un maggiore utilizzo della CPU.

Per monitorare le dimensioni della TokenAndPermUserStore cache, è possibile usare una query simile alla query seguente:

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

La TokenAndPermUserStore cache mantiene i tipi di token di sicurezza seguenti:

  • LoginToken
    • Un token di accesso per ogni entità a livello di server.
  • TokenPerm
    • Registra tutte le autorizzazioni per un oggetto a protezione diretta per UserToken e SecContextToken.
    • Ogni voce in questa cache è una singola autorizzazione per una specifica entità a protezione diretta. Ad esempio, un'autorizzazione di selezione concessa alla tabella t1 all'utente u1.
    • Questa voce di token è diversa dalle voci nella cache dei risultati del controllo di accesso.This token entry is different from entries in Access Check Results (ACR) cache. Le voci del Registro Azure Container indicano principalmente se un utente o un account di accesso dispone dell'autorizzazione per eseguire un'intera query.
  • Usertoken
    • Un token utente per database per un account di accesso.
    • Archivia informazioni sull'appartenenza ai ruoli a livello di database.
  • SecContextToken
    • Un SecContextToken creato per ogni entità a livello di server.
    • Archivia il contesto di sicurezza a livello di server per un'entità.
    • Contiene una cache della tabella hash di token utente.
    • Archivia le informazioni sull'appartenenza ai ruoli a livello di server.
  • TokenAccessResult
    • Sono presenti classi diverse di voci TokenAccessResult.
    • Controllo di accesso indica se un determinato utente in un database specifico dispone dell'autorizzazione per eseguire una query che coinvolge più oggetti.
    • Prima di Microsoft SQL Server 2008, le cache di sicurezza del Registro Azure Container venivano archiviate in una singola cache, TokenAndPermUserStore.
    • Nel SQL Server 2008, le cache del Registro Azure Container sono state separate e le voci della cache del Registro Azure Container sono state registrate nei singoli archivi utente. Questa separazione ha migliorato le prestazioni e ha fornito un migliore controllo del numero di bucket e delle quote per le cache.
    • Attualmente e TokenAndPermUserStoreACRCacheStores sono gli unici tipi di cache di sicurezza usati. Per altre informazioni sulle cache del Registro Azure Container, vedere Controllo dell'accesso alle opzioni di configurazione del server della cache.

È possibile eseguire la query seguente per ottenere informazioni sulle diverse cache e sulle relative dimensioni singole:

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

È possibile eseguire la query seguente per identificare i tipi di token in crescita in TokenAndPermUserStore:

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

Soluzione alternativa

SQL Server offre due flag di traccia che possono essere usati per configurare la quota di TokenAndPermUserStore .Per impostazione predefinita, non è presente alcuna quota. Ciò implica che in questa cache può essere presente un numero qualsiasi di voci.

  • TF 4618 : limita il numero di voci in TokenAndPermUserStore a 1024.
  • TF 4618+TF 4610 - Limita il numero di voci in TokenAndPermUserStore a 8192.

Se il numero di voci molto basso di 4618 causa altri problemi di prestazioni, usare i traceflags 4610 e 4618 insieme.

I flag di traccia 4610 e 4618 sono documentati nell'argomento Della documentazione online , DBCCC TRACEON - Flag di traccia.

Questi flag di traccia devono essere usati per scenari in cui la crescita senza limiti di TokenAndPermUserStore è troppo elevata per il server. Ciò si verifica in genere in due tipi di ambienti:

  • Hardware di fascia bassa o di fascia media per il quale TokenAndPermUserStore occupa una grande quantità di memoria disponibile per il server e per il quale la frequenza di creazione di nuove voci è più veloce o veloce della velocità di rimozione della cache. Ciò può causare contese di memoria e un invalidamento della cache più frequente per altre parti del server, ad esempio la cache proc.

  • I computer di fascia alta con molta memoria (ad esempio, diversi casi di supporto recenti hanno coinvolto più di 1 TB di RAM). In questi ambienti, l'archivio cache può aumentare di dimensioni prima di riscontrare una pressione di memoria. Ciò può causare una riduzione delle prestazioni da lunghe catene di bucket o passeggiate.

Come mitigazione temporanea, è possibile cancellare periodicamente questa cache usando il metodo seguente:

  • Scaricare le voci dalla TokenAndPermUserStore cache.

Note:

  1. A tale scopo, utilizzare il seguente comando:

    DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')

  2. Osservare la soglia delle dimensioni della TokenAndPermUserStore cache quando iniziano a comparire i problemi.

  3. Creare un processo di SQL Server Agent pianificato che esegue le azioni seguenti:

    • Controllare le dimensioni della TokenAndPermUserStore cache. Per controllare le dimensioni, eseguire il comando seguente:

      SELECT SUM(pages_kb) AS 
       "CurrentSizeOfTokenCache(kb)" 
       FROM sys.dm_os_memory_clerks 
       WHERE name = 'TokenAndPermUserStore'
      
    • Se le dimensioni della cache sono maggiori della soglia osservata, eseguire il comando seguente:

      DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')