Udostępnij za pośrednictwem


Wykonywanie zapytań trwa dłużej, gdy rozmiar pamięci podręcznej TokenAndPermUserStore rośnie w programie SQL Server

Ten artykuł ułatwia rozwiązywanie problemów związanych z wydajnością zapytań w przypadku wzrostu rozmiaru TokenAndPermUserStore . Zapewnia również różne przyczyny i obejścia.

Oryginalny numer KB: 927396

Symptomy

W programie Microsoft SQL Server występują następujące objawy:

  • Wykonywanie zapytań, które zwykle szybko trwa dłużej.

  • Użycie procesora CPU dla procesu programu SQL Server jest większe niż zwykle.

  • Podczas uruchamiania zapytania ad hoc występuje spadek wydajności. Jednak w przypadku wykonywania zapytań względem sys.dm_exec_requests widoków zarządzania lub sys.dm_os_waiting_tasks dynamicznych wyniki nie wskazują, że zapytanie ad hoc oczekuje na jakikolwiek zasób.

  • Rozmiar pamięci podręcznej TokenAndPermUserStore rośnie w stałym tempie.

  • Rozmiar pamięci podręcznej TokenAndPermUserStore to kilkaset megabajtów (MB).

  • W niektórych przypadkach uruchomienie DBCC FREEPROCCACHE polecenia or DBCC FREESYSTEMCACHE zapewnia tymczasową ulgę.

Przyczyna

Problemy z wydajnością, takie jak wysokie użycie procesora CPU i zwiększone użycie pamięci, mogą być spowodowane nadmiernymi wpisami w TokenAndPermUserStore pamięci podręcznej. Domyślnie wpisy w tej pamięci podręcznej są czyszczone tylko wtedy, gdy program SQL Server sygnalizuje wykorzystanie pamięci wewnętrznej. Na serwerach, na których jest dużo pamięci RAM, wykorzystanie pamięci wewnętrznej może nie być często wyzwalane. Gdy ta pamięć podręczna rośnie, wyszukiwanie istniejących wpisów do ponownego użycia trwa dłużej. Dostęp do tej pamięci podręcznej jest kontrolowany przez spinlock. Wyszukiwanie może wykonywać tylko jeden wątek jednocześnie. To zachowanie ostatecznie powoduje zmniejszenie wydajności zapytań i zwiększenie użycia procesora CPU.

Aby monitorować rozmiar pamięci podręcznej TokenAndPermUserStore , możesz użyć zapytania przypominającego następujące zapytanie:

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

Pamięć podręczna TokenAndPermUserStore obsługuje następujące typy tokenów zabezpieczających:

  • LoginToken
    • Jeden token logowania na jednostkę poziomu serwera.
  • TokenPerm
    • Rejestruje wszystkie uprawnienia zabezpieczanego obiektu dla obiektu UserToken i SecContextToken.
    • Każdy wpis w tej pamięci podręcznej jest jednym uprawnieniem do określonego zabezpieczania. Na przykład wybierz uprawnienie przyznane w tabeli t1 użytkownikowi u1.
    • Ten wpis tokenu różni się od wpisów w pamięci podręcznej wyników sprawdzania dostępu (ACR). Wpisy usługi ACR wskazują głównie, czy użytkownik lub identyfikator logowania ma uprawnienia do uruchamiania całego zapytania.
  • UserToken
    • Jeden token użytkownika na bazę danych na potrzeby logowania.
    • Przechowuje informacje o członkostwie w rolach na poziomie bazy danych.
  • SecContextToken
    • Jeden secContextToken utworzony dla podmiotu zabezpieczeń na poziomie serwera.
    • Przechowuje kontekst zabezpieczeń całego serwera dla podmiotu zabezpieczeń.
    • Zawiera pamięć podręczną tabeli skrótów tokenów użytkownika.
    • Przechowuje informacje o członkostwie w rolach na poziomie serwera.
  • TokenAccessResult
    • Istnieją różne klasy wpisów TokenAccessResult.
    • Kontrola dostępu wskazuje, czy dany użytkownik w określonej bazie danych ma uprawnienia do uruchamiania zapytania obejmującego wiele obiektów.
    • Przed programem Microsoft SQL Server 2008 pamięci podręczne zabezpieczeń usługi ACR były przechowywane w jednej pamięci podręcznej. TokenAndPermUserStore
    • W programie SQL Server 2008 pamięci podręczne usługi ACR zostały oddzielone, a wpisy pamięci podręcznej usługi ACR zostały śledzone we własnych magazynach poszczególnych użytkowników. Ta separacja zwiększyła wydajność i zapewniała lepszą liczbę zasobników i kontrolę przydziału dla pamięci podręcznych.
    • TokenAndPermUserStore Obecnie i ACRCacheStores są jedynymi rodzajami używanej pamięci podręcznej zabezpieczeń. Aby uzyskać więcej informacji na temat pamięci podręcznych usługi ACR, zobacz access check cache Server Configuration Options (Opcje konfiguracji serwera pamięci podręcznej).

Możesz uruchomić następujące zapytanie, aby uzyskać informacje o różnych pamięciach podręcznych i ich rozmiarach:

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

Możesz uruchomić następujące zapytanie, aby zidentyfikować rodzaje tokenów, które rosną w obiekcie 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

Rozwiązanie

Program SQL Server oferuje dwie flagi śledzenia, których można użyć do skonfigurowania limitu przydziału TokenAndPermUserStore (domyślnie nie ma limitu przydziału. Oznacza to, że w tej pamięci podręcznej może istnieć dowolna liczba wpisów.

  • TF 4618 — ogranicza liczbę wpisów do TokenAndPermUserStore 1024.
  • TF 4618+TF 4610 — ogranicza liczbę wpisów TokenAndPermUserStore do 8192.

Jeśli bardzo niska liczba wpisów 4618 powoduje inne problemy z wydajnością, użyj traceflags 4610 i 4618 razem.

Flagi śledzenia 4610 i 4618 są udokumentowane w temacie Książki online, DBCCC TRACEON — flagi śledzenia.

Te flagi śledzenia powinny być używane w scenariuszach, w których niezwiązany wzrost TokenAndPermUserStore jest zbyt duży dla serwera. Zwykle występuje to w dwóch rodzajach środowisk:

  • Niski lub średni sprzęt, dla którego TokenAndPermUserStore zajmuje dużą ilość dostępnej pamięci dla serwera i dla którego szybkość tworzenia nowego wpisu jest szybsza lub tak szybka, jak szybkość eksmisji pamięci podręcznej. Może to spowodować rywalizację o pamięć i częstsze unieważnienie pamięci podręcznej dla innych części serwera (na przykład proc cache).

  • Komputery wysokiej klasy z dużą ilością pamięci (na przykład kilka ostatnich przypadków pomocy technicznej obejmowało ponad 1 TB pamięci RAM). W tych środowiskach magazyn pamięci podręcznej może rosnąć duże, zanim będzie mieć jakiekolwiek wykorzystanie pamięci. Może to spowodować obniżenie wydajności z długich łańcuchów zasobników lub spacerów.

Tymczasowe środki zaradcze umożliwiają okresowe czyszczenie tej pamięci podręcznej przy użyciu następującej metody:

  • Opróżnij wpisy z pamięci podręcznej TokenAndPermUserStore .

Uwagi:

  1. Aby to zrobić, uruchom następujące polecenie:

    DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')

  2. Obserwuj próg rozmiaru pamięci podręcznej TokenAndPermUserStore , gdy pojawią się problemy.

  3. Utwórz zaplanowane zadanie agenta programu SQL Server, które wykonuje następujące akcje:

    • Sprawdź rozmiar pamięci podręcznej TokenAndPermUserStore . Aby sprawdzić rozmiar, uruchom następujące polecenie:

      SELECT SUM(pages_kb) AS 
       "CurrentSizeOfTokenCache(kb)" 
       FROM sys.dm_os_memory_clerks 
       WHERE name = 'TokenAndPermUserStore'
      
    • Jeśli rozmiar pamięci podręcznej jest większy niż obserwowany próg, uruchom następujące polecenie:

      DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')