SQLServerのメモリ最適化テーブルからのメモリプレッシャーアラートを処理する
Microsoft SQL Serverは、メモリ管理の点で非常に優れていますが、メモリプレッシャーアラートやデータベースエンジンがより多くのメモリを要求し、エラーが発生する場合があります。
この投稿では、メモリ最適化テーブル(インメモリオンライントランザクション処理(OLTP))によって引き起こされるSQLServer®2019(Enterprise Edition)のメモリプレッシャーが原因で発生する可能性のある例外的なシナリオの1つを解決する方法について説明します。同じ手順がSQLServer2014以降にも適用されます。
画面に次のエラーメッセージが点滅する場合があります。
Message: MSSQL on Windows: Stolen Server Memory is too high
Source: XXXXX\MSSQLSERVER Path: Not Present Alert
description: SQL instance "MSSQLSERVER" Stolen Server Memory on
computer "XXXXXXX.XXX.com" is too high.
Message: SQL Server Alert System: 'Severity 17' occurred on \\XXXXXXX
DESCRIPTION: There is insufficient system memory in resource pool 'internal'
to run this query.
Message: Disallowing page allocations for database 'InMemoryDB' due to
insufficient memory in the resource pool 'default'. See
'https://go.microsoft.com/fwlink/?LinkId=510837' for more information.
Message: XTP failed page allocation due to memory pressure: FAIL_PAGE_ALLOCATION 32
この問題のトラブルシューティングと解決を行うには、次の手順を実行してください。
最初のステップは、SQLバッファプールのメモリ消費量を確認することです。
前の画像からわかるように、問題のデータベース InMemoryDB 、バッファプールの0.017%のみを消費します。
次に、次のT-SQLコマンドを使用してOSメモリクラークを確認します。
select * from sys.dm_os_memory_clerks order by pages_kb desc
結果は、上位の消費者の合計が最大サーバーメモリの合計の約80%であることを示しています。
メモリ最適化テーブルのサイズも2GB未満です。これは、前の画像の DB_ID_6という名前で確認できます。 。そのため、理想的には、サーバーにメモリの負荷がかからないようにする必要があります。
エラーログに記載されているメモリ不足(OOM)リンクを確認した後、 https://go.microsoft.com/fwlink/?LinkId=510837 、メモリ最適化テーブルを使用してデータベースをリソースプールにバインドする必要があります。このバインディングは、メモリが最適化されたテーブルを持つデータベースのベストプラクティスです。手順に従って、リソースガバナーにリソースプールを作成し、データベースをバインドします。
ベストプラクティスでは、SQL Serverのリソースが1つ以上のメモリ最適化テーブルによって消費されないように保護し、他のメモリユーザーがメモリ最適化テーブルに必要なメモリを消費しないようにすることをお勧めします。したがって、メモリ最適化テーブルを使用してデータベースのメモリ消費を管理するために、別のリソースプールを作成する必要があります。
データベースをリソースプールに追加するときは、次の点に注意してください。
- データベースをバインドできるのは1つのリソースプールのみです。
- 複数のデータベースを同じプールにバインドできます。
- SQL Serverでは、メモリ最適化テーブルのないデータベースをリソースプールにバインドできますが、効果はありません。
- データベースをリソースプールにバインドした後、データベースにメモリ最適化テーブルを作成できます。
-
メモリ割り当てを使用してリソースプールを作成します:
USE [master] GO CREATE RESOURCE POOL [Admin_Pool] WITH(min_cpu_percent=0, max_cpu_percent=100, min_memory_percent=15, max_memory_percent=15, cap_cpu_percent=100, AFFINITY SCHEDULER = AUTO, min_iops_per_volume=0, max_iops_per_volume=0) GO
注 :メモリ不足状態を回避するために、 min_memory_percentの値 およびmax_memory_percent 同じである必要があります。
この場合、メモリ最適化テーブルは非常に小さく、サーバーメモリ全体の15%がリソースプールに割り当てられます。参照内のリンクを使用して、環境内のメモリの割合を計算することを忘れないでください。
-
リソースプールを確認し、データベースをそれにバインドします:
EXEC sp_xtp_bind_db_resource_pool 'InMemoryDB', 'Admin_Pool' GO
-
sys.databasesでバインドを確認します :
SELECT d.database_id, d.name, d.resource_pool_id FROM sys.databases d GO
-
データベースを再起動して、バインディングをアクティブにします。
ALTER DATABASE DB_Name SET OFFLINE GO ALTER DATABASE DB_Name SET ONLINE GO
注 :データベースが常にオンになっている場合は、両方のノードで手順を実行し、手順4(データベースの再起動)の代わりに、セカンダリインスタンスへのデータベースフェイルオーバーを実行します。
この場合、メモリ最適化テーブルを持つデータベースをリソースプールに追加した後、メモリプレッシャーに関連するすべてのアラートが停止しました。この特定の問題についてSQLServerエラーログを数週間監視しましたが、メモリ不足の痕跡はありませんでした。これらの手順は、最小限のダウンタイムでデータベースエンジンレベルのメモリ負荷を修正するのに役立ちました。
コメントや質問をするには、[フィードバック]タブを使用します。私たちと会話を始めることもできます。
-
統合データプラットフォーム:SQL Server 2019
2006年、英国の数学者Clive Robert Humbyは、「データは新しい石油です」という言葉をマークしました。それ以来、ITリーダーはこれを繰り返し聞き、アイデアに共感し、あらゆる段階で拡張編集を行ってきました。 クライブはさらに次のように付け加えました。「データは価値がありますが、洗練されていないと実際には使用できません。収益性の高い活動を推進する価値のあるエンティティを作成するには、wayOilをガス、プラスチック、化学薬品などに変更する必要があります。そのため、データに価値を持たせるには、データを分析して分析する必要があります。」 ITリーダーはこれ以上同意できず、データから
-
MS Access から SQL Server データベースにデータを移行する
最近、データベースが大きくなりすぎて Access で処理できなくなったため、Access データベースから SQL Server 2014 にデータを移行する必要がありました。プロセスはかなり単純ですが、段階的な手順を記載した記事を書こうと思いました. まず、コンピューターに SQL Server または SQL Server Express がインストールされていることを確認する必要があります。 PC に SQL Server Express をダウンロードする場合は、必ず Advanced Services を含むバージョンをダウンロードしてください。 .そうしないと、データベース エ