TokenAndPermUserStore 캐시의 크기가 SQL Server 증가하면 쿼리를 완료하는 데 시간이 더 오래 걸립니다.
이 문서는 크기 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에 대한 보안 개체에 대한 모든 권한을 기록합니다.
- 이 캐시의 각 항목은 특정 보안 개체에 대한 단일 권한입니다. 예를 들어 t1 테이블에 사용자 u1에 부여된 선택 권한이 있습니다.
- 이 토큰 항목은 ACR(Access Check Results) 캐시의 항목과 다릅니다. ACR 항목은 주로 사용자 또는 로그인에 전체 쿼리를 실행할 수 있는 권한이 있는지 여부를 나타냅니다.
- Usertoken
- 로그인에 대한 데이터베이스당 하나의 사용자 토큰입니다.
- 데이터베이스 수준 역할의 멤버 자격에 대한 정보를 저장합니다.
- SecContextToken
- 서버 수준 보안 주체당 하나의 SecContextToken이 생성됩니다.
- 보안 주체에 대한 서버 전체 보안 컨텍스트를 저장합니다.
- 사용자 토큰의 해시 테이블 캐시를 포함합니다.
- 서버 수준 역할의 멤버 자격에 대한 정보를 저장합니다.
- TokenAccessResult
- TokenAccessResult 항목의 다른 클래스가 있습니다.
- Access Check는 특정 데이터베이스의 지정된 사용자에게 여러 개체가 포함된 쿼리를 실행할 수 있는 권한이 있는지 여부를 나타냅니다.
- Microsoft SQL Server 2008 이전에는 ACR 보안 캐시가 단일 캐시
TokenAndPermUserStore
에 저장되었습니다. - 2008년 SQL Server 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 - 의 항목 수를 8192로 제한합니다
TokenAndPermUserStore
.
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')