다음을 통해 공유


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 항목을 플러시합니다.

참고:

  1. 이렇게 하려면 다음 명령을 실행합니다.

    DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')

  2. 문제가 나타나기 시작하면 캐시 크기의 임계값 TokenAndPermUserStore 을 관찰합니다.

  3. 다음 작업을 수행하는 예약된 SQL Server 에이전트 작업을 만듭니다.

    • 캐시의 크기를 확인합니다 TokenAndPermUserStore . 크기를 확인하려면 다음 명령을 실행합니다.

      SELECT SUM(pages_kb) AS 
       "CurrentSizeOfTokenCache(kb)" 
       FROM sys.dm_os_memory_clerks 
       WHERE name = 'TokenAndPermUserStore'
      
    • 캐시 크기가 관찰된 임계값보다 큰 경우 다음 명령을 실행합니다.

      DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')