SQL Serverでメモリを解放するにはどうすればよいですか?


19

SQLはRAMを好むことを知っていますが、Windowsが要求したときに解放します。これがSQLがどのように機能するかを知っています。しかし、SQLが実際にRAMを返すことを確信していないWindows管理者がいて、この特定の(仮想)サーバーでは、Analysis Servicesが終了するとSQLはあまり必要ありませんが、このサーバーには他に気にすることはありませんSQLに多くを求めます。

したがって、仮想環境の問題は「SQLが大量のRAMを使用しているため」ではないことをWindows管理者に安心させようとしていますが、サービスを再起動せずにSQLを解放するよう説得することはできません。

キューブを処理するとき、SQLサービスは幸いにも8GBのRAMを使用しますが、それに圧力がかからないため、通常の日中はこの多くを解放しません。Windowsの連中は悲鳴を上げており、SQLがこれをリリースしてくれるともっといいでしょう。

実際には、処理時にSQLがそれほど多くのRAMを使用するようにしたいため、最大メモリ設定を使用したくありません。あとでまた下に戻りたいです。

SQL Server からMemory解放しないSQL ServerReclaiming memoryの両方の複製である可能性がありますが、別の答えがあるのではないかと考えています。Windowsがそれを取り戻すのを待つことは、ここでWindowsの連中を説得するつもりはない。サービスの再起動はオプションですが、私は実際にはその考えのファンではありません。

Windowsにそれを要求する方法を知りたい...


2
何が...システム管理者が使用されているRAMについて不平を言っていますか?RAMが使用されていないとき、それだけで無駄になるだろう使用されていない場合ので、私は、くだらないを取得...
マーク・ヘンダーソン

マシンがメモリを必要としない場合、私もそれを取得しません-問題はどこにありますか?これは、オペレーティングシステムとそのアプリケーションが通常どのように機能するかです...アイドル状態のSQLサービスを持つワークロードが、必要なときにほとんどのメモリを保持している場合、次のSQLジョブの応答時間やパフォーマンスが向上する可能性がありますか?
オスカーデューブボーン

Windows管理者は、プロセスに大量のRAMがあるため、SQLがマシンに負荷をかけていると感じています。私は、ボックスがSQLからのストレスを受けていないことを知っており、SSAS処理用のデータを取得するときに多くのRAMを消費しているだけであることを示すSQLサービスを再起動することで実証できます。そのため、SQLがメモリを解放して、SQLが残りの時間に使用しているRAMの量を表示するようにします。より多くのRAMを提供することではなく、単にSQLを非難することをやめることではありません。
ロブファーリー

2
Farseekerに同意し、システム管理者はRAMが使用されていることを確認する必要があります。再利用されていない場合、サーバーはそれを必要としません。システムにストレスがかかっていないことを示すために、システム管理者にページフォールトを調べるよう依頼することもできますか?
ニックカバディアス

2
あなたのシステム管理者がページ違反が何を表しているのか理解できず、なぜメモリを消費しても実際のページ違反が発生しないのが問題でない場合、私はあなたを助ける方法を知りません。愚かな修正はできません。ただし、できることの1つは、sp_configureを使用して、システムを使用していないときに最大メモリを構成し、必要に応じてバックアップを構成することです。しかし、これはかなりばかげているようです。 sp_configure通常、一度設定してそのままにしておく必要があります。
ベーコンビット

回答:


12

唯一の選択肢は、SQLサービスを再起動するか、大量のメモリを消費するアプリケーションを実行してSQLに強制的に解放させることだと思います。

@Nick Kavadiasの提案が好きです。Memory :Page Faults / Secパフォーマンスカウンタを監視して、SQLがOSのメモリを圧迫していないことを示します。


2
ありがとうMitch ...メモ帳用の10GBのテキストファイルを見つけましょう。
ロブファーリー

笑!実際、それは悪い考えではありません!
ミッチウィート

多分2GBのファイル...使用
ミッチ小麦

5

それを行うことを示す1つの方法は、SQL Serverにすべてのメモリを噛み込ませることです。次に、ネットワーク経由で巨大なファイルをコピーします(これには大きなSQLバックアップファイルが最適です)。これにより、システムキャッシュが一杯になり、WindowsはSQLにメモリを要求し始めます。SQLは、最小メモリ設定に達するまでOSにメモリを返し始めます。

(申し訳ありませんが、Twitterを介して質問全体を取得することはできませんでした。


1
私は、バッファをきれいにしてドロップした後、SQLにメモリを戻すように頼むことができるプロセスを望んでいますが、それを行うためにボックスを壊す必要はありません。
ロブファーリー

別の手段で問題を強制することなく、Windowsメモリマネージャーにメモリを要求するよう強制する方法はないと思います。あなたはおそらくwin32 APIに直接ヒットする何かを書くことができますが、私が知っている限り、Windowsがメモリを要求するようにトリガーする唯一の方法は、別のプロセスのためにより多くのメモリを必要とすることです。ボブまたはポールに確認してください、彼らはより多くの情報があるかもしれません。
mrdenny

3
VMwareのバルーンドライバーはこれを正確に実行します。SQLServer(または他のアプリケーション)がメモリを放棄するために、Windowsにより多くのメモリを要求します。
ブレントオザー

ええ-私はそのようなことをする必要がないことを望んでいました。
ロブファーリー

VMwareのバルーンドライバ@BrentOzarは、実際のプロセスメモリではなく、システムキャッシュからメモリを回収するだけです。OSに「使用可能なメモリをすべて些細なことで使い果たさない」ように指示するために設計されています。
マッシモ

2

あなたは「キューブ」に言及しているので、ASエンジンとリレーショナルエンジンのどちらについて話しているのかは明確ではありません。リレーショナルエンジンは、オンデマンドでメモリを解放できます。

DBCC FREESYSTEMCACHE('<cache name>');

「キャッシュ名」はsys.dm_os_memory_clerksから取得されますDBCC FREESYSTEMCACHEの仕様では、ガバナープールのみに言及していますが、実際にはさらに多くのキャッシュを削除できます。

ただし、すべてのメモリがバッファプールで使用されている場合、バッファプール全体を削除すると、パフォーマンスが大幅に低下し、IO負荷が大幅に増加します。SQLがこれ自体を処理できるようにした方が良いでしょう。


1
こんにちはRemus、リレーショナルバッファキャッシュはキューブの処理に続いて大きくなります。その後、キャッシュを消去、削除し、メモリをWindowsに戻したいと思います。DBCC DROPCLEANBUFFERSとFREESYSTEMCACHEはキャッシュを空にしますが、Windowsにメモリを返さないため、完全に私が望むものではありません。
ロブファーリー

2
理論的には、メモリのプレッシャーを偽造することもできます(たとえば、QueryMemoryResourceNotification msdn.microsoft.com/en-us/library/aa366799%28VS.85%29.aspxをトランポリンすることもできます)でも、私は本当にそこには行きません。SQLがコミット済みメモリを解放しないのは、OSがそれを必要としないためです。SQLはホスト上の唯一のアプリケーションであるため、OSはメモリを必要としません(stackoverflow.com/questions/1401834/…)?SQLに沿って他のアプリケーションを実行する場合、それが実現しました。
レムスルサヌ

2

ASエンジンとDSエンジンの両方を使用すると、メモリに上限を設定して、安全なしきい値を下回るようにすることができます。これは、大量のRAMや複数のSQLインスタンスを備えた64ビットマシンで推奨されます。少なくともデータベースエンジンの場合、メモリの上限を現在の使用量よりも低く変更すると、SSASについてはわかりませんが、サービスを再起動する必要なく、オンザフライでメモリ量が削減されます。


キャップは大丈夫ですが、処理後に最大メモリを引き下げてから押し戻したいと思います。バッファをきれいにしたり、ドロップしたり、Windowsにメモリプレッシャーを要求したりします。
ロブファーリー

1

私が見つけた最も簡単な方法は、サーバーのメモリプロパティに移動し、小さい値を入力し、適用し、数分待ってから構成を調整することです。

また、SQLサーバーのメモリ使用量を調整すると、実際にはサーバーのパフォーマンスが向上することがわかりました。これは、キャッシュなどにより多くのRAMをWindowsに提供するためです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.