web-dev-qa-db-ja.com

再起動する必要があるまで、SQL Serverは時間の経過とともに遅くなります

OLAP/OLTPワークロードが混在するデータベースがあります。クエリは非常にアドホックであり、中間層アプリケーションサーバーで動的に作成されます。サーバーを起動すると、パフォーマンスは許容範囲内ですが、使用可能なすべてのメモリ(30GB)がなくなるまで、メモリ消費量はどんどん増えます。その後、システムはますます遅くなります。

Dbcc freeproccacheのようなコマンドは効果がありません。

select * from sys.dm_tran_session_transactionsには多くのトランザクションがありません(システムに問題がない場合に限ります)。このリストが空の場合もあります。

dbcc memorystatusの最初の結果は

VM Reserved               42136628
VM Committed               1487176
Locked Pages Allocated    24994048
Reserved Memory               1024
Reserved Memory In Use           0

SQL Serverを再起動すると、しばらくの間問題が解決します。

  1. この動作の原因は何ですか?どうすればそれを回避できますか?
  2. 原因の実際の解決策が難しすぎる場合、DBMSを完全に再起動せずにSQL Serverにすべてのメモリを実際に解放させるコマンドはありますか?

サーバーは専用のハードウェア(VMではなく)で実行されています。スケジュールされたジョブがいくつかありましたが、変更なしでしばらく無効にしました。同じサーバー上で実行されている他の中間層アプリケーションがありますが、それらは2GB以下のメモリ、ごくわずかなCPU、ほとんどI/Oを使用しません。そのようなアプリケーションはすべて変更せずに再起動しました。

8
Alireza

このサーバーでパフォーマンスメトリックを収集することをお勧めします。そうすることで、これらのタイプの問題のトラブルシューティングから当て推量を排除できます。どこから始めればよいかわからない場合は、より完全なガイドについて この記事 を参照してください。

特に、パフォーマンスカウンター_Memory\Available MBytes_とPaging File(_Total)\% Usageを確認します。これは、問題が発生するのは、バッファープールがいっぱいになったときだけであるためです。これらのカウンターから返される数値は、サーバーに割り当てられている物理メモリの量に応じて、サーバーの最大メモリ設定を調整する必要があることを示している可能性があります。 ここ で述べたように、開始点の経験に基づく推測として以外は、最大メモリ設定を物理メモリの量に基づくことはお勧めしません。常に測定結果を測定し、そこから調整します。

空きメモリの量が少なすぎる(<500)、またはページファイルの使用量がzeroを超えている場合、SQL Serverインスタンスがオーバーコミットされている可能性があります:SQL Server 2008 R2、最大サーバーメモリ設定は、バッファープールサイズのみを制御し、プランキャッシュなどの他のメモリ使用量は制御しません。 SQL Serverは、システムで実行している可能性のある他のアプリケーションも考慮しません。この余分なメモリ使用量は、Windowsまたは他のアプリケーションにメモリの負荷をかける可能性があり、ディスクの交換につながる可能性があります。これは、特にページファイルが単純なRAID 1ミラーによってバックアップされたボリュームに存在する場合は、どうしても避けたいものです。これが問題であり、サーバーの最大メモリ設定をバックオフすることで問題が解決するはずです。

空きメモリの量が多く(> 1000)、ページファイルの使用量がゼロの場合、サーバーのメモリ使用量を最大化するために、おそらく最大サーバーメモリを少し(256 MB単位で)増やすことができます。ただし、これで問題が解決することはほとんどありません。おそらく、物理ディスクカウンターとバッファープールページの予想寿命を調べる必要があります。クエリがバッファプールをスラッシングしている場合は、ディスクのパフォーマンスを改善するか、サーバーで使用できる物理メモリの量を増やしてすべてのデータページを一度にメモリに収めることができるか、データベースをあまり使用しないように変更する以外に何もできません物理スペース(おそらく、行またはページの圧縮を使用するか、FILLFACTORが高いインデックスを再構築することによって)。

このトピックに関する記事を公開しました here この問題とその解決方法についてさらに詳しく説明します。

10
Jon Seigel

データベースページがキャッシュに移動するとパフォーマンスが向上するため(ページの平均余命とバッファヒット率は時間とともに増加します)、最大メモリを(total_physical_mem-2GB)に設定しているため、通常、時間の経過に伴う速度低下の傾向は逆になります。

いくつかのクエリが原因で、SQL Serverが多くのことをページアウトおよびページインしているようです。 Resource Governor を試して大きなクエリと中程度のクエリのメモリ消費を制限し、アプリケーションクエリで常に十分なバッファを利用できるようにすることができます。

1
WrinkleFree