SQL Server에서 TokenAndPermUserStore 캐시의 크기가 커지면 쿼리가 완료되는 데 시간이 더 오래 걸립니다.
이 문서는 크기 TokenAndPermUserStore
가 증가할 때 쿼리 성능과 관련된 문제를 해결하는 데 도움이 됩니다. 또한 다양한 원인과 해결 방법을 제공합니다.
원래 KB 번호: 927396
증상
Microsoft SQL Server에서는 다음과 같은 증상이 발생합니다.
일반적으로 빠르게 실행되는 쿼리는 완료하는 데 시간이 더 오래 걸립니다.
SQL Server 프로세스의 CPU 사용량이 평소보다 큽다.
임시 쿼리를 실행할 때 성능이 저하됩니다. 그러나 동적 관리 뷰 또는
sys.dm_os_waiting_tasks
동적 관리 뷰를sys.dm_exec_requests
쿼리하는 경우 임시 쿼리가 리소스를 기다리고 있음을 나타내지 않습니다.캐시의 크기는
TokenAndPermUserStore
안정적인 속도로 증가합니다.캐시의
TokenAndPermUserStore
크기는 수백 메가바이트(MB)입니다.경우에 따라 또는
DBCC FREESYSTEMCACHE
명령을 실행하면DBCC FREEPROCCACHE
일시적인 완화가 제공됩니다.
원인
높은 CPU 및 메모리 사용 증가와 같은 성능 문제는 캐시의 TokenAndPermUserStore
과도한 항목으로 인해 발생할 수 있습니다. 기본적으로 이 캐시의 항목은 SQL Server가 내부 메모리 압력을 알리는 경우에만 정리됩니다. RAM이 많은 서버에서는 내부 메모리 압력이 자주 트리거되지 않을 수 있습니다. 이 캐시가 커지면 다시 사용할 기존 항목을 검색하는 데 시간이 더 오래 걸립니다. 이 캐시에 대한 액세스는 스핀 잠금에 의해 제어됩니다. 한 번에 하나의 스레드만 검색을 수행할 수 있습니다. 이 동작은 결국 쿼리 성능이 저하되고 더 많은 CPU 사용량이 발생합니다.
캐시 크기를 TokenAndPermUserStore
모니터링하려면 다음 쿼리와 유사한 쿼리를 사용할 수 있습니다.
SELECT SUM(pages_kb) AS
"CurrentSizeOfTokenCache(kb)"
FROM sys.dm_os_memory_clerks
WHERE name = 'TokenAndPermUserStore'
캐시는 TokenAndPermUserStore
다음과 같은 보안 토큰 유형을 유지 관리합니다.
- LoginToken
- 서버 수준 보안 주체당 하나의 로그인 토큰입니다.
- TokenPerm
- UserToken 및 SecContextToken에 대한 보안 개체에 대한 모든 권한을 기록합니다.
- 이 캐시의 각 항목은 특정 보안 개체에 대한 단일 권한입니다. 예를 들어 사용자 u1에 테이블 t1에 부여된 선택 권한입니다.
- 이 토큰 항목은 ACR(Access Check Results) 캐시의 항목과 다릅니다. ACR 항목은 주로 사용자 또는 로그인에 전체 쿼리를 실행할 수 있는 권한이 있는지 여부를 나타냅니다.
- UserToken
- 로그인에 대한 데이터베이스당 하나의 사용자 토큰입니다.
- 데이터베이스 수준 역할의 멤버 자격에 대한 정보를 저장합니다.
- SecContextToken
- 서버 수준 보안 주체당 하나의 SecContextToken이 생성됩니다.
- 보안 주체에 대한 서버 전체 보안 컨텍스트를 저장합니다.
- 사용자 토큰의 해시 테이블 캐시를 포함합니다.
- 서버 수준 역할에 멤버 자격에 대한 정보를 저장합니다.
- TokenAccessResult
- TokenAccessResult 항목의 다른 클래스가 있습니다.
- Access Check는 특정 데이터베이스의 지정된 사용자에게 여러 개체가 포함된 쿼리를 실행할 수 있는 권한이 있는지 여부를 나타냅니다.
- Microsoft SQL Server 2008 이전에는 ACR 보안 캐시가 단일 캐시
TokenAndPermUserStore
에 저장되었습니다. - SQL Server 2008에서는 ACR 캐시가 분리되었고 ACR 캐시 항목이 자체 개별 사용자 저장소에서 추적되었습니다. 이렇게 분리하면 성능이 향상되고 캐시에 대한 버킷 수 및 할당량 제어가 향상되었습니다.
- 현재
TokenAndPermUserStore
ACRCacheStores
사용되는 유일한 종류의 보안 캐시입니다. ACR 캐시에 대한 자세한 내용은 액세스 확인 캐시 서버 구성 옵션을 참조 하세요.
다음 쿼리를 실행하여 다양한 캐시 및 개별 크기에 대한 정보를 가져올 수 있습니다.
SELECT type, name, pages_kb
FROM sys.dm_os_memory_clerks
WHERE type = 'USERSTORE_TOKENPERM'
다음 쿼리를 실행하여 다음에서 증가하는 토큰의 종류를 식별할 수 있습니다.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
해결 방법
SQL Server는 할당량을 구성하는 데 사용할 수 있는 두 개의 추적 플래그를 TokenAndPermUserStore
제공합니다(기본적으로 할당량은 없습니다.) 이는 이 캐시에 여러 항목이 있을 수 있음을 의미합니다).
- TF 4618 - 항목 수를 1024로 제한합니다
TokenAndPermUserStore
. - TF 4618+TF 4610 - 항목
TokenAndPermUserStore
수를 8192로 제한합니다.
4618의 매우 낮은 항목 수가 다른 성능 문제를 일으키는 경우 traceflags 4610 및 4618을 함께 사용합니다.
추적 플래그 4610 및 4618은 온라인 설명서 항목인 DBCCC TRACEON - 추적 플래그에 설명되어 있습니다.
이러한 추적 플래그는 무제한 증가 TokenAndPermUserStore
가 서버에 비해 너무 큰 시나리오에 사용해야 합니다. 이는 일반적으로 두 가지 종류의 환경에서 발생합니다.
서버에 사용할 수 있는
TokenAndPermUserStore
메모리의 양이 많고 새 항목 생성 속도가 캐시 제거 속도만큼 빠르거나 빠른 저사양 또는 중형 하드웨어입니다. 이로 인해 서버의 다른 부분(예: 프록시 캐시)에 대한 메모리 경합 및 캐시 무효화가 더 빈번해질 수 있습니다.메모리가 많은 고급 컴퓨터(예: 1TB 이상의 RAM과 관련된 최근 지원 사례). 이러한 환경에서 캐시 저장소는 메모리 압력을 경험하기 전에 커질 수 있습니다. 이로 인해 긴 버킷 체인 또는 워크에서 성능이 저하될 수 있습니다.
임시 완화 방법으로 다음 방법을 사용하여 이 캐시를 주기적으로 지울 수 있습니다.
- 캐시에서
TokenAndPermUserStore
항목을 플러시합니다.
참고:
이렇게 하려면 다음 명령을 실행합니다.
DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')
문제가 나타나기 시작하면 캐시 크기의 임계값
TokenAndPermUserStore
을 관찰합니다.다음 작업을 수행하는 예약된 SQL Server 에이전트 작업을 만듭니다.
캐시의 크기를 확인합니다
TokenAndPermUserStore
. 크기를 확인하려면 다음 명령을 실행합니다.SELECT SUM(pages_kb) AS "CurrentSizeOfTokenCache(kb)" FROM sys.dm_os_memory_clerks WHERE name = 'TokenAndPermUserStore'
캐시 크기가 관찰된 임계값보다 큰 경우 다음 명령을 실행합니다.
DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')