Il completamento delle query richiede più tempo quando le dimensioni della cache TokenAndPermUserStore aumentano in SQL Server
Questo articolo illustra come risolvere i problemi relativi alle prestazioni delle query quando aumentano le dimensioni.TokenAndPermUserStore
Fornisce anche varie cause e soluzioni alternative.
Numero KB originale: 927396
Sintomi
In Microsoft SQL Server si verificano i sintomi seguenti:
Le query che in genere vengono eseguite rapidamente richiedono più tempo per il completamento.
L'utilizzo della CPU per il processo di SQL Server è maggiore del solito.
Si riscontrano prestazioni ridotte quando si esegue una query ad hoc. Tuttavia, se si eseguono query sulle viste a
sys.dm_exec_requests
gestione dinamica osys.dm_os_waiting_tasks
, i risultati non indicano che la query ad hoc è in attesa di qualsiasi risorsa.Le dimensioni della
TokenAndPermUserStore
cache aumentano a una velocità costante.Le dimensioni della
TokenAndPermUserStore
cache sono diverse centinaia di megabyte (MB).In alcuni casi, l'esecuzione del
DBCC FREEPROCCACHE
comando oDBCC FREESYSTEMCACHE
fornisce un sollievo temporaneo.
Causa
I problemi di prestazioni, ad esempio un utilizzo elevato della CPU e dell'aumento della memoria, possono essere causati da un numero eccessivo di voci nella TokenAndPermUserStore
cache. Per impostazione predefinita, le voci in questa cache vengono pulite solo quando SQL Server segnala un utilizzo elevato di memoria interna. Nei server con una grande quantità di RAM, la pressione interna della memoria potrebbe non essere attivata spesso. Quando questa cache aumenta, la ricerca delle voci esistenti richiede più tempo per riutilizzare. L'accesso a questa cache è controllato da uno spinlock. Solo un thread alla volta può eseguire la ricerca. Questo comportamento provoca alla fine una riduzione delle prestazioni delle query e si verifica un maggior 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 gestisce 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 un'entità a protezione diretta specifica. Ad esempio, un'autorizzazione select concessa per la 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 ogni 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à di sicurezza.
- Contiene una cache di tabelle hash di token utente.
- Archivia 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 determinato database dispone dell'autorizzazione per eseguire una query che coinvolge più oggetti.
- Prima di Microsoft SQL Server 2008, le cache di sicurezza di Registro Azure Container sono state archiviate in una singola cache,
TokenAndPermUserStore
. - In 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 propri archivi utente. Questa separazione migliora le prestazioni e offre un migliore numero di bucket e controllo della quota per le cache.
TokenAndPermUserStore
Attualmente eACRCacheStores
sono gli unici tipi di cache di sicurezza usati. Per altre informazioni sulle cache di Registro Azure Container, vedere Access Check Cache Server Configuration Options.
È possibile eseguire la query seguente per ottenere informazioni sulle diverse cache e sulle relative dimensioni:
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 esiste alcuna quota. Ciò implica che in questa cache possono essere presenti 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 insieme i flag di traccia 4610 e 4618.
I flag di traccia 4610 e 4618 sono documentati nella documentazione online DBCCC TRACEON - Flag di traccia.
Questi flag di traccia devono essere usati per gli scenari in cui la crescita non associato di TokenAndPermUserStore
è troppo grande per il server. Questo si verifica in genere in due tipi di ambienti:
Hardware di fascia bassa o media per cui
TokenAndPermUserStore
occupa una grande quantità di memoria disponibile per il server e per cui la velocità di creazione di una nuova voce è più veloce o veloce della velocità di rimozione della cache. Ciò può causare conflitti di memoria e invalidazione della cache più frequente per altre parti del server (ad esempio, proc cache).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 grandi dimensioni prima che si verifichi una pressione di memoria. Ciò può causare un calo delle prestazioni da catene di bucket lunghe o passeggiate.
Come mitigazione temporanea, è possibile cancellare periodicamente questa cache usando il metodo seguente:
- Svuotare le voci dalla
TokenAndPermUserStore
cache.
Note:
A tale scopo, utilizzare il seguente comando:
DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')
Osservare la soglia delle dimensioni della cache all'inizio
TokenAndPermUserStore
della visualizzazione dei problemi.Creare un processo pianificato di SQL Server Agent 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 la dimensione della cache è maggiore della soglia osservata, eseguire il comando seguente:
DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')