現在使用されている(実際の)メモリの量と、SQL Serverがそれ自体に割り当てられている量を確認する良い方法は何ですか?
memory_utilization_ percentageに頼っていますが、メモリを解放するために次を実行した後でも変わらないようです。
SELECT [Memory_usedby_Sqlserver_MB] = ( physical_memory_in_use_kb / 1024 ) ,
[Memory_utilization_percentage] = memory_utilization_percentage
FROM sys.dm_os_process_memory;
DBCC FREESYSTEMCACHE ('ALL')
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
SELECT [Memory_usedby_Sqlserver_MB] = ( physical_memory_in_use_kb / 1024 ) ,
[Memory_utilization_percentage] = memory_utilization_percentage
FROM sys.dm_os_process_memory;
解決策は、SQL Serverのmax server memoryを削除し、再び増やして、SQL Serverが未使用で割り当てられたメモリを強制的に解放することです。ただし、このアプローチの問題は、最大サーバーメモリをどれだけ削減できるかがわからないため、SQL Serverが停止するリスクがあることです。 max server memoryの値を減らす前に、SQL Serverが「実際に」使用している量を理解することが重要である理由です。
割り当てられたメモリを解放する方法がありません。ただし、この目的のために、アクティブ/アクティブクラスターを安全に実行する方法を把握できました。 最小サーバーメモリを〜2GBに設定することにしました。インスタンスが使用する最大メモリ量に関係なく、他のインスタンスがメモリ不足になることはないため、これは役立ちます。繰り返しますが、これは目的を解決しますが、実際に使用されているメモリの量、最大サーバーメモリをどれだけ低くすることができるかなどの質問にはまだ答えていません...
SQL Serverは、常にそれが実行中のプライマリアプリケーションであると想定します。リソースを共有するようには設計されていません。使用可能なすべてのメモリが常に使用され、「最大サーバーメモリ」で調整しない限り、オペレーティングシステムに対してのみ解放されます。
設計上、SQL Serverは他のサーバーとうまく機能しません。
このsqlskillsの記事では、スロットルのベースラインに続いて、必要に応じてスロットルを監視および引き上げることを推奨しています。
https://www.sqlskills.com/blogs/jonathan/how-much-memory-does-my-sql-server-actually-need/
以下の修正されたスクリプトは私のために働いた。同じサーバーで他の1回限りのプロセスを実行できるように、SQLServerが保持しているRAMの束を一時的に解放する必要がありました。必要に応じてメモリをバックアップします。
組み込みの待機を追加して、SQLServerが実際にメモリを解放してから元のレベルに戻すようにしました。ニーズに合わせて、必要に応じて値を調整してください。
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
/*** Drop the max down to 64GB temporarily ***/
sp_configure 'max server memory', 65536; --64GB
GO
RECONFIGURE;
GO
/**** Wait a couple minutes to let SQLServer to naturally release the RAM..... ****/
WAITFOR DELAY '00:02:00';
GO
/** now bump it back up to "lots of RAM"! ****/
sp_configure 'max server memory', 215040; --210 GB
GO
RECONFIGURE;
GO
緊急事態に陥った場合や、わずかなダウンタイムが発生する可能性がある場合は、SQLサービスを再起動してください。再起動して非常にうまく仕事をするのはほんの数秒です。サーバー名を右クリックして、[再起動]をクリックします。