2009-03-28 13 views
1

これはかなり漠然とした質問であり、それに答えるのは長時間のようだが、何をすべきかわからない。私のウェブサイトは常にフリーズしていますか?

私は自分のウェブサイトを毎日生きて以来、それはちょうど凍りつくでしょう。リンクをクリックすると、ブラウザは接続しようとしているように見えます。凍結は2分ほど続く可能性があると思われ、その後はすべて正常です。それから少し後に、それは同じことをするでしょう。

ウェブサイトで発生したすべての例外をログファイルで追跡します。

私はタイムアウトの期限が切れこれらのかなり..

を取得します。操作が完了する前にタイムアウト時間が経過しているか、サーバーが応答していません。

そして、スタックトレースによって、データベースに接続しているメソッドが表示されます。

私はフリーズがこのタイムアウトの問題と関係があると仮定しています。私のウェブサイトは共有サーバー上でホストされており、私のデータベースは約10億の他のデータベースも持つ他のサーバー上にあります。

共有サーバー上であっても、このフリーズの問題は常に発生します。非常に迷惑な。私のサイトは電子商取引に基づいており、人々はそのサイトで取引を行っていると考えると、これはかなり致命的な問題であることがわかります。私が最後に望むのは、サイトがフリーズしているため、ユーザーが「支払いを送信」ボタンを押すと、サイトが凍結したために支払いの送信ボタンが何度も繰り返し表示されます。

誰もがこれを処理するための最良の方法についての提案はありますか?

+0

私は二重と三重にチェックして、私の接続が正しく廃棄されていることを確認しました。興味深いのは、以前にログに記録されていた例外が停止していますが、まだフリーズが残っていることです。何が起こっているのかわからない。それはガベージコレクターが蹴り込むことができますか? – hanesjw

答えて

2

タイムアウトが切れています。操作が完了する前にタイムアウト時間が経過しているか、サーバーが応答していません。

これはSqlコマンドのタイムアウト例外です。データベースが負荷を受けている場合は多少の場合があります。 SqlConnectionsとSqlCommandsを処理していることを確認してください。通常はプールタイムアウト例外が発生します(接続プールから接続を取得できません)。

確率は、です。誰かは、ひどく調整された、または他の方法でリソースを吸うクエリを実行しています。それはあなたのサイトかもしれませんが、あなたが共有DBサーバ上にいるので、他の誰かと同じように簡単にそれを行うことができます。また、トランザクションをブロックすることも、トランザクションを開くこともできます。これらはデータベース上にあるため、コーディングの問題になります。おそらく、ホスティングプロバイダを追跡して、専用のdbサーバに移動する必要があるでしょう。

SqlCommandsのCommandTimeoutを減らすことができます。私は多少直感的に聞こえるが、それはサーバーに負荷をかける60秒間の試行より早く失敗する方が早いことがよくあることがよくあります。 .5秒のクエリが5秒で完了しない場合は、60秒以内にクエリが実行されない可能性があります。

患者タイプの場合は、CommandTimeoutを増やすこともできますが、IISタイムアウトが90秒になりすぎて、あまりにもバンプすると修正する必要があります。

4

私はそれがデータベース接続と関係していると推測しています。彼らが適切にリリースされていることを確認しますか?そうでなければ、それはそれらをすべて使います。

データベースに接続プールが構成されているかどうかを確認してください。

+1

+1を不適切にクローズしても、クエリー/インデックスを分析してキャッシュカバレッジを向上させることができます。 – Mufaka

+1

プール接続が不足すると、一般的なタイムアウトだけでなく、プールから特定のエラーが発生します。 http://blogs.msdn.com/angelsb/archive/2004/08/25/220333.aspx –

1

タイムアウトエラーは間違いなくフリーズページのソースです。それが起こると、ページはエラーメッセージを返す前に、データベース接続のための何分かのようなものを待機します。 Webサーバーは各ユーザーから一度に1ページしか処理しないため、タイムアウトエラーが発生するまでサイト全体がユーザーのために固定されているように見えます。たとえそれがほんの少しのユーザーのために起こっても、1分間ほどサイトにアクセスすることができないため、非常に厳しいように見えます。

問題の深刻度は、取得するエラーの数によって異なります。あなたの説明から、普通になるにはあまりにも多くのように聞こえるように聞こえる。

接続を開いたままにしないように、すべてのデータリーダー、コマンドオブジェクト、および接続オブジェクトが適切に配置されていることを確認してください。

タイムアウトが発生する可能性があるため、ログ内のデッドロックエラーも探します。お互いにロックするクエリがある場合は、テーブルを使用する順序を変更してクエリを改善できます。

1

特にデッドロックのSQL Serverログを確認します。

複数の接続が開いている場合、ある接続が他の接続でロックされている行を待っている可能性があります。

+1

を参照してください。SQLデッドロックが「System.Data.SqlClient.SqlException:Transaction(プロセスID 73)がデッドロックされました」のように表示される他のプロセスとリソースをロックし、デッドロックの被害者として選択されました。トランザクションを再実行してください。 –

+0

デッドロックタイムアウトがクエリまたはWebページのタイムアウトよりも短い場合にのみ、デッドロックエラーが表示されます。それはしばしばそうではありません(少なくとも私が維持しているウェブサイトでは)。 – Andomar

関連する問題