この更新プログラムを適用した後、この変更を有効にするには、 T8075 をスタートアップパラメーターとして追加する必要があります。
現象
64ビット版の Microsoft SQL Server 2012 でクエリを実行すると、SQL Server エラーログに次のようなメモリ不足のエラーメッセージが表示されます。
ページの割り当てに失敗しました: FAIL_PAGE_ALLOCATION 513
クエリの実行が完了して SOS_MEMORY_TOPLEVELBLOCKALLOCATOR の待機が発生するまでに時間がかかります。 次の情報ポイントを確認すると、使用可能な仮想アドレス空間が非常に少なくなっていることがわかります。
-
DBCC MEMORYSTATUS-Process/System 計数セクション-利用可能な仮想メモリ
-
DMV: sys.dm_os_process_memory 列 virtual_address_space_available_kb
これらの値は、x64 プロセスで8テラバイト (TB) の範囲で開始され、数ギガバイト (GB) まで上昇し続けることができます。 使用可能な仮想アドレス空間が非常に少なくなっている段階では、メモリ割り当てを実行しようとするクエリでも、CMEMTHREAD の待機の種類が発生する可能性があります。 次のデータポイントは、時間の経過と共に増え続けます。
-
DMV: sys.dm_os_process_memory と sys.dm_os_memory_nodes 列の virtual_address_space_reserved_kb
-
DBCC MEMORYSTATUS-Memory Manager セクション-VM 予約済み
これらの値は通常、最大 8 TB の "max server memory" 値の倍数で増加します。
原因
SQL Server プロセスが、合計サーバーメモリ = ターゲットサーバーメモリ = 最大サーバーメモリの状態に達した場合、SQL Server メモリマネージャーで、新しい割り当てで、複数の 8 KB のページを一時的に要求するためのポリシーが用意されています。 このような状況では、メモリブロックと仮想アドレス空間の消費の断片化が発生する可能性があります。 このプロセスが何度も繰り返される場合は、SQL Server の仮想アドレス空間が使い果たされ、前に説明したような現象が発生します。
解決方法
累積的な更新プログラムの情報
この問題は、SQL Server の次の累積的な更新プログラムで最初に修正されました。
SQL Server 用の新しい累積更新プログラムには、以前の累積的な更新プログラムに含まれていたすべての修正プログラムとすべてのセキュリティ修正が含まれています。 SQL Server の最新の累積的な更新プログラムをダウンロードしてインストールすることをお勧めします。
この修正プログラムにより、メモリが不足したり、使用可能な仮想アドレス空間が継続的に削減されたりすることはありません。
状態
マイクロソフトでは、この問題をこの資料の対象製品として記載されているマイクロソフト製品の問題として認識しています。
詳細情報
-
Windows 2012 R2 を使用すると、仮想アドレス空間のサイズが 128 TB を超えることができます。 そのため、Windows 2012 R2 環境では、この問題は発生しない可能性があります。 詳細については、Windows デベロッパーセンターの次のトピックを参照してください。windows および Windows Server release のメモリ制限
-
修正プログラムを適用した後も、仮想アドレス空間に継続的な成長が表示される場合は、 Page_allocated 拡張イベントを使用して、メモリの大部分を要求するクエリまたは操作を特定できます。 サンプルスクリプトは、次のようになります。
CREATE EVENT SESSION [memory_tracking] ON SERVERADD EVENT sqlos.page_allocated( ACTION(package0.callstack,sqlos.cpu_id,sqlos.task_address,sqlos.worker_address,sqlserver.database_id,sqlserver.query_hash,sqlserver.request_id,sqlserver.session_id,sqlserver.sql_text) WHERE ([number_pages]>(1)))ADD TARGET package0.event_file(SET filename=N'E:\Data\MSSQL11.MSSQLSERVER\MSSQL\Log\memory_tracking.xel')WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=PER_CPU,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)GO
通常、これらはログのバックアップやインデックスのメンテナンス操作であり、頻繁に発生します。