web-dev-qa-db-ja.com

SQL Serverは、割り当てられたメモリより多くを占有します。メモリリークの可能性

SQL Server 2012 64ビットの使用(v11.0.6020.0-2012 SP3)

以下はシナリオです:

本番環境では、32 GB DDR3 RAMがインストールされています:

enter image description here

SQLサーバーで最大メモリ制限が16 GB、つまり50%の容量に設定されています。

enter image description here

タスクマネージャーを起動してメモリの値を確認すると、16 GBと表示されます。

enter image description here

しかし、パーセンテージが占めるメモリを選択すると、80%〜85%と表示されますが、これは正しくありません。

enter image description here

これは、95%を超えて、

  1. システム全体が遅くなります
  2. クエリはタイムアウトになります

これを修正する唯一の方法はサーバーの再起動です

私の質問は

  1. SQL Serverはメモリをリークしていますか?
  2. すぐに修正できるので、再起動する必要はありませんか?
  3. 恒久的な解決?
5
Sunny

私の質問は、SQL Serverがメモリをリークしていますか?

ほとんどありませんが、SQL Server 2012 SP4をできるだけ早く計画する必要があります。過去の経験から、SQL ServerとSSASやSSRSなどの他のアプリケーションはすべて同じマシンで実行されているため、SQL Serverはメモリ不足に直面している可能性があり、SSAS/RSの場合もそうであると言えます。私はこのようなシステムをたくさん見てきましたが、すべてはメモリのプレッシャーに帰着します。

32GのRAMがあり、SQL Serverに16Gを与えただけで20Gになり、これが役立つかどうかを確認します。メモリを追加すると、間違いなく役立ちます。

クエリがタイムアウトする理由はたくさんありますが、 SQL Serverのパフォーマンスの問題のトラブルシューティング は、その根本的な原因を見つけるのに役立ちます。

しかし、パーセンテージが占めるメモリを選択すると、80%〜85%と表示されますが、これは正しくありません。

最初に、タスクマネージャーはSQL Serverのメモリ消費量を測定するのに適切な場所ではないと言いますが、SQL Serverサービスアカウントに Locked Pages in Memory(LPIM)特権 がある場合、正しい値はわかりません。これは通常、タスクマネージャーがページング可能でVirtualAlloc()関数を介して割り当てられるプロセスプライベートバイトメモリを追跡しますが、メモリ割り当てのLPIMチャンクは非ページング可能であるAWE APIによって実行されるため、タスクマネージャーはそれを追跡せず、これにより誤った結果になる可能性があるためです値。あなたが探しているもののパーセンテージは実際にはPercentage of Process Private bytes完全なメモリではなく、関連情報も提供されていないので、見ないでください。

SQL Serverが割り当てられたメモリを利用し、SQL Serverが使用している物理メモリの量を知ることはごく普通のことです。クエリを使用してください

select * from sys.dm_os_process_memory

PS:他のアプリケーションを(可能な場合は)別のマシンに移動し、SQL Serverを自分のシステムでのみ実行できるようにすることを常にお勧めします。これにより、SQL Serverの実行がより速く、より良くなります。

5
Shanky

答えは KB記事 で詳しく説明されています。

SQL Server 2012以降のバージョンでは、最大サーバーメモリ設定で指定された値よりも多くのメモリが割り当てられる場合があります。この現象は、合計サーバーメモリ(KB)値が既にターゲットサーバーメモリ(KB)設定(最大サーバーメモリで指定)に達している場合に発生することがあります。メモリの断片化のために、マルチページメモリ要求(8 KB以上)の要求を満たすのに十分な連続した空きメモリがない場合、SQL Serverはメモリ要求を拒否する代わりにオーバーコミットを実行できます。

バグやメモリリークを発見したよりも、この問題が発生している可能性が高くなります。

他の投稿された回答のアドバイスに従う必要があります。SP4を適用し、コアごとに数千ドルを支払うSQL Serverボックスに積み重ねる他のアプリとコンポーネントについてより慎重に考えてください。

3
Erik Darling

いいえこれは正常です。データベースサーバーにインストールされているアプリケーションが多すぎます。データベース(SQL Serverデータベースエンジン)を独自のサーバーに移行するか、データベースサーバー内の他のすべてのアプリケーションのアンインストールを開始します。

現在、サーバーには次のものが含まれています:IISRSASISmongodbがインストールされています。監視ツールまたはアンチウイルスがインストールされている場合は、言うまでもありません。サーバーにログインすると、メモリも使用されます。フィルタードライバーもメモリを使用します。

Jonathan によるこのブログ投稿をチェックしてください。たとえば、ベアボーンデータベースサーバーを使用していて(他のアプリケーションがインストールされていて、メモリを争っていない場合)、SQL Server用に少なくとも27GBのメモリを使用できます。

1
user37701