Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell’operazione o il server non risponde. La dichiarazione è stata chiusa

Ho molti utenti sul mio sito web (20000-60000 al giorno), che è un sito di download per i file mobili. Ho accesso remoto al mio server (Windows Server 2008-R2).
Ho ricevuto errori “Server non disponibile” in precedenza, ma ora vedo un errore di timeout della connessione.
Non ho familiarità con questo – perché si verifica e come posso risolvere il problema?

L’errore completo è qui sotto:

Errore del server nell’applicazione ‘/’ Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell’operazione o il server non risponde. La dichiarazione è stata chiusa. Descrizione: si è verificata un’eccezione non gestita durante l’esecuzione della richiesta Web corrente. Si prega di rivedere la traccia dello stack per ulteriori informazioni sull’errore e sulla sua origine nel codice.

Dettagli eccezione: System.Data.SqlClient.SqlException: Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell’operazione o il server non risponde. La dichiarazione è stata chiusa.

Errore di origine:

Un’eccezione non gestita è stata generata durante l’esecuzione della richiesta web corrente. Le informazioni relative all’origine e alla posizione dell’eccezione possono essere identificate utilizzando la traccia dello stack di eccezioni di seguito.

Stack Trace:

[SqlException (0x80131904): Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell’operazione o il server non risponde. La dichiarazione è stata chiusa.]
System.Data.SqlClient.SqlConnection.OnError (eccezione SqlException, booleano 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, Boolean returnStream, String method, DbAsyncResult result) +538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResult result, String methodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
NovinMedia.Data.DbObject.RunProcedure (String storedProcName, Parametri IDataParameter [], Int32 e rowsAffected) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (Oggetto mittente, EventArgs e) +163

[HttpException (0x80004005): Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell’operazione o il server non risponde. La dichiarazione è stata chiusa.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (contesto HttpContext, app HttpApplication) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, contesto HttpContext, MethodInfo [] handler) +191
System.Web.HttpApplication.InitSpecial (stato HttpApplicationState, MethodInfo [] handler, IntPtr appContext, contesto HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, contesto HttpContext) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication (IntPtr appContext) +375

[HttpException (0x80004005): Timeout scaduto. Il periodo di timeout è trascorso prima del completamento dell’operazione o il server non risponde. La dichiarazione è stata chiusa.]
System.Web.HttpRuntime.FirstRequestInit (contesto HttpContext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (contesto HttpContext) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, contesto HttpContext) +4863749


MODIFICA DOPO LE RISPOSTE:
il mio Application_Start in Global.asax è come di seguito:

 protected void Application_Start(object sender, EventArgs e) { Application["OnlineUsers"] = 0; OnlineUsers.Update_SessionEnd_And_Online( DateTime.Now, false); AddTask("DoStuff", 10); } 

La procedura memorizzata chiamata è:

 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 

Ho due metodi per ottenere utenti online:

  1. using Application["OnlineUsers"] = 0;
  2. l’altro usando il database

Quindi, per il metodo # 2 ho resettato tutti gli utenti online a Application_Start . Ci sono oltre 482.751 record in quella tabella.

Sembra che tu abbia una query che impiega più tempo di quanto dovrebbe. Dalla traccia dello stack e dal codice, dovresti essere in grado di determinare esattamente quale query è.

Questo tipo di timeout può avere tre cause;

  1. C’è un deadlock da qualche parte
  2. Le statistiche del database e / o la cache del piano di query non sono corrette
  3. La query è troppo complessa e deve essere ottimizzata

Un deadlock può essere difficile da risolvere, ma è facile determinare se questo è il caso. Collegati al tuo database con Sql Server Management Studio. Nel riquadro sinistro, fare clic con il pulsante destro del mouse sul nodo del server e selezionare Monitoraggio attività . Dai un’occhiata ai processi in corso. Normalmente la maggior parte sarà intriggers o in esecuzione. Quando si verifica il problema, è ansible identificare qualsiasi processo bloccato dallo stato del processo. Se si fa clic con il tasto destro del mouse sul processo e si selezionano i dettagli , verrà visualizzata l’ultima query eseguita dal processo.

Il secondo problema farà sì che il database utilizzi un piano di query sub-ottimale. Può essere risolto cancellando le statistiche:

 exec sp_updatestats 

Se non funziona, potresti provare anche tu

 dbcc freeproccache 

Non dovresti farlo quando il tuo server è sotto carico pesante perché incorrerà temporaneamente in un grande colpo di performance dato che tutti i proc e le query memorizzati vengono ricompilati quando vengono eseguiti per la prima volta. Tuttavia, dal momento che si afferma che il problema si verifica a volte e la traccia dello stack indica che l’applicazione è in fase di avvio, penso che si stia eseguendo una query che viene eseguita solo occasionalmente. Potresti stare meglio costringendo SQL Server a non riutilizzare un piano di query precedente. Vedi questa risposta per i dettagli su come farlo.

Ho già toccato il terzo numero, ma è ansible determinare facilmente se la query necessita di essere eseguita eseguendo manualmente la query, ad esempio utilizzando Sql Server Management Studio. Se la query impiega troppo tempo per essere completata, anche dopo aver ripristinato le statistiche, probabilmente dovrai regolarla. Per aiuto, dovresti pubblicare la query esatta in una nuova domanda.

Nel codice in cui esegui la procedura memorizzata dovresti avere qualcosa del genere:

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

Aggiungi una riga di codice simile:

 c.CommandTimeout = 0; 

Ciò attenderà tutto il tempo necessario per completare l’operazione.

È ansible impostare la proprietà CommandTimeout del comando SQL per consentire la transazione SQL con esecuzione prolungata.

Potrebbe anche essere necessario esaminare la query SQL che causa il timeout.

Mentre tutte le risposte precedenti affrontano il problema, non coprivano tutti i casi.

Microsoft ha riconosciuto il problema e risolto nel 2011 per i sistemi operativi supportati, quindi se si ottiene lo stack trace come:

 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) 

potrebbe essere necessario aggiornare gli assembly .NET.

Questo problema si verifica a causa di un errore nell’algoritmo connection-retry per i database con mirroring.

Quando viene utilizzato l’algoritmo retry, il fornitore di dati attende la prima chiamata di lettura (SniReadSync) per terminare. La chiamata viene inviata al computer di back-end che esegue SQL Server e il tempo di attesa viene calcolato moltiplicando il valore di timeout della connessione di 0,08. Tuttavia, il provider di dati imposta erroneamente una connessione a uno stato destinato a mancare se una risposta è lenta e se la prima chiamata SniReadSync non viene completata prima della scadenza del tempo di attesa.

Vedi KB 2605597 per i dettagli

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

Forse sarà utile per qualcuno. Ho affrontato lo stesso problema e nel mio caso il motivo era che SqlConnection era aperto e non disposto nel metodo che ho chiamato in loop con circa 2500 iterazioni. Il pool di connessione era esaurito. Lo smaltimento corretto ha risolto il problema.

Ho affrontato lo stesso problema lavorato su di esso circa 3 giorni. Ho notato come il nostro numero di record non è tanto il nostro sviluppatore senior mantiene 2 immagini e impronte digitali nel database. Quando provo a recuperare questi valori esadecimali, ci vuole molto tempo, calcolo il tempo medio per eseguire la mia procedura di circa 38 secondi. Il timeout di comando predefinito è 30 secondi, quindi è necessario meno del tempo medio necessario per eseguire la stored procedure. Ho impostato il mio comando timeout come di seguito

 cmd.CommandTimeout = 50 

e funziona bene, ma a volte se la query richiede più di 50 secondi, verrà visualizzato lo stesso errore.

Devi impostare l’attributo CommandTimeout. È ansible impostare l’attributo CommandTimeout nella class figlio 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 StudentDbTables { get; set; } } 

Recentemente ho riscontrato questo errore e, dopo alcune brevi indagini, ho scoperto che stavamo esaurendo lo spazio sul disco contenente il database (meno di 1 GB).

Non appena ho spostato i file del database (.mdf e .ldf) su un altro disco sullo stesso server (con molto più spazio), la stessa pagina (eseguendo la query) che era scaduta veniva caricata entro tre secondi.

Un’altra cosa su cui indagare, nel tentativo di risolvere questo errore, è la dimensione dei file di registro del database. Potrebbe essere necessario ridurre i file di registro.

@ Silverlight. Questo è chiaramente un problema con un object Database. Può essere una query scritta male o indici mancanti. Ma per ora non ti suggerisco di aumentare il timeout senza indagare sul problema con gli oggetti del tuo Database

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

Inserire un punto di interruzione su questa riga di codice per trovare il nome della procedura e quindi ottimizzare la procedura osservando il suo piano di esecuzione.

Non posso aiutarti di più fino al momento della pubblicazione dei dettagli sulla stored procedure.

Ho problemi con il calcolo di grandi dimensioni in sp_foo che richiedono molto tempo e quindi ho risolto
con questo piccolo bit di codice

 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; } 

provare

 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 

quindi ricostruisci il tuo indice