6

400個のWebアプリケーション(30個のアプリケーションプールに分散)をホストするIISWebサーバーがあります。これらは、ASP.NETアプリケーションとWCFサービスのエンドポイントの両方です。サーバーには32GBのRAMがあり、通常は高速で実行されています。95%のメモリ使用量で実行されていますが。ワーカープロセスはそれぞれ500MBから1.5GBのRAMを使用します。

SQLServerを実行している別のボックスもあります。あれにはたくさんの空きメモリがあります。

時々、WebサーバーはSQLタイムアウト例外をスローし始めます。最初は1分あたり数回でしたが、1分あたり数百回に急速に増加しました。効果的にサーバーをダウンさせます。この問題は、すべてのプールのアプリケーションに影響します。一部のリクエストはまだ完了していますが、ほとんどのリクエストは完了していません。これが発生している間、サーバーのCPU使用率は約30%です(これはそのボックスの通常の負荷です)。

これが発生している間も、SQL Server Management Studio(IISサーバーから)を使用して、要求を正常に(そして高速に)実行できます。

修正はIISを再起動することです。そして、次回まですべてが正常に戻ります。

サーバーは非常に少ないメモリで実行されているため、これが原因のように感じます。しかし、メモリ不足とSQLタイムアウト例外の突然のバーストとの関係を説明することはできません。

何か案が?

4

3 に答える 3

7

メモリの負荷により、ページングとガベージコレクションがトリガーされる可能性があります。どちらも、他の方法では存在しないレイテンシーをもたらします。

32GBのデータをGCするのに数秒かかる場合があります。すべてのアプリが同時にGCを処理するのはなぜですか?約95%のメモリ使用率で、WindowsはCLRがリッスンする「低メモリ」イベントを設定するためです。他のプロセスを支援するためにメモリを解放しようとします。

アプリケーションがページング狂乱に陥った場合、それは通常の実行の大幅な遅延も説明します。

ただし、これは推測にすぎません。「ハードページフォールト/秒」カウンターを見て、それを証明してみることができます。「フルGC」または「Gen2GC」のカウンターも必要です。

修正は、物理メモリ制限に対してより高いマージンで実行されます。

于 2013-01-18T17:47:13.417 に答える
0

SqlCommand.CommandTimeout

このプロパティは、コマンドの実行中または結果の処理中のすべてのネットワーク読み取りの累積タイムアウトです。タイムアウトは、最初の行が返された後も発生する可能性があり、ユーザー処理時間は含まれず、ネットワーク読み取り時間のみが含まれます。

これはクライアントベースのタイムアウトです。メモリの制約のためにキューに入れられている場合は、タイムアウトが発生する可能性があります。

これらのクエリから大量のデータを取得していますか?

一部のクエリが大量のデータを返す場合は、それらを分割して、ユーザーに次の前のボタンを表示することを検討してください。

BeginExecuteReaderのような非同期を検討しましたか?
利点はタイムアウトがないことです。
呼び出し元のスレッドは解放されません。

isExecutingFTSindexWordOnce = true;
sqlCmdFTSindexWordOnce.BeginExecuteNonQuery(callbackFTSindexWordOnce, sqlCmdFTSindexWordOnce);
// isExecutingFTSindexWordOnce set to false in the callback
Debug.WriteLine("Calling thread active");

ただし、応答が呼び出し元のスレッドに戻らないため、要求への応答方法についてのコメントに同意します。
申し訳ありませんが、コールバック時にパブリックプロパティを更新するだけのWPFに慣れています。

于 2013-01-15T22:14:02.280 に答える
0

最初の問題は、タイムアウトが発生している場所を見つけることです。データベースに対してリクエストを実行するとき、またはデータベースに接続するときにタイムアウトが発生しているかどうかをスタックトレースから判断できますか?(またはWebサーバーに接続することもできますか?)

データベース要求の実行のタイムアウトは、さまざまな原因で発生する可能性があります。問題は、ブロッキングプロセス、データベースメンテナンス(ロックも)、デッドロックなどのデータベースにある可能性があります。アプリの実行速度が遅い場合、sys.dm_exec_requestsに多くのエントリが表示されますか?その場合、それらのwait_typesは何ですか?

WebサーバーがタイムアウトしているときにクエリウィンドウでSQLを実行できたとしても、大規模なブロッキングやデッドロックが発生していないわけではありません。

データベースへの接続がタイムアウトしている場合は、ADO接続プールがいっぱいになってクリーンアップされていないか、データベースに接続制限があり、Webサービスが接続を待機してタイムアウトしている可能性があります。

何が起こっているのかを知る最良の方法の1つは、w3wp.exeプロセスのメモリダンプをキャプチャして分析することです。WinDbgのようなデバッガーに精通していない場合でも、MicrosoftのDebugDiagツールは、役立つ情報を含むいくつかの優れたレポートを生成できます。

于 2013-01-18T17:55:04.040 に答える