Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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 lubsys.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 orDBCC 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 iACRCacheStores
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:
Aby to zrobić, uruchom następujące polecenie:
DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')
Obserwuj próg rozmiaru pamięci podręcznej
TokenAndPermUserStore
, gdy pojawią się problemy.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')