Tiempo agotado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado

Tengo muchos usuarios en mi sitio web (20000-60000 por día), que es un sitio de descarga para archivos móviles. Tengo acceso remoto a mi servidor (Windows Server 2008-R2).
He recibido errores de “El servidor no está disponible” anteriormente, pero ahora veo un error de tiempo de espera de conexión.
No estoy familiarizado con esto, ¿por qué ocurre y cómo puedo solucionarlo?

El error completo está a continuación:

Error del servidor en la aplicación ‘/’. Tiempo agotado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado. Descripción: se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la stack para obtener más información sobre el error y dónde se originó en el código.

Detalles de la excepción: System.Data.SqlClient.SqlException: expiró el tiempo de espera. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado.

Error de fuente:

Se generó una excepción no controlada durante la ejecución de la solicitud web actual. La información sobre el origen y la ubicación de la excepción se puede identificar utilizando el seguimiento de stack de excepción a continuación.

Stack Trace:

[SqlException (0x80131904): el tiempo de espera expiró. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado.]
System.Data.SqlClient.SqlConnection.OnError (excepción SqlException, 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, Boolean returnStream, método String, resultado DbAsyncResult) +538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (Resultado de DbAsyncResult, String methodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
NovinMedia.Data.DbObject.RunProcedure (String storedProcName, IDataParameter [] parámetros, Int32 y rowsAffected) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (Object Sender, EventArgs e) +163

[HttpException (0x80004005): el tiempo de espera expiró. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContext context, aplicación HttpApplication) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, HttpContext context, MethodInfo [] manejadores) +191
System.Web.HttpApplication.InitSpecial (HttpApplicationState state, MethodInfo [] handlers, IntPtr appContext, HttpContext context) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, HttpContext context) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication (IntPtr appContext) +375

[HttpException (0x80004005): el tiempo de espera expiró. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La instrucción se ha terminado.]
System.Web.HttpRuntime.FirstRequestInit (contexto HttpContext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (contexto HttpContext) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, HttpContext context) +4863749


EDITAR DESPUÉS DE RESPUESTAS:
mi Application_Start en Global.asax es como a continuación:

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

El procedimiento almacenado que se llama es:

 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 

Tengo dos métodos para obtener usuarios en línea:

  1. usando la Application["OnlineUsers"] = 0;
  2. el otro usando la base de datos

Entonces, para el método n. ° 2 reinicié todos los OnlineUsers en Application_Start . Hay más de 482,751 registros en esa tabla.

Parece que tienes una consulta que está tardando más de lo que debería. Desde tu rastro de stack y tu código, deberías poder determinar exactamente qué consulta es esa.

Este tipo de tiempo de espera puede tener tres causas;

  1. Hay un punto muerto en algún lado
  2. Las estadísticas de la base de datos y / o el caché del plan de consulta son incorrectos
  3. La consulta es demasiado compleja y necesita ser ajustada

Un punto muerto puede ser difícil de solucionar, pero es fácil determinar si ese es el caso. Conéctese a su base de datos con Sql Server Management Studio. En el panel izquierdo, haga clic derecho en el nodo del servidor y seleccione Monitor de actividad . Eche un vistazo a los procesos en ejecución. Normalmente, la mayoría estará inactiva o funcionando. Cuando se produce el problema, puede identificar cualquier proceso bloqueado por el estado del proceso. Si hace clic derecho en el proceso y selecciona detalles , le mostrará la última consulta ejecutada por el proceso.

El segundo problema hará que la base de datos use un plan de consulta subóptimo. Se puede resolver borrando las estadísticas:

 exec sp_updatestats 

Si eso no funciona, también podrías probar

 dbcc freeproccache 

No debe hacer esto cuando su servidor tenga una gran carga, ya que sufrirá temporalmente un gran golpe de rendimiento, ya que todos los procesos almacenados y las consultas se vuelven a comstackr cuando se ejecutan por primera vez. Sin embargo, dado que usted declara que el problema ocurre a veces , y el seguimiento de la stack indica que su aplicación se está iniciando, creo que está ejecutando una consulta que solo se ejecuta ocasionalmente. Puede ser mejor forzando a SQL Server a no reutilizar un plan de consulta previo. Vea esta respuesta para detalles sobre cómo hacer eso.

Ya he abordado el tercer problema, pero puede determinar fácilmente si la consulta necesita ajuste al ejecutar la consulta manualmente, por ejemplo, utilizando Sql Server Management Studio. Si la consulta tarda demasiado en completarse, incluso después de restablecer las estadísticas, es probable que deba ajustarla. Para obtener ayuda con eso, debe publicar la consulta exacta en una nueva pregunta.

En su código donde ejecuta el procedimiento almacenado, debería tener algo como esto:

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

Agregue una línea de código de este tipo:

 c.CommandTimeout = 0; 

Esto esperará tanto tiempo como sea necesario para completar la operación.

Puede establecer la propiedad CommandTimeout del Comando SQL para permitir la transacción SQL de larga ejecución.

Es posible que también deba ver la consulta SQL que está causando el tiempo de espera.

Si bien todas las respuestas anteriores abordan el problema, no cubrieron todos los casos.

Microsoft reconoció el problema y lo corrigió en 2011 para los sistemas operativos admitidos, por lo que si obtiene el seguimiento de la stack como:

 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) 

es posible que deba actualizar sus ensamblajes .NET.

Este problema se produce debido a un error en el algoritmo de rebash de conexión para bases de datos duplicadas.

Cuando se utiliza el algoritmo de rebash, el proveedor de datos espera a que finalice la primera llamada de lectura (SniReadSync). La llamada se envía a la computadora de respaldo que ejecuta SQL Server, y el tiempo de espera se calcula multiplicando el valor de tiempo de espera de conexión por 0.08. Sin embargo, el proveedor de datos establece incorrectamente una conexión a un estado condenado si la respuesta es lenta y si la primera llamada SniReadSync no se completa antes de que expire el tiempo de espera.

Ver KB 2605597 para detalles

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

Tal vez sea útil para alguien. Enfrenté el mismo problema y en mi caso la razón fue que SqlConnection se abrió y no se eliminó en el método que llamé en bucle con aproximadamente 2500 iteraciones. El grupo de conexiones estaba agotado. La eliminación adecuada resolvió el problema.

Me enfrenté al mismo problema en el que trabajé alrededor de 3 días. Noté que como nuestra cantidad de registros no es mucha, nuestro desarrollador senior guarda 2 imágenes y huellas dactilares en la base de datos. Cuando trato de recuperar estos valores hexadecimales tarda mucho tiempo, calculo el tiempo promedio para ejecutar mi procedimiento es de alrededor de 38 segundos. El tiempo de comando predeterminado es de 30 segundos, por lo que es menor que el tiempo promedio requerido para ejecutar mi procedimiento almacenado. Configuré mi tiempo de comando como a continuación

 cmd.CommandTimeout = 50 

y funciona bien, pero a veces, si su consulta demora más de 50 segundos, generará el mismo error.

Debe establecer el atributo CommandTimeout. Puede establecer el atributo CommandTimeout en la clase secundaria 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; } } 

Me encontré con este error recientemente y después de una breve investigación, descubrí que la causa era que nos estábamos quedando sin espacio en el disco que contenía la base de datos (menos de 1GB).

Tan pronto como moví los archivos de la base de datos (.mdf y .ldf) a otro disco en el mismo servidor (con mucho más espacio), la misma página (ejecutando la consulta) que había agotado el tiempo de espera cargó en tres segundos.

Otra cosa para investigar, al tratar de resolver este error, es el tamaño de los archivos de registro de la base de datos. Sus archivos de registro pueden necesitar ser reducidos.

@SilverLight .. Este es claramente un problema con un objeto de base de datos. Puede ser una consulta mal escrita o faltan índices. Pero a partir de ahora, no le recomendaré que aumente el tiempo de espera sin investigar el problema con los objetos de la base de datos.

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

Ponga un punto de interrupción en esta línea de código para encontrar el nombre del procedimiento y luego optimice el procedimiento mirando su plan de ejecución.

No puedo ayudarlo más hasta el momento en que publique detalles sobre el procedimiento almacenado.

Tengo un problema con un gran cálculo en sp_foo que lleva mucho tiempo, así que lo arreglé
con este pequeño código de bit

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

tratar

 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 

luego reconstruye tu índice