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を再起動すると、しばらくの間問題が解決します。
サーバーは専用のハードウェア(VMではなく)で実行されています。スケジュールされたジョブがいくつかありましたが、変更なしでしばらく無効にしました。同じサーバー上で実行されている他の中間層アプリケーションがありますが、それらは2GB以下のメモリ、ごくわずかなCPU、ほとんどI/Oを使用しません。そのようなアプリケーションはすべて変更せずに再起動しました。
このサーバーでパフォーマンスメトリックを収集することをお勧めします。そうすることで、これらのタイプの問題のトラブルシューティングから当て推量を排除できます。どこから始めればよいかわからない場合は、より完全なガイドについて この記事 を参照してください。
特に、パフォーマンスカウンター_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 この問題とその解決方法についてさらに詳しく説明します。
データベースページがキャッシュに移動するとパフォーマンスが向上するため(ページの平均余命とバッファヒット率は時間とともに増加します)、最大メモリを(total_physical_mem-2GB)に設定しているため、通常、時間の経過に伴う速度低下の傾向は逆になります。
いくつかのクエリが原因で、SQL Serverが多くのことをページアウトおよびページインしているようです。 Resource Governor を試して大きなクエリと中程度のクエリのメモリ消費を制限し、アプリケーションクエリで常に十分なバッファを利用できるようにすることができます。