メモリ使用量の監視

適用対象:SQL Server

SQL Server のインスタンスを定期的に監視し、メモリ使用率が通常の範囲内であることを確認します。

SQL Server の最大メモリの構成

既定では、SQL Server インスタンスは、時間が経過するに従って、サーバー内の使用可能な Windows オペレーティング システムのメモリの多くを消費します。 メモリは、いったん取得されると、メモリ不足が検出されない限り、解放されることはありません。 これは仕様であり、SQL Server プロセス内のメモリ リークを示すものではありません。 ほとんどの用途でSQL Server によって取得できるメモリの量を制限するには、Max Server Memory オプションを使用します。 詳細については、「メモリ管理アーキテクチャ ガイド」を参照してください。

SQL Server on Linux では、mssql-conf ツールおよび memory.memorylimitmb 設定を使用して、メモリ制限を設定します。

オペレーティング システムのメモリを監視する

メモリ不足の状況を監視するには、次の Windows サーバー カウンターを使用します。 多くのオペレーティング システムのメモリ カウンターに対しては、動的管理ビュー sys.dm_os_process_memory および sys.dm_os_sys_memory を使用してクエリを実行できます。

  • Memory: Available Bytes
    このカウンターは、プロセスで現在使用できるメモリのバイト数を示します。 Available Bytes カウンターの値が小さい場合、オペレーティング システムのメモリが全体的に不足していることを示します。 この値のクエリを実行するには、T-SQL 経由で sys.dm_os_sys_memory.available_physical_memory_kb を使用します。

  • Memory: Pages/sec
    このカウンターは、ハード ページ フォールトが原因でディスクから取得されたページ数、またはページ フォールトが原因でワーキング セット内の領域を解放するためにディスクに書き込まれたページ数を示します。 Pages/sec カウンターの値が高い場合、ページングが過剰であることが考えられます。

  • Page Faults/sec このカウンターは、システム プロセスを含むすべてのプロセスのページ フォールト率を示します。 コンピューターに使用可能なメモリが十分にある場合でも、ディスクへのページングは (したがって、ページ フォールトも)、低い割合で発生するのが一般的です。ただし、ゼロになることはありません。 Microsoft Windows Virtual Memory Manager (VMM) では、プロセスの作業セットのサイズを小さくするときに、SQL Server と他のプロセスからページを取得します。 この VMM の動作が、ページ フォールトの原因になる場合があります。

  • プロセス: Page Faults/sec このカウンターは、特定のユーザー プロセスのページ フォールト率を示します。 モニタープロセス: Page Faults/sec を監視して、ディスク アクティビティが、SQL Server によるページングが原因で発生しているかどうかを判断します。 SQL Server または他のプロセスが過剰なページングの原因であるかどうかを判断するには、SQL Server プロセス インスタンスの Process: Page Faults/sec カウンターを監視します。

過剰なページングの解決方法の詳細については、オペレーティング システムのマニュアルを参照してください。

SQL Server で使用されるメモリを分離する

SQL Server のメモリ使用量を監視するには、次の SQL Server オブジェクト カウンターを使用します。 多くの SQL Server オブジェクト カウンターには、動的管理ビュー sys.dm_os_performance_counters または sys.dm_os_process_memory を使用してクエリを実行することができます。

既定では、SQL Server は利用可能なシステム リソースに基づいてメモリ要件を動的に管理します。 SQL Server により多くのメモリが必要な場合は、空き物理メモリが使用可能かどうかを調べるためにオペレーティング システムに問い合わせ、使用可能なメモリを使用します。 OS の空きメモリが不足している場合、SQL Server はメモリ不足状態が軽減されるまで、または SQL Server がサーバーの最小メモリ制限に達するまで、メモリをオペレーティング システムに解放します。 ただし、Min Server Memory および Max Server Memory サーバー構成オプションを使用すると、このオプションをオーバーライドしてメモリを動的に使用できます。 詳細については、「 サーバー メモリ オプション」を参照してください。

SQL Server で使用されるメモリの量を監視するには、次のパフォーマンス カウンターを調べます。

  • SQL Server: Memory Manager: Total Server Memory (KB)
    このカウンターは、SQL Server メモリ マネージャーによって、現在 にコミットされているオペレーティング システムのメモリ量を示します。 この数値は、実際のアクティビティの必要に応じて増加すると予想され、SQL Server の起動後に増加します。 このカウンターのクエリを実行するには、sys.dm_os_sys_info 動的管理ビューを使用し、committed_kb 列を観察します。

  • SQL Server: Memory Manager: Target Server Memory (KB)
    このカウンターは、最近のワークロードに基づいて、SQL Server の理想的なメモリ消費量を示します。 一般的な操作期間後の Total Server Memory と比較して、SQL Server に必要な量のメモリが割り当てられているかどうかを判断します。 一般的な操作後、Total Server MemoryTarget Server Memory は近い値になります。 Total Server MemoryTarget Server Memory より大幅に少ない場合、SQL Server インスタンスでメモリ不足が発生している可能性があります。 SQL Server の起動後の期間に、Total Server Memory が増えるに従って、Total Server MemoryTarget Server Memory よりも少なくなると予想されます。 このカウンターのクエリを実行するには、sys.dm_os_sys_info 動的管理ビューを使用し、committed_target_kb 列を観察します。 メモリを構成するためのベスト プラクティスの詳細については、「サーバー メモリの構成オプション」を参照してください。

  • Process: Working Set
    このカウンターは、オペレーティング システムに応じて、現在プロセスで使用中の物理メモリの量を示します。 このカウンターの sqlservr.exe インスタンスを確認します。 このカウンターのクエリを実行するには、sys.dm_os_process_memory 動的管理ビューを使用し、physical_memory_in_use_kb列を確認します。

  • Process\Private Bytes
    このカウンターは、プロセスにより、独自に使用するためにオペレーティング システムに対して要求されたメモリの量を示します。 このカウンターの sqlservr.exe インスタンスを確認します。 このカウンターには、最大 サーバー メモリ オプションによって制限されないものを含め、sqlservr.exe によって要求されたすべてのメモリ割り当てが含まれるため、このカウンターによって、最大サーバー メモリ オプションより大きい値が報告される場合があります。

  • SQL Server: Buffer Manager: Database Pages
    このカウンターは、データベースの内容が含まれたバッファー プール内のページの数を示します。 SQL Server プロセス内のバッファー プール以外の他のメモリは含まれません。 このカウンターのクエリを実行するには、sys.dm_os_performance_counters 動的管理ビューを使用します。

  • SQL Server: Buffer Manager: Buffer Cache Hit Ratio
    このカウンターは、SQL Server に固有のものです。 望ましい値は、90 以上です。 90 より大きい値は、データに対するすべての要求の 90% 以上が、ディスクから読み取る必要なく、メモリ内のデータ キャッシュによって満たされたことを示します。 SQL Server バッファー マネージャーの詳細については、SQL Server バッファー マネージャー オブジェクトに関する記事を参照してください。 このカウンターのクエリを実行するには、sys.dm_os_performance_counters 動的管理ビューを使用します。

  • SQL Server: Buffer Manager: Page life expectancy
    このカウンターは、最も古いページがバッファー プールに保持される時間を秒単位で測定します。 NUMA アーキテクチャを使用するシステムでは、これは、すべての NUMA ノード全体の平均です。 より大きい、増加する値が最適です。 急激な減少は、バッファー プールの中と外でのデータの非常に大きな変動を示し、ワークロードが、既にメモリ内にあるデータを完全に活用できなかったことを指します。 NUMA ノードごとに、独自のバッファー プール ノードがあります。 複数の NUMA ノードを持つサーバーで、 SQL Server: Buffer Node: Page life expectancy 仕様して、各バッファー プール ノードのページの予測保持期間を表示します。 このカウンターのクエリを実行するには、sys.dm_os_performance_counters 動的管理ビューを使用します。

現在のメモリ割り当てを確認する

次のクエリにより、現在割り当てられているメモリに関する情報が返されます。

SELECT
(total_physical_memory_kb/1024) AS Total_OS_Memory_MB,
(available_physical_memory_kb/1024)  AS Available_OS_Memory_MB
FROM sys.dm_os_sys_memory;

SELECT  
(physical_memory_in_use_kb/1024) AS Memory_used_by_Sqlserver_MB,  
(locked_page_allocations_kb/1024) AS Locked_pages_used_by_Sqlserver_MB,  
(total_virtual_address_space_kb/1024) AS Total_VAS_in_MB,
process_physical_memory_low,  
process_virtual_memory_low  
FROM sys.dm_os_process_memory;  

SQL Server による現在のメモリ使用率を確認する

次のクエリにより、SQL Server による現在のメモリ使用率に関する情報が返されます。

SELECT
sqlserver_start_time,
(committed_kb/1024) AS Total_Server_Memory_MB,
(committed_target_kb/1024)  AS Target_Server_Memory_MB
FROM sys.dm_os_sys_info;

ページの予測保持期間の確認

次のクエリでは、sys.dm_os_performance_counters を使用して、SQL Server インスタンスの現在の page life expectancy 値を、バッファー マネージャー全体のレベルと NUMA ノード別のレベルで観察します。

SELECT
CASE instance_name WHEN '' THEN 'Overall' ELSE instance_name END AS NUMA_Node, cntr_value AS PLE_s
FROM sys.dm_os_performance_counters    
WHERE counter_name = 'Page life expectancy';