DBCC MEMORYSTATUS コマンドを使用して、SQL Serverのメモリ使用量を監視する

この記事では、 コマンドを使用してメモリ使用量を DBCC MEMORYSTATUS 監視する方法について説明します。

元の製品バージョン: SQL Server
元の KB 番号: 907877

概要

この記事では、 コマンドの DBCC MEMORYSTATUS 出力について説明します。 このコマンドは、Microsoft SQL Serverメモリ消費の問題のトラブルシューティングによく使用されます。

この記事では、メモリ マネージャーの出力の要素、メモリ使用量の概要、集計メモリ情報、バッファー分散情報、バッファー プール情報、プロシージャ キャッシュ情報について説明します。 また、グローバル メモリ オブジェクト、クエリ メモリ オブジェクト、最適化、メモリ ブローカーに関する出力についても説明します。

概要

コマンドはDBCC MEMORYSTATUS、SQL Serverの現在のメモリ状態のスナップショットを提供します。 このコマンドの出力を使用して、SQL Serverのメモリ消費量の問題をトラブルシューティングしたり、特定のメモリ不足エラーをトラブルシューティングしたりできます。 (メモリ不足エラーの多くは、この出力をエラー ログに自動的に出力します)。また、Microsoft カスタマー サポート サービスは、メモリ不足状態に関連付けられている可能性のあるエラーが発生した場合に、特定のサポート インシデント中にこのコマンドの実行を要求する場合もあります。

注:

アドレス ウィンドウ範囲 (AWE) のサポートが有効になっている場合、パフォーマンス モニター (PerfMon) とタスク マネージャーはメモリを正しく考慮しません。

この記事では、コマンドの出力から取得できるデータの DBCC MEMORYSTATUS 一部について説明します。 この記事のいくつかのセクションには、ここでは説明されていない独自の実装の詳細が含まれています。 Microsoft カスタマー サポート サービスは、この記事で提供されている情報を超えて、特定のカウンターの意味に関する質問に回答したり、詳細な情報を提供したりすることはありません。

詳細

重要

この DBCC MEMORYSTATUS コマンドは、Microsoft カスタマー サポート サービスの診断ツールを目的としています。 出力の形式と提供される詳細レベルは、サービス パックと製品リリースの間で変更される可能性があります。 コマンドによって DBCC MEMORYSTATUS 提供される機能は、以降の製品バージョンでは別のメカニズムに置き換えられる場合があります。 そのため、それ以降の製品バージョンでは、このコマンドが機能しなくなった可能性があります。 このコマンドを変更または削除する前に、追加の警告は行われません。 したがって、このコマンドを使用するアプリケーションは、警告なしで中断する可能性があります。

コマンドの出力は、以前のDBCC MEMORYSTATUSリリースの SQL Server から変更されました。 出力には、以前の製品バージョンでは使用できなかったいくつかのセクションが含まれるようになりました。

メモリ マネージャー

出力の最初のセクションは Memory Manager です。 このセクションでは、SQL Serverによる全体的なメモリ消費量を示します。

Memory Manager             KB
------------------------------ --------------------
VM Reserved                1761400
VM Committed               1663556
AWE Allocated              0
Reserved Memory            1024
Reserved Memory In Use     0

(5 row(s) affected)

このセクションの要素は次のとおりです。

  • VM 予約済み: この値は、SQL Server予約されている仮想アドレス空間 (VAS) の全体的な量を示します。
  • VM コミット済み: この値は、SQL Serverがコミットした VAS の全体的な量を示します。 コミットされた VAS は、物理メモリに関連付けられています。
  • AWE 割り当て済み: この値は、SQL Serverの 32 ビット バージョンで AWE メカニズムを介して割り当てられるメモリの全体的な量を示します。 または、この値は、ロックされたページが製品の 64 ビット バージョンで消費するメモリの全体的な量を示します。
  • 予約済みメモリ: この値は、専用管理者接続 (DAC) 用に予約されているメモリを示します。
  • 使用中の予約メモリ: この値は、使用されている予約済みメモリを示します。

メモリ使用量の概要

[メモリ マネージャー] セクションの後に、各メモリ ノードのメモリ使用量の概要が表示されます。 非一様メモリ アクセス (NUMA) が有効なシステムでは、ハードウェア NUMA ノードごとに対応するメモリ ノード エントリが存在します。 SMP システムでは、1 つのメモリ ノード エントリがあります。

注:

メモリ ノード ID がハードウェア ノード ID に対応していない可能性があります。

Memory node Id = 0      KB
------------------------------ --------------------
VM Reserved             1757304
VM Committed            1659612
AWE Allocated           0
MultiPage Allocator     10760
SinglePage Allocator    73832

(5 row(s) affected)

注:

これらの値は、この NUMA ノードで実行されているスレッドによって割り当てられるメモリを示します。 これらの値は、NUMA ノードに対してローカルなメモリではありません。

このセクションの要素は次のとおりです。

  • VM 予約済み: この値は、このノードで実行されているスレッドによって予約されている VAS を示します。

  • VM コミット済み: この値は、このノードで実行されているスレッドによってコミットされた VAS を示します。

  • AWE 割り当て済み: この値は、製品の 32 ビット バージョンの AWE メカニズムを介して割り当てられたメモリを示します。 または、この値は、製品の 64 ビット バージョンのロックされたページによって消費されるメモリの全体的な量を示します。

    NUMA 対応システムでは、この値が正しくないか、負の値になる可能性があります。 ただし、[メモリ マネージャー] セクションの AWE 割り当て値全体が正しい値です。 個々の NUMA ノードによって割り当てられたメモリを追跡するには、SQL Server: Buffer Node パフォーマンス オブジェクトを使用します。 (詳細については、「オンライン ブックのSQL Server」を参照してください。

  • MultiPage Allocator: この値は、このノードで実行されているスレッドによってマルチページ アロケーターを介して割り当てられたメモリを示します。 このメモリは、バッファー プールの外部から取得されます。

  • SinglePage Allocator: この値は、このノードで実行されているスレッドによって単一ページ アロケーターを介して割り当てられたメモリを示します。 このメモリはバッファー プールから盗まれます。

注:

すべてのメモリ ノードの VM 予約値と VM Committed 値の合計は、[メモリ マネージャー] セクションで報告される対応する値よりもわずかに小さくなります。

集計メモリ

次のセクションには、各クラークの種類と各 NUMA ノードの集計メモリ情報が含まれています。 NUMA 対応システムの場合、次のような出力が表示される場合があります。

注:

次の表は、出力の一部のみを含みます。

MEMORYCLERK_SQLGENERAL (node 0) KB
---------------------------------------------------------------- --------------------
VM Reserved                     0
VM Committed                    0
AWE Allocated                   0
SM Reserved                     0
SM Commited                     0
SinglePage Allocator            592
MultiPage Allocator             2160

(7 row(s) affected)

MEMORYCLERK_SQLGENERAL (node 1) KB
---------------------------------------------------------------- --------------------
VM Reserved                     0
VM Committed                    0
AWE Allocated                   0
SM Reserved                     0
SM Commited                     0
SinglePage Allocator            136
MultiPage Allocator             0

(7 row(s) affected)

MEMORYCLERK_SQLGENERAL (Total)  KB
---------------------------------------------------------------- --------------------
VM Reserved                     0
VM Committed                    0
AWE Allocated                   0
SM Reserved                     0
SM Commited                     0
SinglePage Allocator            728
MultiPage Allocator             2160

(7 row(s) affected)

注:

これらのノード ID は、SQL Serverを実行しているコンピューターの NUMA ノード構成に対応します。 ノード ID には、ハードウェア NUMA ノードの上または SMP システムの上に定義されている、可能なソフトウェア NUMA ノードが含まれます。 各ノードのノード ID と CPU 間のマッピングを見つけるには、情報イベント ID 番号 17152 を表示します。 このイベントは、SQL Serverを開始するとイベント ビューアーアプリケーション ログに記録されます。

SMP システムの場合、書記タイプごとに 1 つのセクションのみが表示されます。 このセクションは次のようになります。

MEMORYCLERK_SQLGENERAL (Total)     KB
---------------------------------------------------------------- --------------------
VM Reserved                        0
VM Committed                       0
AWE Allocated                      0
SM Reserved                        0
SM Commited                        0
SinglePage Allocator               768
MultiPage Allocator                2160

(7 row(s) affected)

これらのセクションのその他の情報は、共有メモリに関する情報です。

  • SM 予約済み: この値は、メモリ マップファイル API を使用しているこの種のすべての書記によって予約されている VAS を示します。 この API は 、共有メモリとも呼ばれます。

  • SM コミット済み: この値は、メモリ マップファイル API を使用しているこの種のすべての書記によってコミットされた VAS を示します。

sys を使用して、すべてのメモリ ノードの各書記の種類の概要情報を取得できます。dm_os_memory_clerks 動的管理ビュー (DMV)。 これを行うには、次のクエリを実行します。

select
type,
sum(virtual_memory_reserved_kb) as [VM Reserved],
sum(virtual_memory_committed_kb) as [VM Committed],
sum(awe_allocated_kb) as [AWE Allocated],
sum(shared_memory_reserved_kb) as [SM Reserved],
sum(shared_memory_committed_kb) as [SM Committed],
sum(multi_pages_kb) as [MultiPage Allocator],
sum(single_pages_kb) as [SinlgePage Allocator]
from
sys.dm_os_memory_clerks
group by type

バッファー分散

次のセクションでは、バッファー プール内の 8 KB (KB) バッファーの分布を示します。

Buffer Distribution    Buffers
------------------------------ -----------
Stolen                 553
Free                   103
Cached                 161
Database (clean)       1353
Database (dirty)       38
I/O 0
Latched 0

(7 row(s) affected)

このセクションの要素は次のとおりです。

  • 盗難: 盗まれたメモリは、サーバーが他の目的で使用する 8 KB のバッファーについて説明します。 これらのバッファーは、汎用メモリ ストアの割り当てとして機能します。 サーバーのさまざまなコンポーネントは、これらのバッファーを使用して内部データ構造を格納します。 遅延ライター プロセスでは、バッファー プールから盗まれたバッファーをフラッシュすることはできません。

  • Free: この値は、現在使用されていないコミット済みバッファーを示します。 これらのバッファーは、データを保持するために使用できます。 または、他のコンポーネントがこれらのバッファーを要求し、これらのバッファーを Stolen としてマークする場合があります。

  • キャッシュ済み: この値は、さまざまなキャッシュに使用されるバッファーを示します。

  • データベース (クリーン): この値は、データベースコンテンツを持ち、変更されていないバッファーを示します。

  • データベース (ダーティ): この値は、データベースコンテンツを持ち、変更されたバッファーを示します。 これらのバッファーには、ディスクにフラッシュする必要がある変更が含まれています。

  • I/O: この値は、保留中の I/O 操作を待機しているバッファーを示します。

  • ラッチ済み: この値は 、ラッチされた バッファーを示します。 スレッドがページの内容を読み取ったり変更したりしているときに、バッファーがラッチされます。 ページがディスクから読み取られたり、ディスクに書き込まれたりすると、バッファーもラッチされます。 ラッチは、読み取り中または変更中にページ内のデータの物理的な一貫性を維持するために使用されます。 ロックは、論理整合性とトランザクション整合性を維持するために使用されます。

バッファー プールの詳細

DMV を使用して、データベース ページのバッファー プール バッファーに関する詳細情報を sys.dm_os_buffer_descriptors 取得できます。 また、DMV を使用して、その他のサーバー目的で使用されているバッファー プール ページに関する詳細情報を sys.dm_os_memory_clerks 取得できます。

次のセクションでは、バッファー プールに関する詳細と追加情報を示します。

Buffer Counts             Buffers
------------------------------ --------------------
Committed                 1064
Target                    17551
Hashed                    345
Stolen Potential          121857
External Reservation      645
Min Free                  64
Visible                   17551
Available Paging File     451997

(8 row(s) affected)

このセクションの要素は次のとおりです。

  • コミット済み: この値は、コミットされたバッファーの合計を示します。 コミットされたバッファーには、物理メモリが関連付けられています。 Committed 値は、バッファー プールの現在のサイズです。 この値には、AWE サポートが有効になっている場合に割り当てられる物理メモリが含まれます。
  • ターゲット: この値は、バッファー プールのターゲット サイズを示します。 [ターゲット] の値が [コミット済み] 値より大きい場合、バッファー プールは増加しています。 Target 値が Committed 値より小さい場合、バッファー プールは縮小しています。
  • ハッシュ: この値は、バッファー プールに格納されているデータ ページとインデックス ページを示します。
  • 盗まれた可能性: この値は、バッファー プールから盗まれた可能性のある最大ページを示します。
  • ExternalReservation: この値は、並べ替え操作またはハッシュ操作を実行するクエリ用に予約されているページを示します。 これらのページはまだ盗まれていません。
  • Min Free: この値は、バッファー プールが空きリストに保持しようとしているページを示します。
  • 表示: この値は、同時に表示されるバッファーを示します。 これらのバッファーには、同時に直接アクセスできます。 この値は、バッファーの合計と等しくなります。 ただし、AWE サポートが有効になっている場合、この値はバッファーの合計より小さい場合があります。
  • 使用可能なページング ファイル: この値は、コミット可能なメモリを示します。 この値は、8 KB バッファーの数として表されます。 詳細については、Windows API ドキュメントの GlobalMemoryStatusEx 関数 に関するトピックを参照してください。

プロシージャ キャッシュ

次のセクションでは、プロシージャ キャッシュの構成について説明します。

Procedure Cache         Value
------------------------------ -----------
TotalProcs              4
TotalPages              25
InUsePages              0

(3 row(s) affected)

このセクションの要素は次のとおりです。

  • TotalProcs: この値は、プロシージャ キャッシュに現在存在するキャッシュされたオブジェクトの合計数を示します。 この値は DMV 内のエントリと sys.dm_exec_cached_plans 一致します。

    注:

    この情報の動的な性質上、一致が正確でない可能性があります。 PerfMon を使用すると、SQL Server: プラン キャッシュ オブジェクトと DMV を監視してsys.dm_exec_cached_plans、トリガー、プロシージャ、アドホック オブジェクトなど、キャッシュされたオブジェクトの種類に関する詳細情報を確認できます。

  • TotalPages: この値は、プロシージャ キャッシュにキャッシュされたすべてのオブジェクトを格納するために必要な累積ページを示します。

  • InUsePages: この値は、現在実行中のプロシージャに属するプロシージャ キャッシュ内のページを示します。 これらのページは破棄できません。

グローバル メモリ オブジェクト

次のセクションでは、さまざまなグローバル メモリ オブジェクトに関する情報を示します。 このセクションでは、グローバル メモリ オブジェクトが使用するメモリ量についても説明します。

Global Memory Objects     Buffers
------------------------------ --------------------
Resource                  126
Locks                     85
XDES                      10
SETLS                     2
SE Dataset Allocators     4
SubpDesc Allocators       2
SE SchemaManager          44
SQLCache                  41
Replication               2
ServerGlobal              25
XP Global                 2
SortTables                2

(12 row(s) affected)

このセクションの要素は次のとおりです。

  • リソース: この値は、Resource オブジェクトが使用するメモリを示します。 Resource オブジェクトは、ストレージ エンジンおよびさまざまなサーバー全体の構造に使用されます。
  • ロック: この値は、Lock Manager で使用されるメモリを示します。
  • XDES: この値は、トランザクション マネージャーが使用するメモリを示します。
  • SETLS: この値は、スレッド ローカル ストレージを使用するストレージ エンジン固有のスレッドごとの構造体の割り当てに使用されるメモリを示します。
  • SE データセット アロケーター: この値は、 Access メソッド 設定を使用してテーブル アクセスの構造体を割り当てるために使用されるメモリを示します。
  • SubpDesc Allocators: この値は、並列クエリ、バックアップ操作、復元操作、データベース操作、ファイル操作、ミラーリング、非同期カーソルのサブプロセスの管理に使用されるメモリを示します。 これらのサブプロセスは、 並列プロセスとも呼ばれます。
  • SE SchemaManager: この値は、Schema Manager がストレージ エンジン固有のメタデータを格納するために使用するメモリを示します。
  • SQLCache: この値は、アドホック ステートメントと準備されたステートメントのテキストを格納するために使用されるメモリを示します。
  • レプリケーション: この値は、サーバーが内部レプリケーション サブシステムに使用するメモリを示します。
  • ServerGlobal: この値は、複数のサブシステムで一般的に使用されるグローバル サーバー メモリ オブジェクトを示します。
  • XP グローバル: この値は、拡張ストアド プロシージャで使用されるメモリを示します。
  • [テーブルの並べ替え]: この値は、並べ替えテーブルで使用されるメモリを示します。

クエリ メモリ オブジェクト

次のセクションでは、クエリ メモリ許可情報について説明します。 このセクションには、クエリ メモリ使用量のスナップショットが含まれています。 クエリ メモリは、 ワークスペース メモリとも呼ばれます。

Query Memory Objects             Value
------------------------------ -----------
Grants                           0
Waiting                          0
Available (Buffers)              14820
Maximum (Buffers)                14820
Limit                            10880
Next Request                     0
Waiting For                      0
Cost                             0
Timeout                          0
Wait Time                        0
Last Target                      11520

(11 row(s) affected)

Small Query Memory Objects       Value
------------------------------ -----------

Grants                           0
Waiting                          0
Available (Buffers)              640
Maximum (Buffers)                640
Limit                            640

(5 row(s) affected)

クエリのサイズとコストが "小さい" クエリ メモリしきい値を満たしている場合、クエリは小さなクエリ キューに格納されます。 この動作により、キューに既に存在する大規模なクエリの背後で、小さなクエリが遅延するのを防ぐことができます。

このセクションの要素は次のとおりです。

  • 許可: この値は、メモリ許可を持つ実行中のクエリを示します。
  • 待機中: この値は、メモリ許可の取得を待機しているクエリを示します。
  • 使用可能: この値は、ハッシュ ワークスペースとして、並べ替えワークスペースとして使用するためにクエリで使用できるバッファーを示します。 [使用可能] 値は定期的に更新されます。
  • 最大: この値は、ワークスペースとして使用するためにすべてのクエリに指定できるバッファーの合計を示します。
  • 制限: この値は、大規模なクエリ キューのクエリ実行ターゲットを示します。 この値は、最大 (バッファー) の値はキューに変更が加わるまで更新されないため、最大値 (バッファー) の値とは異なります。
  • 次の要求: この値は、次の待機クエリのメモリ要求サイズをバッファーに表示します。
  • 待機中: この値は、[次の要求] の値が参照するクエリを実行するために使用できる必要があるメモリの量を示します。 待機中の値は、Next Request 値にヘッドルーム係数を乗算した値です。 この値により、次の待機クエリの実行時に特定の量のメモリが使用できるようになることが効果的に保証されます。
  • コスト: この値は、次の待機クエリのコストを示します。
  • タイムアウト: この値は、次の待機クエリのタイムアウト (秒単位) を示します。
  • 待機時間: この値は、次の待機クエリがキューに格納されてからの経過時間 (ミリ秒単位) を示します。
  • 最後のターゲット: この値は、クエリ実行の全体的なメモリ制限を示します。 この値は、大規模なクエリ キューと小さなクエリ キューの両方の組み合わせの制限です。

最適化

次のセクションでは、同時にクエリを最適化しようとしているユーザーの概要を示します。

Optimization Queue                 Value
------------------------------ --------------------
Overall Memory                     156672000
Last Notification                  1
Timeout                            6
Early Termination Factor           5

(4 row(s) affected)

Small Gateway                     Value
------------------------------ --------------------
Configured Units                  8
Available Units                   8
Acquires                          0
Waiters                           0
Threshold Factor                  250000
Threshold                         250000

(6 row(s) affected)

Medium Gateway                    Value
------------------------------ --------------------
Configured Units                  2
Available Units                   2
Acquires                          0
Waiters                           0
Threshold Factor                  12

(5 row(s) affected)

Big Gateway                       Value
------------------------------ --------------------
Configured Units                  1
Available Units                   1
Acquires                          0
Waiters                           0
Threshold Factor                  8

(5 row(s) affected)

クエリは、コンパイルのためにサーバーに送信されます。 コンパイル プロセスには、解析、代数化、最適化が含まれます。 クエリは、コンパイル プロセス中に各クエリが消費するメモリの量に基づいて分類されます。

注:

この量には、クエリの実行に必要なメモリは含まれません。

クエリが開始されると、コンパイルできるクエリの数に制限はありません。 メモリ消費量が増加し、しきい値に達すると、クエリはゲートウェイを渡して続行する必要があります。 各ゲートウェイの後に、同時にコンパイルされるクエリの制限が徐々に減少しています。 各ゲートウェイのサイズは、プラットフォームと負荷によって異なります。 ゲートウェイ サイズは、スケーラビリティとスループットを最大化するために選択されます。

クエリがゲートウェイを渡すことができない場合、クエリはメモリが使用可能になるまで待機します。 または、クエリからタイムアウト エラー (エラー 8628) が返されます。 さらに、ユーザーがクエリをキャンセルした場合、またはデッドロックが検出された場合、クエリはゲートウェイを取得できない可能性があります。 クエリが複数のゲートウェイを渡した場合、コンパイル プロセスが完了するまで、クエリは小さいゲートウェイを解放しません。

この動作により、メモリを集中的に消費するコンパイルが同時に発生するのはごくわずかです。 さらに、この動作により、より小さなクエリのスループットが最大化されます。

メモリ ブローカー

次の 3 つのセクションでは、キャッシュされたメモリ、盗まれたメモリ、および予約済みメモリを制御するメモリ ブローカーに関する情報を示します。 これらのセクションで提供される情報は、内部診断にのみ使用できます。 そのため、この情報についてはここでは詳しく説明しません。

MEMORYBROKER_FOR_CACHE        Value
-------------------------------- --------------------
Allocations                   1843
Rate                          0
Target Allocations            1843
Future Allocations            0
Last Notification             1

(4 row(s) affected)

MEMORYBROKER_FOR_STEAL        Value
-------------------------------- --------------------
Allocations                   380
Rate                          0
Target Allocations            1195
Future Allocations            0
Last Notification             1

(4 row(s) affected)

MEMORYBROKER_FOR_RESERVE      Value
-------------------------------- --------------------
Allocations                   0
Rate                          0
Target Allocations            1195
Future Allocations            0
Last Notification             1

(4 row(s) affected)

適用対象

  • SQL Server 2005 Developer Edition
  • SQL Server 2005 Enterprise Edition
  • SQL Server 2005 Enterprise X64 Edition
  • SQL Server 2005 Standard Edition
  • SQL Server 2005 Standard X64 Edition
  • SQL Server 2005 Workgroup Edition