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 が多いサーバーでは、内部メモリの負荷が頻繁にトリガーされないことがあります。 このキャッシュが大きくなると、再利用する既存のエントリを検索するのに時間がかかります。 このキャッシュへのアクセスは、スピンロックによって制御されます。 一度に実行できるスレッドは 1 つだけです。 この動作により、最終的にクエリのパフォーマンスが低下し、CPU 使用率が増えます。

キャッシュの TokenAndPermUserStore サイズを監視するには、次のクエリのようなクエリを使用できます。

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

キャッシュは TokenAndPermUserStore 、次のセキュリティ トークンの種類を保持します。

  • LoginToken
    • サーバー レベル プリンシパルごとに 1 つのログイン トークン。
  • TokenPerm
    • UserToken と SecContextToken のセキュリティ保護可能なオブジェクトのすべてのアクセス許可を記録します。
    • このキャッシュ内の各エントリは、特定のセキュリティ保護可能な 1 つのアクセス許可です。 たとえば、ユーザー u1 に対してテーブル t1 に付与された選択アクセス許可などです。
    • このトークン エントリは、アクセス チェック結果 (ACR) キャッシュ内のエントリとは異なります。 ACR エントリは、主に、ユーザーまたはログインがクエリ全体を実行するアクセス許可を持っているかどうかを示します。
  • Usertoken
    • ログイン用のデータベースごとに 1 つのユーザー トークン。
    • データベース レベルのロールにメンバーシップに関する情報を格納します。
  • SecContextToken
    • サーバー レベル プリンシパルごとに 1 つの SecContextToken が作成されます。
    • プリンシパルのサーバー全体のセキュリティ コンテキストを格納します。
    • ユーザー トークンのハッシュ テーブル キャッシュが含まれます。
    • メンバーシップに関する情報をサーバー レベルのロールに格納します。
  • TokenAccessResult
    • TokenAccessResult エントリのさまざまなクラスが存在します。
    • アクセス チェックは、特定のデータベース内の特定のユーザーが、複数のオブジェクトを含むクエリを実行するアクセス許可を持っているかどうかを示します。
    • Microsoft SQL Server 2008 より前のバージョンでは、ACR セキュリティ キャッシュは 1 つのキャッシュTokenAndPermUserStoreに格納されていました。
    • 2008 年SQL Server、ACR キャッシュは分離され、ACR キャッシュ エントリは個々のユーザー ストアで追跡されました。 この分離により、パフォーマンスが向上し、キャッシュのバケット数とクォータ制御が向上しました。
    • 現在、 TokenAndPermUserStoreACRCacheStores と は、使用される唯一の種類のセキュリティ キャッシュです。 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クォータを構成するために使用できる 2 つのトレース フラグが用意されています (既定では、クォータはありません。これは、このキャッシュに任意の数のエントリを含めることができることを意味します)。

  • TF 4618 - のエントリ TokenAndPermUserStore 数を 1024 に制限します。
  • TF 4618+TF 4610 - の TokenAndPermUserStore エントリ数を 8192 に制限します。

エントリ数が非常に少ない 4618 が他のパフォーマンス上の問題を引き起こす場合は、traceflags 4610 と 4618 を組み合わせて使用します。

トレース フラグ 4610 と 4618 については、「オンライン ブック」トピック「 DBCCC TRACEON - トレース フラグ」を参照してください。

これらのトレース フラグは、 の無制限の拡張 TokenAndPermUserStore がサーバーにとって大きすぎるシナリオに使用する必要があります。 これは通常、次の 2 種類の環境で発生します。

  • サーバーで使用可能なメモリを大量に占有し、新しいエントリの作成速度がキャッシュ削除の速度と同じくらい速い、ローエンドまたは中規模のハードウェア TokenAndPermUserStore 。 これにより、メモリの競合が発生し、サーバーの他の部分 (proc cache など) に対してキャッシュの無効化が頻繁に発生する可能性があります。

  • メモリが多いハイエンド コンピューター (たとえば、最近のサポート ケースには 1 TB を超える 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')