SQL Server のメモリ管理については、メモリ管理アーキテクチャ ガイド で解説が行われています。
このガイドの中で、メモリ不足の検出 に次の記載があります。
次の 2 つのリング バッファーに、動的メモリ管理に関連する情報が保持されます。
- メモリ不足が通知されているかどうかなど、リソース モニターのアクティビティを追跡するリソース モニター リング バッファー。 このリング バッファーには、現在の
RESOURCE_MEMPHYSICAL_HIGH
状態に応じて状態情報が含まれます。RESOURCE_MEMPHYSICAL_LOW
RESOURCE_MEMPHYSICAL_STEADY
RESOURCE_MEMVIRTUAL_LOW
- 各 Resource Governor リソース プールのメモリ通知のレコードが含まれるメモリ ブローカー リング バッファー。 内部メモリ不足が検出されると、メモリの割り当てを行うコンポーネントに対して、メモリ不足を示す通知がオンになり、キャッシュ間でメモリのバランスをとるためのアクションがトリガーされます。
SQL Server のメモリ管理は「動的メモリ管理」によって実施されており、OS / SQL Server のメモリ使用状況に応じて、各役割のメモリを自動的に調整します。
この動的メモリに関する動作については、リングバッファーから確認をすることができるようになっています。
SQL Server でリングバッファーの情報を確認する際には、拡張イベントを使用して確認を行いますが、上述の動的メモリ管理については、次の拡張イベントで確認をすることができます。
- resource_monitor_ring_buffer_recorded
- memory_broker_ring_buffer_recorded
「resource_monitor_ring_buffer_recorded」が以下の記載の情報を確認するものとなり、
- メモリ不足が通知されているかどうかなど、リソース モニターのアクティビティを追跡するリソース モニター リング バッファー。 このリング バッファーには、現在の
RESOURCE_MEMPHYSICAL_HIGH
状態に応じて状態情報が含まれます。RESOURCE_MEMPHYSICAL_LOW
RESOURCE_MEMPHYSICAL_STEADY
RESOURCE_MEMVIRTUAL_LOW
「memory_broker_ring_buffer_recorded」が以下の記載の情報を確認するものとなります。
- 各 Resource Governor リソース プールのメモリ通知のレコードが含まれるメモリ ブローカー リング バッファー。 内部メモリ不足が検出されると、メモリの割り当てを行うコンポーネントに対して、メモリ不足を示す通知がオンになり、キャッシュ間でメモリのバランスをとるためのアクションがトリガーされます
拡張イベントでこれらのイベントを取得することで、動的メモリ管理によるメモリの変動が発生した場合の挙動を理解するための情報を取得することができます。
「resource_monitor_ring_buffer_recorded」については、QueryMemoryResourceNotification API ともかかわりのある動作となります。sqlservr.exe は、 LowMemoryCondition / HighMemoryCondition のメモリ通知オブジェクトのハンドルを使用しており、OS のメモリ状態の確認を行っています。
これについては Process Explorer でハンドルの検索を確認することでも確認できます。(通知の存在については WinObj で確認することもできます)
これらの通知を使用して SQL Server が確保しているメモリの調整が行われます。
「メモリ内のページのロック」で SQL Server のバッファプールのメモリが確保されていても、他のプロセスのメモリ使用状況によっては、SQL Server が取得しているメモリの解放が行われますが、そのような動作が行われることの理解を深めるためには、メモリ通知系の API について調べる必要が出てきます。(SQL Server 2022 では、「SQLServer:Memory Manaer\Decommit Memory (KB)/sec」 というパフォーマンスモニターのカウンターが追加されており、メモリがデコミットされていく状況を確認することもできます)
SQL Server が確保しているメモリの変更については、「memory_broker_ring_buffer_recorded」の拡張イベントで、割り当ての変更状況を追うことができます。
SQL Server では、メモリに関して設定できる項目は多くなく (というよりほとんど設定できません)、確保されているメモリから、SQL Server のプロセス内のスレッド (主にリソースモニター) が、役割に応じたメモリの使用状況に応じて動的に管理が行われています。
この動的メモリ管理がサーバーの CPU 使用状況を高めるトリガーとなっている可能性があり、動作によっては、Privileged Time が通常と比較して大きく上昇するようなこともあります。
このような状況になった場合、SQL Server のメモリ管理についての理解を深める必要が出てきますので、そのような場合には、リングバッファーに関しての拡張イベントで SQL Server のメモリ管理の動作を確認することで、実際の状況についての把握を行うことができるのではないでしょうか。
- resource_monitor_ring_buffer_recorded
- memory_broker_ring_buffer_recorded
の拡張ベントについては、クラスター環境 (FCI / Always On FCI / Always On AG) では、クラスターの診断ログ にも情報の出力が行われていますので、高可用性環境については、標準で取得されているログからも情報を確認することはできるのではないでしょうか。