As consultas demoram mais para serem concluídas quando o tamanho do cache TokenAndPermUserStore aumenta no SQL Server
Este artigo ajuda você a solucionar problemas relacionados ao desempenho da consulta quando o tamanho de TokenAndPermUserStore
aumenta. Ele também fornece várias causas e soluções alternativas.
Número original do KB: 927396
Sintomas
No Microsoft SQL Server, você experimenta os seguintes sintomas:
As consultas que normalmente são executadas rapidamente levam mais tempo para serem concluídas.
O uso da CPU para o processo do SQL Server é maior do que o normal.
Você experimenta um desempenho reduzido ao executar uma consulta ad hoc. No entanto, se você consultar as
sys.dm_exec_requests
exibições de gerenciamento dinâmico ousys.dm_os_waiting_tasks
, os resultados não indicarão que a consulta ad hoc está aguardando qualquer recurso.O tamanho do
TokenAndPermUserStore
cache cresce a uma taxa constante.O tamanho do
TokenAndPermUserStore
cache é de várias centenas de megabytes (MB).Em alguns casos, a execução do
DBCC FREEPROCCACHE
comando orDBCC FREESYSTEMCACHE
fornece alívio temporário.
Causa
Problemas de desempenho, como alta CPU e maior uso de memória, podem ser causados por entradas excessivas no TokenAndPermUserStore
cache. Por padrão, as entradas nesse cache são limpas somente quando o SQL Server sinaliza a pressão da memória interna. Em servidores com muita RAM, a pressão da memória interna pode não ser acionada com frequência. Quando esse cache cresce, leva mais tempo para pesquisar entradas existentes para reutilizar. O acesso a esse cache é controlado por um spinlock. Apenas um thread por vez pode fazer a pesquisa. Esse comportamento eventualmente faz com que o desempenho da consulta diminua e ocorra mais uso da CPU.
Para monitorar o tamanho do TokenAndPermUserStore
cache, você pode usar uma consulta semelhante à seguinte consulta:
SELECT SUM(pages_kb) AS
"CurrentSizeOfTokenCache(kb)"
FROM sys.dm_os_memory_clerks
WHERE name = 'TokenAndPermUserStore'
O TokenAndPermUserStore
cache mantém os seguintes tipos de token de segurança:
- LoginToken
- Um token de logon por entidade de segurança no nível do servidor.
- TokenPerm
- Registra todas as permissões de um objeto protegível para um UserToken e SecContextToken.
- Cada entrada nesse cache é uma única permissão em um protegível específico. Por exemplo, uma permissão de seleção concedida na tabela t1 ao usuário u1.
- Essa entrada de token é diferente das entradas no cache de resultados de verificação de acesso (ACR). As entradas do ACR indicam principalmente se um usuário ou logon tem permissão para executar uma consulta inteira.
- Token de usuário
- Um token de usuário por banco de dados para um logon.
- Armazena informações sobre a associação em funções de nível de banco de dados.
- SecContextToken
- Um SecContextToken criado por entidade de segurança no nível do servidor.
- Armazena o contexto de segurança em todo o servidor para uma entidade de segurança.
- Contém um cache de tabela de hash de tokens de usuário.
- Armazena informações sobre a associação em funções de nível de servidor.
- TokenAccessResult
- Diferentes classes de entradas TokenAccessResult estão presentes.
- A Verificação de Acesso indica se um determinado usuário em um determinado banco de dados tem permissão para executar uma consulta que envolve vários objetos.
- Antes do Microsoft SQL Server 2008, os caches de segurança do ACR eram armazenados em um único cache,
TokenAndPermUserStore
. - No SQL Server 2008, os caches do ACR eram separados e as entradas do cache do ACR eram controladas em seus próprios repositórios de usuários individuais. Essa separação melhorou o desempenho e forneceu melhor contagem de buckets e controle de cotas para os caches.
- Atualmente,
TokenAndPermUserStore
eACRCacheStores
são os únicos tipos de cache de segurança que são usados. Para obter mais informações sobre caches do ACR, consulte opções de configuração do servidor do cache de verificação de acesso.
Você pode executar a seguinte consulta para obter informações sobre os diferentes caches e seus tamanhos individuais:
SELECT type, name, pages_kb
FROM sys.dm_os_memory_clerks
WHERE type = 'USERSTORE_TOKENPERM'
Você pode executar a seguinte consulta para identificar os tipos de tokens que estão crescendo no 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
Solução alternativa
O SQL Server oferece dois sinalizadores de rastreamento que podem ser usados para configurar a cota do TokenAndPermUserStore
(Por padrão, não há cota. Isso implica que pode haver qualquer número de entradas neste cache).
- TF 4618 - Limita o número de entradas a
TokenAndPermUserStore
1024. - TF 4618+TF 4610 - Limita o número de entradas a
TokenAndPermUserStore
8192.
Se a contagem de entrada muito baixa de 4618 causar outras preocupações de desempenho, use os sinalizadores de rastreamento 4610 e 4618 juntos.
Os sinalizadores de rastreamento 4610 e 4618 estão documentados no tópico dos Manuais Online, DBCCC TRACEON - Sinalizadores de rastreamento.
Esses sinalizadores de rastreamento devem ser usados para cenários em que o crescimento ilimitado de TokenAndPermUserStore
é muito grande para o servidor. Isso geralmente ocorre em dois tipos de ambientes:
Hardware low-end ou mid-end para o qual
TokenAndPermUserStore
ocupa uma grande quantidade de memória disponível para o servidor e para o qual a taxa de criação de novas entradas é mais rápida ou tão rápida quanto a taxa de remoção de cache. Isso pode causar contenção de memória e invalidação de cache mais frequente para outras partes do servidor (por exemplo, cache proc).Computadores de última geração que têm muita memória (por exemplo, vários casos recentes de suporte envolveram mais de 1 TB de RAM). Nesses ambientes, o armazenamento de cache pode crescer muito antes de sofrer qualquer pressão de memória. Isso pode causar degradação do desempenho de longas cadeias de buckets ou caminhadas.
Como uma mitigação temporária, você pode limpar esse cache periodicamente usando o seguinte método:
- Libere as entradas do
TokenAndPermUserStore
cache.
Observações:
Para fazer isso, execute o seguinte comando:
DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')
Observe o limite do tamanho do
TokenAndPermUserStore
cache quando os problemas começarem a aparecer.Crie um trabalho agendado do SQL Server Agent que execute as seguintes ações:
Verifique o tamanho do
TokenAndPermUserStore
cache. Para verificar o tamanho, execute o seguinte comando:SELECT SUM(pages_kb) AS "CurrentSizeOfTokenCache(kb)" FROM sys.dm_os_memory_clerks WHERE name = 'TokenAndPermUserStore'
Se o tamanho do cache for maior que o limite observado, execute o seguinte comando:
DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')