SQL Server In-Memory OLTP は、SQL Server とは異なる方法で、より多くのメモリを使用します。 インストールしてインメモリ OLTP 用に割り当てたメモリ量が、ニーズの拡大に合わなくなる場合があります。 その場合は、メモリが不足する可能性があります。 このトピックでは、OOM 状態から回復する方法について説明します。 多数の OOM 状態を回避するのに役立つガイドについては、「 メモリ使用量の監視とトラブルシューティング 」を参照してください。
このトピックの内容
トピック | 概要 |
---|---|
OOM によるデータベース復元の障害を解決する | 「リソース プール '<resourcePoolName>' のメモリが不足しているため、データベース '<databaseName>' の復元操作に失敗しました。」というエラー メッセージが表示された場合の対処方法。 |
低メモリまたは OOM 状態によるワークロードへの影響を解決する | 低メモリの問題によるパフォーマンス低下が見つかった場合の対処方法。 |
十分なメモリがある状況でのメモリ不足によるページの割り当てエラーを解決する | "リソース プール '<resourcePoolName>>' のメモリが不足しているため、データベース '<databaseName>>' のページ割り当ては禁止されています" というエラー メッセージが表示された場合の対処方法。 ..." というエラー メッセージが発生した場合の対処方法。 |
OOM によるデータベース復元の障害を解決する
データベースを復元しようとすると、"リソース プール '<resourcePoolName>' のメモリ不足のため、データベース '<databaseName>' の復元操作に失敗しました" というエラー メッセージが表示されることがあります。データベースを正常に復元するには、メモリを増やしてメモリ不足の問題を解決する必要があります。
OOM による復旧エラーを解決するには、これらのいずれかの方法を使用して使用可能なメモリを増やし、復旧操作に使用できるメモリを一時的に増やします。
実行中のアプリケーションを一時的に閉じます。
Visual Studio、Internet Explorer、OneNote などの実行中の 1 つ以上のアプリケーションを閉じると、復元操作で使用していたメモリを使用できるようになります。 閉じたアプリケーションは、復元操作の正常完了後に再起動できます。MAX_MEMORY_PERCENT の値を増やします。
このコード スニペットでは、リソース プール PoolHk の MAX_MEMORY_PERCENT を変更して、インストールされているメモリの 70% に設定します。重要
サーバーが VM 上で実行されており、専用用途ではない場合は、MIN_MEMORY_PERCENT を MAX_MEMORY_PERCENT と同じ値に設定してください。
詳細については、「 ベスト プラクティス: VM 環境でのインメモリ OLTP の使用 」をご覧ください。-- disable resource governor ALTER RESOURCE GOVERNOR DISABLE -- change the value of MAX_MEMORY_PERCENT ALTER RESOURCE POOL PoolHk WITH ( MAX_MEMORY_PERCENT = 70 ) GO -- reconfigure the Resource Governor -- RECONFIGURE enables resource governor ALTER RESOURCE GOVERNOR RECONFIGURE GO
MAX_MEMORY_PERCENTの最大値については、「メモリ最適化テーブルとインデックスで使用可能なメモリの割合」セクションを参照してください。
最大サーバー メモリを再構成します。
最大サーバー メモリの構成については、「メモリ構成オプションを使用したサーバー パフォーマンスの最適化」トピックを参照してください。
低メモリまたは OOM 状態によるワークロードへの影響を解決する
言うまでもなく、低メモリまたは OOM (メモリ不足) の状態にならないことがベストです。 適切なプラン作成と監視によって、OOM 状態を回避することができます。 ただし、最適なプランを作成しても、実際に起こることを予測できるとは限らず、結果として低メモリまたは OOM の状態になる場合もあります。 OOM からの復旧には、次の 2 段階があります。
DAC (専用管理者接続) を開く
Microsoft SQL Server には、専用の管理者接続 (DAC) が用意されています。 DAC を使用すると、サーバーが他のクライアント接続に応答しない場合でも、SQL Server データベース エンジンの実行中のインスタンスにアクセスして、サーバーの問題をトラブルシューティングすることができます。 DAC は、 sqlcmd
ユーティリティと SQL Server Management Studio (SSMS) から使用できます。
sqlcmd
と DAC の使用に関するガイダンスについては、「専用管理者接続の使用」を参照してください。 SSMS を使用した DAC の使用に関するガイダンスについては、「 方法: SQL Server Management Studio で専用管理者接続を使用する」を参照してください。
修正措置を行う
OOM 状態を解決するには、使用率を削減して既存メモリを解放するか、インメモリ テーブルに使用できるメモリ量を増やす必要があります。
既存メモリを解放する
メモリ最適化テーブルの不要な行を削除し、ガベージ コレクションを待機する
メモリ最適化テーブルから、不要な行を削除できます。 ガベージ コレクターによって、これらの行で使用されていたメモリが使用可能メモリに返されます。 . インメモリ OLTP エンジンは、ガベージ行を積極的に回収します。 ただし、実行時間が長いトランザクションではガベージ コレクションが行われないことがあります。 たとえば、5 分間実行されているトランザクションの場合、トランザクションがアクティブな状態で更新操作または削除操作によって作成された行バージョンは、ガベージ コレクションで回収することができません。
1 つ以上の行をディスク ベース テーブルに移動する
TechNet の次の資料では、メモリ最適化テーブルからディスク ベース テーブルに行を移動する方法について説明しています。
使用可能なメモリを増やす
リソース プールの MAX_MEMORY_PERCENT 値を増やす
インメモリ テーブル用に名前付きリソース プールを作成していない場合は、作成してインメモリ OLTP データベースをバインドします。 インメモリ OLTP データベースを作成してリソース プールにバインドする方法については、「メモリ最適化テーブルを持つデータベースのリソース プールへのバインド」を参照してください。
インメモリ OLTP データベースがリソース プールにバインドされている場合は、プールがアクセスできるメモリのパーセントを増やせることがあります。 リソース プールの MIN_MEMORY_PERCENT および MAX_MEMORY_PERCENT の値を変更する方法については、サブトピック「 既存のプール内での MIN_MEMORY_PERCENT と MAX_MEMORY_PERCENT の変更 」をご覧ください。
MAX_MEMORY_PERCENT の値を増やします。
このコード スニペットでは、リソース プール PoolHk の MAX_MEMORY_PERCENT を変更して、インストールされているメモリの 70% に設定します。
重要
サーバーが VM 上で実行されており、専用用途ではない場合は、MIN_MEMORY_PERCENT と MAX_MEMORY_PERCENT を同じ値に設定してください。
詳細については、「 ベスト プラクティス: VM 環境でのインメモリ OLTP の使用 」をご覧ください。
-- disable resource governor
ALTER RESOURCE GOVERNOR DISABLE
-- change the value of MAX_MEMORY_PERCENT
ALTER RESOURCE POOL PoolHk
WITH
( MAX_MEMORY_PERCENT = 70 )
GO
-- reconfigure the Resource Governor
-- RECONFIGURE enables resource governor
ALTER RESOURCE GOVERNOR RECONFIGURE
GO
MAX_MEMORY_PERCENT の最大値については、「 メモリ最適化テーブルおよびインデックスで使用可能なメモリの割合」をご覧ください。
追加メモリをインストールする
可能であれば、最終的に最上のソリューションは、追加の物理メモリをインストールすることです。 その場合は、SQL Server でそれ以上のメモリが必要である可能性は低いため、新しくインストールされたメモリのすべてがリソース プールで使用可能でない場合はそれを活用して、MAX_MEMORY_PERCENT 値 (サブトピック「既存のプール内での MIN_MEMORY_PERCENT と MAX_MEMORY_PERCENT の変更」を参照) も増やせる可能性があります。
重要
サーバーが VM 上で実行されており、専用用途ではない場合は、MIN_MEMORY_PERCENT と MAX_MEMORY_PERCENT を同じ値に設定してください。
詳細については、「 ベスト プラクティス: VM 環境でのインメモリ OLTP の使用 」をご覧ください。
十分なメモリがある状況でのメモリ不足によるページの割り当てエラーを解決する
リソース プール '<resourcePoolName>' のメモリ不足のため、"データベース '<databaseName>' のページ割り当てを許可しない" というエラー メッセージが表示される場合。 エラーログに「https://go.microsoft.com/fwlink/?LinkId=330673」が表示される場合、使用可能な物理メモリがページを割り当てるのに十分であるにもかかわらず、リソース ガバナーが無効になっている可能性があります。 詳細については、「https://go.microsoft.com/fwlink/?LinkId=330673」を参照してください。 リソース ガバナーが無効になっていると、MEMORYBROKER_FOR_RESERVE によって擬似的なメモリ不足が引き起こされます。
これを解決するには、リソース ガバナーを有効にする必要があります。
オブジェクト エクスプローラー、リソース ガバナーのプロパティ、または Transact-SQL を使用してリソース ガバナーを有効にする方法や、制限事項と制約事項については、「 リソース ガバナーの有効化 」をご覧ください。
こちらもご覧ください
インメモリ OLTP のメモリ管理
メモリ使用量の監視とトラブルシューティング
メモリ最適化テーブルを持つデータベースのリソース プールへのバインド
ベスト プラクティス: VM 環境での In-Memory OLTP の使用