web-dev-qa-db-ja.com

インスタンスのパフォーマンスを維持するために定期的な再起動が必要なのはなぜですか?

SQL 2005には運用用のDBサーバーがあります。しばらくの間すべてが正常に動作しますが、数週間後、パフォーマンスが著しく低下します。 SQL Serverを再起動するだけで、パフォーマンスが通常に戻ります。

背景:

  • 1200を超えるデータベースの実行(ほとんどが単一テナント、一部のマルチテナント)。マルチテナントへの移行について講義する前に、この構造を維持する正当な理由があります......
  • RAMは16 GBです。再起動後、SQL Serverが15 GBの使用量に戻るのにそれほど時間がかかりません。
  • アクティブなDB接続は約80接続です-プロセスごとにWebサーバーごとに1つの接続プールがあることを考えると、これはかなり健全であると感じているため、接続リークの問題はありません。

非ピーク時にいくつかのことを試みました。-DBCC DROPCLEANBUFFERSを(CHECKPOINTを指定して)実行して、データキャッシュをクリアします。これは効果がなく、RAMの使用法)をクリアしません。 -FREEPROCCACHEおよびFREESYSTEMCACHEを実行して、クエリプランとストアドプロシージャキャッシュをクリアします。無効。

SQL Serverの再起動は、アクティブな運用環境では理想的ではありません。何か不足しています。他の誰かがこれを経験しますか?

更新:2012年4月28日まだこの問題と闘っています。 OSとの競合を排除するために、SQL Serverのメモリを10 GBに減らしました。絞り込みに近づきつつありますが、次のステップからの支援が必要です。

SQL Serverを再起動すると、ページファイルが12.3 GBから12.5 GBの間で停止します。それは数日間そのままです。合計サーバースレッドは850から930の間でハングアップします-安定していて、何日間も一貫しています(sqlserverは、トラフィックに応じて55から85の間で安定しています)。

次に「イベント」があります。イベントが何であるかわかりません。ログに表示されません。また、曜日や時間に一貫性のあるものは何も表示されませんが、ページファイルが突然14.1または14.2にジャンプします。 GB、スレッドは1750から1785にジャンプします。

これが発生したときにパフォーマンスをチェックすると、これらのスレッドのうち900以上がsqlserverです。だから私はこれらのスレッドがどこから来ているのかを確認するためにsp_who2に行きます...そして使用された80程度のdb接続があります。

それで... SQLサーバー上のこれらの900スレッドの残りがどこにあるのか、そして彼らが何をしているのかを私がどのように見つけることができるか誰かが何か考えを持っていますか?

更新:2012年6月1日まだ問題と闘っています。まだこれを読んでいる人のために、スレッドが跳ね上がる問題は解決されました。これは、自動化されたComVaultバックアップソフトウェアが原因でした。これは、現在のデータベースをバックアップするだけではなく、もはや存在しないデータベース(以前のデータベースのリストを維持していた)をバックアップしようとするスレッドを作成していました。

しかし-問題はまだ残っており、私たちは毎週再起動し、与えるか数日かかる必要があります。 Rackspaceチームと協力して、光を当てることができるかどうかを確認します。

22
PaulJ

あなたはすべてが順調であると言い、それから数週間後、パフォーマンスは低下します。 (通常、パフォーマンスは急速に、または特定の時間に、または一見ランダムな間隔で低下すると言われています。これは、I/Oパフォーマンスの低下、ロックストーム、または奇妙な時間に実行されるCPU集中型クエリ、または重いジョブのスケジュール、またはインデックス作成や統計の不良により、CPUを集中的に使用するクエリやディスクの読み取りが発生します。

私の仮説は、サーバー上の別のアプリケーションがメモリをリークしているというものです。私はこれをウイルスソフトウェア(DBAのお気に入りのサーバーソフトウェアの悪役)とサードパーティの監視ソフトウェアで見ました。 SQL Serverのメモリ使用量を時間の経過とともに再確認し、他のすべてのアプリケーションのメモリ使用量もすべて取得します。 SQL Serverのメモリ使用量にハード制限を設定し、ページングを許可しないように設定している場合、他のアプリがページアウトしてI/O容量を使い果たしている可能性があります。

探すのは難しくありません。サーバーにメトリックをまだ保持していない場合は、Perfmonを起動して、30分または60分ごとにサンプルを取得します。数日後、別のアプリケーションのメモリ使用量が増加する場合があります。

SQL Serverログに「SQLサーバーの重要な部分がページアウトされました」というエラーメッセージがありますか?それも大きな手がかりになるでしょう。

7
darin strait

RAM)が16 GBだけのSQLサーバーの単一インスタンスで1200 DBを実行でき、2週間のスムーズな実行後にこれらの種類の問題のみが発生することを祝福します。地元のパスの章で伝える物語。

RAMはSQLとOSの両方で16 GBです。最大メモリ設定が15 GBまたは最大であると想定しています。これにより、バッファプールがすべて使い果たされる可能性がありますメモリとOSを制限します。バッファプールとキャッシュをクリアしても違いはなく、PLEが300を超えていると言っています。これはメモリのボトルネックを証明します。CPUとIOサーバー上(仕様/統計)?

select * from sys.dm_exec_request where session_id>50 and session_id<>@@spidを実行し、表示されるリソースの競合を確認します(wait_type、wait_time、last_wait_type、wait_resource)。

5
StanleyJohns

1200データベース、OS、およびおそらく他のものええ、私はサーバー自体が機能するために1 GBを超えるRAMを必要とすると思います。特に、SQL Serverの最大メモリ設定として15 GBを設定した場合、15 GB以外に追加のメモリが必要であることを特に考慮します。スレッド用。

SQL Serverを14 GBに減らして、サーバーに少し余裕を持たせます。

また、16 GBのRAMを備えたサードパーティのバックアップユーティリティを備えたSQL Server 2008 x64システムでのメモリ許容量については、「Professional SQL Server 2008 Internals and Troubleshooting」に示されている例を次に示します。

  • Windowsの場合は2 GB
  • ワーカースレッド用に1GB
  • MPAなどの場合は1GB.
  • バックアッププログラム用に1 GB
  • SQL Server用に11GB

この本では、スレッドの最大数を決定する方法、およびスレッドが使用するメモリ量を計算する方法を示しています。これを実行して(サーバーに合わせてサーバーの種類を変更)、スレッドに必要なメモリの量を把握します。

declare @servertype int

set @servertype=1
/*
1: x86 (32-bit)
2: x64 (64-bit)
3: IA64

*/

select max_workers_count *
    (
        case @servertype when 1 then .5
            when 2 then 2
            when 3 then 4
            else .5
        end
    )
from sys.dm_os_sys_info
5
DForck42

データベースメモリがすべてのデータベースに均等に分散されている場合、各データベースのメモリは12.8メガ(15 * 1024)/1200=12.8です。より多くのメモリが必要です。

パフォーマンスが低下している理由を調べる必要があります。ロック、ブロックなどが発生していますか?待機統計はどのように見えますか?

4
mrdenny

DBCCコマンドはメモリバッファーをクリアするだけで、OSにメモリを解放しません。

SQL Serverが実際にメモリを消費していることを知っていますか? Perfmonセッションのセットアップを確認するか、再起動後にDMV情報の収集を開始して、SQL Serverが何を実行しているかを調べることをお勧めします。また、収集時間中にユーザーが通常より多くの作業(月末処理など)を行っている場合にも注意してください。同じサーバーでSSRS、SSIS、またはSSASを実行していますか?

システムに1200個のデータベースがありますが、DBの最大サイズはいくつですか?

3
user507