2011-01-18 17 views
2

私は、WebアプリケーションがSQLに例外タイムアウトを与えたことに気付きました。System.Data.SqlClient.SqlException:タイムアウトがタイムアウトしました

より多くのCPUを必要とするカップルストアドプロシージャをクリーンアップして、SQL Serverサービスを再起動し、アプリケーションが速くて遅れずに作業を開始しました。 3時間後にもう一度チェックして、例外タイムアウトが切れたときよりもページを読み込めませんでした。私はサーバーをチェックしましたCPUは問題ありません。私は同じのIIS 7の下にいくつかの他のウェブサイトを持っていて、例外なしでうまく動作します。 SQL Serverサービスをもう一度やり直し、アプリケーションを再び正常に戻しました。 SQLサーバーデータベースの問題のように思えますが、トラブルシューティングの方法がわかりません。

だから私は例外が発生するたびにSQLサービスを再起動しますが、もちろんそれは最善の方法ではありません。この問題を解決するのを手伝ってください。

ここに私が得た例外の一つがあります。

メッセージ: タイプ 'System.Web.HttpUnhandledException' の例外がスローされました。ソース:System.Web Inner 例外:System.Data.UpdateException: エントリの更新中にエラーが発生しました。詳細は のInnerExceptionを参照してください。 ---> System.Data.SqlClient.SqlException: タイムアウトが切れています。 操作の完了前にタイムアウト時間 が経過したか、サーバーが応答していません( )。ステートメントは 終了しました。 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarningで System.Data.SqlClient.SqlInternalConnection.OnErrorで System.Data.SqlClient.SqlConnection.OnError(SqlExceptionが 例外、ブールbreakConnection)(SqlExceptionが 例外、ブールbreakConnection)(で System.Data.SqlClient.SqlCommand.FinishExecuteReaderでSystem.Data.SqlClient.TdsParser.Run(runBehavior runBehavior、SqlCommandオブジェクトcmdHandler、 SqlDataReaderのデータストリーム、 BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj)でTdsParserStateObject stateObj)(SqlDataReaderの ds、Ru System.Data.SqlClient.SqlCommand.RunExecuteReaderTdsでnBehavior runBehavior、ストリング resetOptionsString)(たCommandBehavior cmdBehavior、RunBehavior runBehavior、 System.Data.SqlClient.SqlCommand.RunExecuteReader(たCommandBehavior cmdBehaviorでブールreturnStream、ブール非同期) 、 System.Data.SqlClient.SqlCommand.ExecuteNonQueryでSystem.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult 結果でrunBehavior runBehavior、 ブールreturnStream、文字列方法、 DbAsyncResult結果)、文字列methodNameの、ブール sendToPipe)() 、 System.Data.Mapping.Update.Internal.UpdateTranslatorでSystem.Data.Mapping.Update.Internal.DynamicUpdateCommand.Execute(UpdateTranslator 翻訳、EntityConnection 接続、辞書 generatedValues)。 System.DataでSystem.Data.Mapping.Update.Internal.UpdateTranslator.Updateで更新(IEntityStateManager のStateManager、IEntityAdapterアダプタ) ---内部例外スタックトレースの終わり---(IEntityStateManager のStateManager、IEntityAdapterアダプタ) BCSCDomain.Domain.DataLayer.OtherDataLayerでSystem.Data.Objects.ObjectContext.SaveChanges() でSystem.Data.Objects.ObjectContext.SaveChanges(ブール acceptChangesDuringSave)で.EntityClient.EntityAdapter.Update(IEntityStateManager entityCache) .UpdateHitCounter(Int32 hlistid、Int32 hcounterid): BuyCarandSellCar.UsedCarProfilePage.HitCoウンター() でBuyCarandSellCar.UsedCarProfilePage.Page_Load System.Web.Util.CalliHelper.EventArgFunctionCallerで(オブジェクト 送信者のEventArgs電子)(のIntPtr FP、オブジェクトOは、オブジェクトT、のEventArgs e)の System.Webので.Util.CalliEventHandlerDelegateProxy.Callback System.Web.UI.Control.LoadRecursive(AT System.Web.UI.Control.OnLoad(のEventArgs e)に(オブジェクト 送信者のEventArgs電子)) System.Webので 。 UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint、Boolean includeStagesAfterAsyncPoint)スタック トレース:a System.Web.UI.Page.ProcessRequest(ブール で System.Web.UI.Page.ProcessRequestMain(ブール includeStagesBeforeAsyncPoint、ブール のincludeStagesAfterAsyncPoint)でトン System.Web.UI.Page.HandleError(例外 E) System.Web.UI.Page.ProcessRequest(のHttpContext 文脈で System.Web.UI.Page.ProcessRequestWithNoAssert(のHttpContext コンテキスト)で System.Web.UI.Page.ProcessRequest()でincludeStagesBeforeAsyncPoint、ブール のincludeStagesAfterAsyncPoint) )at ASP.usedcarlistings_profilepage_aspx.ProcessRequest(HttpContext コンテキスト) はC:\ WINDOWS \ Microsoft.NET \ Frameworkの\ v2.0.50727の一時 ASP.NET ファイル\ルート\ 79794658 \ 835d6695 \ App_Web_kmrmpdbb.16.cs \: System.Web.HttpApplication.CallHandlerExecutionStepでライン 0。 System.Web.HttpApplication.IExecutionStep.Execute() でSystem.Web.HttpApplication.ExecuteStep(IExecutionStep ステップ、ブール& completedSynchronously)

答えて

0

は、漏洩行動のようですね。あなたの一般的なアーキテクチヤを知らないと、どんなリークが起こったのかはわかりませんが、あなたのテーブルをすべて見て、何か予想以上の行があるように見えることをお勧めします。

また、SQL Management Studioでsprocsを手動で実行して、どれが長くかかるのかを確認することもできます。実行時間が稼働時間とともに増加するアルゴリズムを実行している可能性があります。

+0

「あなたが予想しているよりも多くの行」とはどういう意味ですか? –

+0

私は、あなたのテーブルがどれだけ大きなものになっているかの直感的な感覚があるならば、あなたはそこで健全性チェックをすることができます。ストアドプロシージャを書くときには、テーブルが互いにどのように関係しているかを知ることができます。テーブルAへの挿入が常にテーブルBの挿入に対応することがわかっている場合は、 AとBが同じサイズであると合理的に期待するかもしれません。そうでなければ、それはバグの可能性のある指標です。 –

5

まず、問題を近づけているのは「UpdateHitCounter」ですが、これが原因であるかエフェクトであるかはわかりません。クエリが完了するために割り当てられた設定時間を超過しています。

パフォーマンスの低いデータベースがある場合は、実行することができます広範なストロークアプローチは、SQLプロファイラを添付し、結果に対してインデックスチューニングウィザードを実行することです。

さらに測定されたトリアージアプローチを使用する場合は、xが必要と思われるものを完了するまでにx秒以上かかるクエリのみをログに記録するようにプロファイラを制限できます。私は通常、5時に出発し、何も現れなければそこから仕事をします。 Hereは、その話題のプライマーです。

長時間実行されたクエリを特定したら、それらをローカルコピーで実行し、実行計画を調べます。 Hereはそのための初心者ですが、 "テーブルスキャン"の外観を開始します。

最終的には、データベースが最適でないか、ハードウェアがトラフィックにあまり影響しません。それはほぼ確実に最初のものであり、これらの2つのアプローチはあなたをあなたの道に導きます。

+0

ありがとうございました。少なくとも私はどこで問題を探し始めるかを知っています。 –

+0

それは面白いです。 HitCounter Updateクエリを削除したところ、別のクエリから同じエラーが発生し始めました。私は古いサーバー上に似たような問題はありませんでした。データベースは同じ、より多くのメモリ、何が間違っている可能性がありますか? –

+0

それは私が原因と結果について述べたことに戻ります...ヒットしたカウンタークエリーには本質的な問題はありませんでした。より直接的に言えば、別のクエリ(またはクエリ)はヒットカウンタが完了する前にすべてのリソースを消費しました。チェーン内の最も弱いリンクを修正してから次のリンクを公開するなど、クエリの問題点を特定するには、上記のトリアージアプローチを使用する必要があります。 –

関連する問題