タイムアウトになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。ステートメントは終了されました


296

モバイルファイルのダウンロードサイトであるWebサイト(1日あたり20000〜60000)に多くのユーザーがいます。私のサーバー(windowsサーバー2008-R2)にリモートアクセスできます。以前に「サーバーが利用できません」というエラー
を受け取りましたが、接続タイムアウトエラーが表示されます。 私はこれに精通していません-なぜそれが発生し、どうすれば修正できますか?

完全なエラーは以下のとおりです。

「/」アプリケーションでのサーバーエラー。タイムアウトになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。ステートメントは終了されました。説明:現在のWebリクエストの実行中に未処理の例外が発生しました。エラーの詳細と、コードのどこで発生したかについては、スタックトレースを確認してください。

例外の詳細:System.Data.SqlClient.SqlException:タイムアウトの期限が切れました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。ステートメントは終了されました。

ソースエラー:

現在のWeb要求の実行中に未処理の例外が生成されました。例外の発生源と場所に関する情報は、以下の例外スタックトレースを使用して識別できます。

スタックトレース:

[SqlException(0x80131904):タイムアウトの期限が切れました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。ステートメントは終了しました。]
System.Data.SqlClient.SqlConnection.OnError(SqlException exception、Boolean breakConnection)+404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()+412
System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior 、SqlCommand cmdHandler、SqlDataReader dataStream、BulkCopySimpleResultSet bulkCopyHandler、TdsParserStateObject stateObj)+1363
System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds、RunBehavior runBehavior、String resetOptionsString)+6387741
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior runBehavior、Boolean returnStream、Boolean async)+6389442
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior runBehavior runBehavior runBehavior runBehavior 538 327 NovinMedia.Data.DbObject.RunProcedure(String storedProcName、IDataParameter []パラメータ、Int32&rowsAffected)+209 DataLayer.OnlineUsers.Update_SessionEnd_And_Online(Object Session_End、Boolean Online)+440
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result、String methodName、Boolean sendToPipe)+689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery()+


NiceFileExplorer.Global.Application_Start(Object sender、EventArgs e)+163

[HttpException(0x80004005):タイムアウトが発生しました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。ステートメントは終了しました。]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode(HttpContext context、HttpApplication app)+405205​​3
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext、HttpContext context、MethodInfo []ハンドラー)+191
System.Web.HttpApplication。 InitSpecial(HttpApplicationState状態、MethodInfo []ハンドラー、IntPtr appContext、HttpContextコンテキスト)+352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext、HttpContext context)+407
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)+375

[HttpException(0x80004005):タイムアウトが発生しました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。ステートメントは終了しました。]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context)+11686928 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context)+141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr、HttpContext context)+4863749


応答した後EDIT:
私のApplication_Start中には、Global.asax以下のようなものです:

protected void Application_Start(object sender, EventArgs e)
{
    Application["OnlineUsers"] = 0;

    OnlineUsers.Update_SessionEnd_And_Online(
        DateTime.Now,
        false);

    AddTask("DoStuff", 10);
}

呼び出されるストアドプロシージャは次のとおりです。

ALTER Procedure [dbo].[sp_OnlineUsers_Update_SessionEnd_And_Online]
    @Session_End datetime,
    @Online bit
As
Begin
    Update OnlineUsers
    SET
        [Session_End] = @Session_End,
        [Online] = @Online

End

オンラインユーザーを獲得するには2つの方法があります。

  1. を使用して Application["OnlineUsers"] = 0;
  2. データベースを使用する他の1つ

したがって、メソッド#2では、すべてのOnlineUsersをでリセットしApplication_Startます。そのテーブルには482,751を超えるレコードがあります。


1
ここで言うように、デフォルトは15秒です
V4Vendetta

1
根本原因分析を行う方が良いです。このような問題を引き起こす理由はさまざまです。最も基本的なのは、クエリの複雑な構造です。テーブルに16進値として保存されている画像をフェッチすると、同じ問題に直面しました。
Vijay Kumbhoje

上記の原因以外に、もう1つ追加します。ロックタイムアウト:docs.microsoft.com/en-us/sql/t-sql/statements/…このスレッドがロックを待機している時間が長すぎる場合、上記のドキュメント。
Herbert Yu

回答:


344

クエリに必要以上に時間がかかっているようです。スタックトレースとコードから、どのクエリであるかを正確に判別できるはずです。

このタイプのタイムアウトには3つの原因があります。

  1. どこかにデッドロックがあります
  2. データベースの統計情報やクエリプランキャッシュが正しくありません
  3. クエリが複雑すぎて調整する必要がある

デッドロックの修正は難しい場合がありますが、それが事実であるかどうかは簡単に判断できます。Sql Server Management Studioを使用してデータベースに接続します。左ペインでサーバーノードを右クリックし、[ アクティビティモニター ]を選択します。実行中のプロセスを見てください。通常、ほとんどはアイドル状態または実行中です。問題が発生すると、プロセスの状態によってブロックされたプロセスを特定できます。プロセスを右クリックして詳細を選択すると、プロセスによって実行された最後のクエリが表示されます。

2番目の問題により、データベースは次善のクエリプランを使用するようになります。統計をクリアすることで解決できます:

exec sp_updatestats

それがうまくいかない場合は、あなたも試すことができます

dbcc freeproccache

すべてのストアドプロシージャとクエリが最初に実行されたときに再コンパイルされるため、サーバーに大きな負荷がかかっている場合は一時的に大きなパフォーマンスヒットが発生するため、これを行わないでください。ただし、問題が発生することがあり、スタックトレースがアプリケーションの起動を示しているため、たまにしか実行されないクエリを実行していると思います。以前のクエリプランを再利用しないようにSQL Serverを強制することで、より良い結果が得られる場合があります。参照してくださいこの答えそれを行う方法の詳細については、を。

3番目の問題についてはすでに触れましたが、Sql Server Management Studioなどを使用して手動でクエリを実行することで、クエリのチューニングが必要かどうかを簡単に判断できます。クエリの完了に時間がかかりすぎる場合は、統計をリセットした後でも、おそらくそれを調整する必要があります。そのためには、新しい質問に正確なクエリを投稿する必要があります。


39
私はこれと同じエラーを抱えていましたが、「ちょうど」8秒かかったクエリで...そしてあなたのヒントはexec sp_updatestats私の問題を解決しました。どうもありがとう!
nrod 2013

2
このような問題を解決することは、タイムアウトや接続プールのサイズを調整することではほとんど問題になりません。あなたは飛び込み、根本的な原因を理解する必要があります。その根本原因を解決するのに助けが必要な場合は、独自の質問を投稿できます。
Marnix van Valen 14

5
これは確かにデッドロックではありません。過度のブロッキングが原因である可能性がありますが、デッドロックは1秒で解決され、異なるエラーが生成されます。これは過度のブロッキングである可能性がありますが、デッドロックではありません。
Michael J Swart 2015年

1
これはコマンドタイムアウトであり、接続タイムアウトではないのですか?「System.Data.SqlClient.SqlConnection.OnError」が接続の問題を示しています。
マイクW

1
@PrashantPimpale状況によって異なります生産で深刻な問題があり、誤った統計が不適切な実行計画を引き起こしている場合、はい、これは解決策になる可能性があります。例外的な問題(ハードウェア障害など)がなければ、統計を更新してもデータベースは壊れません。クエリが少し遅くなる可能性があります。結局のところ、それはあなたの呼び出しです。
Marnix van Valen

155

ストアドプロシージャを実行するコードでは、次のようになります。

SqlCommand c = new SqlCommand(...)
//...

このようなコード行を追加します。

c.CommandTimeout = 0;

これは、操作が完了するまで必要なだけ待機します。


143
また、0値がされていないことに注意する必要があります推奨0適応症制限なしの値を、コマンドを実行しようとする試みが無期限に待機しますので、CommandTimeoutので避けるべきです。コマンドにかかる時間を把握し、必要に応じてタイムアウト値を増やすことをお勧めします。
Otiel 2013年

7
私はOtielに同意し、あなたの答えに反対票を投じました:commandTimeoutを0に設定すると、応答していないデータベースサーバーから回復する機会がWebサーバーに与えられません。次に、デフォルトのタイムアウトに達したときは、原因を調べることを検討してください。ほとんどの場合、タイムアウト時間を長くするよりも、クエリを修正する方が適切です。
Maarten Kieft、2015年

10
私はそれを勧めないという罠にはまらないでしょう。これは、私と毎日のスケジュールされたタスクに非常に役立ちました。タイムアウトが無限であっても、何かがうまくいかなくてもプロセスが完了してエラーを返すことはありません。簡単に言うと、プロセスが完了するのに十分な時間が割り当てられていなかったため、後で問題が発生することなく、必要なときにいつでもクエリを完了することができるようになりました。また、マルチスレッドによってプログラムがロックされるのを回避することもできます。
WonderWorker 2015

2
はい、大規模なデータ転送を設定しない場合、これは意味がありません。数百万行を転送する場合、OtielとBlackHawkDesignが言っていることは意味がありません。
bluerubez 2015

データ中心の開発の20年間で、私はこれを行う必要がありませんでした。ほとんどの場合、パフォーマンスが向上し、単一のプロセスが1日中データベースを操作する機会を生み出さない、適度にシンプルなソリューションがあります。dbパフォーマンスの問題の大部分は、パフォーマンスが数桁速くなるように調整できます。つまり、完了までに3時間待っているプロセスは、おそらく3分または3秒に調整される可能性があります。
b_levitt

25

CommandTimeoutSQLコマンドのプロパティを設定して、長時間実行されるSQLトランザクションを許可できます。

タイムアウトの原因となっているSQLクエリを確認する必要がある場合もあります。


こんにちは、「またはタイムアウトを引き起こしているSQLクエリを確認する必要があります」-> SQL Server 2008で、タイムアウトを確認する必要がありますか?
SilverLight

スタックトレースがストアドプロシージャをポイントしているように見えるため、DataLayer.OnlineUsers.Update_SessionEnd_And_Onlineから呼び出されるストアドプロシージャをテストする必要がある場合があります。ライブデータベースのコピーをテストして、必要なパラメータを渡してストアドプロシージャを実行します。完了するまでに30秒以上かかる場合は、タイムアウトが発生します。SQL Server Management Studioにアクセスできることを前提としています。
Kev Ritchie

はい、私はSQL Server 2008にアクセスできます。
SilverLight

問題の原因となっているストアドプロシージャを見つけた場合は、データベースチューニングアドバイザを介してストアドプロシージャに含まれるクエリを実行できます。これにより、インデックスなどが必要かどうかが示され
Kev Ritchie

12

以前のすべての回答はこの問題に対応していますが、すべてのケースを網羅しているわけではありません。

Microsoftはこの問題を認識しており、サポートされているオペレーティングシステムについては2011年に修正されています。

Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)

.NETアセンブリの更新が必要になる場合があります。

この問題は、ミラーリングされたデータベースの接続再試行アルゴリズムのエラーが原因で発生します。

再試行アルゴリズムを使用すると、データプロバイダーは最初の読み取り(SniReadSync)呼び出しが完了するまで待機します。呼び出しはSQL Serverを実行しているバックエンドコンピューターに送信され、待機時間は接続タイムアウト値に0.08を掛けて計算されます。ただし、応答が遅い場合、および待機時間が経過する前に最初のSniReadSync呼び出しが完了しない場合、データプロバイダーは接続を誤った状態に設定します。

詳細については、KB 2605597を参照してください

https://support.microsoft.com/kb/2605597


9

多分それは誰かのために役立つでしょう。私は同じ問題に直面しましたが、私の場合、その理由は、SqlConnectionが開かれ、約2500回のループで呼び出したメソッドに配置されなかったためです。接続プールを使い果たしました。適切に廃棄することで問題は解決しました。


この!まさにこれ。私の問題は、それらを待たずに別のスレッドでメソッドを起動していたことでした(ユーザーがそのメソッドの結果、バックグラウンドスクリプトを必要としないため)。破棄せずに(usingブロックを使用して)、このタイムアウトの問題が発生します。これで解決したようです。
CularBytes 2015

接続プールの最大値に達したか、タイムアウトの期限が切れたときにタイムアウトエラーが発生しましたか?操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。最大プールに達したことを受け取った場合、リークされた接続を調べることは理にかなっているためです。しかし、私はサーバーが応答しないエラーを取得しています。
Jeeva Subburaj

8

私はそれと同じ問題に3日ほど取り組んだ。私たちのレコード数はそれほど多くないため、私たちの上級開発者は2つの画像と指紋をデータベースに保存しています。長い時間をかけてこの16進数値をフェッチしようとすると、約38秒でプロシージャを実行するための平均時間が計算されます。デフォルトのcommandtimeoutは30秒なので、ストアドプロシージャの実行に必要な平均時間よりも短いです。以下のようにコマンドタイムアウトを設定しました

cmd.CommandTimeout = 50

正常に機能しますが、クエリに50秒以上かかる場合も、同じエラーが表示されます。


8

CommandTimeout属性を設定する必要があります。CommandTimeout属性は、DbContext子クラスで設定できます。

public partial class StudentDatabaseEntities : DbContext
{
    public StudentDatabaseEntities()
        : base("name=StudentDatabaseEntities")
    {
        this.Database.CommandTimeout = 180;
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        throw new UnintentionalCodeFirstException();
    }

    public virtual DbSet<StudentDbTable> StudentDbTables { get; set; }
}

4

私は最近このエラーに遭遇し、簡単な調査の結果、データベースを保持するディスクのスペースが不足していることが原因であることがわかりました(1GB未満)。

データベースファイル(.mdfと.ldf)を同じサーバー上の別のディスク(容量が大きい)に移動するとすぐに、タイムアウトした同じページ(クエリを実行)が3秒以内に読み込まれました。

このエラーを解決する際に調査する必要があるもう1つのことは、データベースログファイルのサイズです。ログファイルを圧縮する必要があるだけかもしれません。


3

時間がかかるsp_fooでの大きな計算に問題があるので
、この小さなコードで修正しました

public partial class FooEntities : DbContext
{
   public FooEntities()
         : base("name=FooEntities")
    {
        this.Configuration.LazyLoadingEnabled = false;

        // Get the ObjectContext related to this DbContext
        var objectContext = (this as IObjectContextAdapter).ObjectContext;

        // Sets the command timeout for all the commands
        objectContext.CommandTimeout = 380;
    }

3

デフォルトのタイムアウトは15秒です。これを変更すると、0は無制限になり、他の数値は秒数になります。

コードで

using (SqlCommand sqlCmd = new SqlCommand(sqlQueryString, sqlConnection))
   {
      sqlCmd.CommandTimeout = 0; // 0 = give it as much time as it needs to complete
      ...
    }

Web.Configで、「Command Timeout = 0;」タイムアウトしない、または1時間(3600秒)以下

  <add name="ConnectionString" connectionString="Data Source=ServerName;User ID=UserName;Password=Password;Command Timeout=3600;" providerName="System.Data.SqlClient" />

2
これらは2つの異なるタイムアウトです。あなたの最初の提案は質問に対処します。2番目の方法は、接続プロバイダーがサポートする場合にのみ機能しますが、SqlClientはサポートしません。いずれにしても、タイムアウトを0にすることは、本番環境では決して良い考えではありません。通常のデフォルトは30秒です。
Suncat2000

2

@SilverLight ..これは明らかにDatabaseオブジェクトの問題です。これは、不適切に記述されたクエリ、または欠落しているインデックスの可能性があります。しかし、現時点では、データベースオブジェクトの問題を調査せずにタイムアウトを増やすことはお勧めしません

NovinMedia.Data.DbObject.RunProcedure(String storedProcName, IDataParameter[] parameters, Int32& rowsAffected) +209

このコード行にブレークポイントを設定してプロシージャ名を確認し、実行プランを確認してプロシージャを最適化します。

ストアドプロシージャの詳細を投稿するまで、私はこれ以上お手伝いできません。


ストアドプロシージャは、特別なことを行いません。ただし、プロシージャの実行中はOnlineUsersテーブルがロックされているようです。SQLプロファイラーを試して、Application_Startで何が起こっているかを確認してください
Amit Rai Sharma

2

試す

EXEC SP_CONFIGURE 'remote query timeout', 1800
reconfigure
EXEC sp_configure

EXEC SP_CONFIGURE 'show advanced options', 1
reconfigure
EXEC sp_configure

EXEC SP_CONFIGURE 'remote query timeout', 1800
reconfigure
EXEC sp_configure

次に、インデックスを再構築します


8
あなたの解決策を説明できますか?
Hp93

0

sqlCommand.CommandTimeoutプロパティで設定した時間よりもSQLクエリに時間がかかっているため、タイムアウトになりました。

明らかにCommandTimeoutを増やしてこの問題を解決できますが、その前にインデックスを追加してクエリを最適化する必要があります。実際の実行計画を含むSqlサーバー管理スタジオでクエリを実行するとSqlサーバー管理スタジオが適切なインデックスを提案します。ほとんどの場合、クエリを最適化できれば、タイムアウトの問題は解消されます。


0

TLDR

  1. アプリケーションとDBサーバーの両方を再起動することが、データ量、ネットワーク設定、コードが変更されていない場合の最も早い修正です。私たちは常にそうします
  2. 交換が必要なハードドライブの故障の指標となる場合があります-システム通知を確認してください

このエラーはさまざまな理由で頻繁に発生し、次のようなさまざまな解決策がありました。

  1. SqlBulkCopyを使用するようにコードをリファクタリングする
  2. さまざまな回答で述べられているように、または根本的な原因をチェックするように、タイムアウト値を増やします(データに関連しない場合があります
  3. 接続タイムアウト(デフォルト15秒)-終了する前にSQLサーバーとの接続が確立されるのを待つ時間-TCP / PORT関連- トラブルシューティングチェックリストを通過できます(MSDNの非常に便利な記事)
  4. コマンドタイムアウト(デフォルト30秒)-クエリの実行を待機する時間-クエリの実行/ネットワークトラフィックに関連- トラブルシューティングプロセスもあります(別の非常に便利なMSDN記事)
  5. サーバーの再起動-アプリケーションとDBサーバーの両方(個別の場合)-コードとデータが変更されていない場合、環境は変更されている必要があります-最初に行う必要があります。通常、パッチ(オペレーティングシステム、.Net FrameworkまたはSQL Serverのパッチまたは更新)が原因で発生します。特に、タイムアウト例外が次のように表示された場合(Azureを使用していない場合でも):
    • System.Data.Entity.Core.EntityException:一時的な障害が原因である可能性が高い例外が発生しました。SQL Azureデータベースに接続している場合は、SqlAzureExecutionStrategyの使用を検討してください。---> System.Data.Entity.Core.EntityCommandExecutionException:コマンド定義の実行中にエラーが発生しました。詳細については、内部の例外を参照してください。---> System.Data.SqlClient.SqlException:サーバーから結果を受信するときにトランスポートレベルのエラーが発生しました。(プロバイダー:TCPプロバイダー、エラー:0-セマフォタイムアウト期間が切れました。)---> System.ComponentModel.Win32Exception:セマフォタイムアウト期間が切れました

0

また、保留中のトランザクションがないことを確認してください。:)

私はいくつかのテストを行っていて、安全のためにトランザクションを開始しましたが、決してクローズしませんでした。エラーがもっとはっきりしているといいのですが、まあ!


0

私たちは苦労しましたTimeout expired/max pool reached Sqlexception。回避策として、サーバーまたはサービスの再起動を防ぐためにMAX SERVER MEMORY、SQL Serverで変数を変更します(SQL Managment StudioまたはT-SQLを使用)。

DECLARE @maxMem INT = 3000 --Max. memory for SQL Server instance in MB
EXEC sp_configure 'show advanced options', 1
RECONFIGURE

これにより、問題が再び発生するまで一時的に修正されます。私たちのケースでは、アプリレベルでの接続リークと関係があると考えられます。


0

最近、バグを含むSqlClientMicrosoft.Data.SqlClient)のNuGetバージョンにアップグレードしました。このバグは1.xサイクルの存続期間中に発生し、すでに修正されています。この修正は、この記事の執筆時点では利用できない2.0.0リリースで利用可能になります。プレビューが利用可能です。

詳細については、https//github.com/dotnet/SqlClient/issues/262をご覧ください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.