Compartilhar via


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 ou sys.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 or DBCC 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 e ACRCacheStores 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:

  1. Para fazer isso, execute o seguinte comando:

    DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')

  2. Observe o limite do tamanho do TokenAndPermUserStore cache quando os problemas começarem a aparecer.

  3. 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')