Tengo muchos usuarios en mi sitio web (20000-60000 por día), que es un sitio de descarga de archivos móviles. Tengo acceso remoto a mi servidor (Windows Server 2008-R2).
He recibido errores de "El servidor no está disponible" antes, 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á abajo:
Error del servidor en la aplicación '/'. Tiempo agotado. El 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 pila 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: Tiempo de espera expirado. El 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 la pila de excepciones a continuación.
Seguimiento de pila:
[SqlException (0x80131904): Tiempo de espera expirado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La declaración ha finalizado.]
System.Data.SqlClient.SqlConnection.OnError (excepción SqlException, boolean breakConnection) +404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () +412
System.Data.SqlClient.TdsParser.RunBehader. , SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReder,
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, runBehavior runBehavior, Boolean returnStream, async Boolean) 6389442
System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, runBehavior runBehavior, Boolean returnStream, método de cadena, resultado DbAsyncResult) + 538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (DbAsyncResult result, String methodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
NovinMedia.Data.DbProcea.rec. , Int32 & rowsAffected) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (remitente de objetos, EventArgs e) +163[HttpException (0x80004005): Tiempo de espera expirado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La declaración ha sido terminada.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContext context, HttpApplication app) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtrp.Contexto
. Http . InitSpecial (estado HttpApplicationState, manejadores MethodInfo [], IntPtr appContext, contexto HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, HttpContext context) +407
System.Web.HittingApp.[HttpException (0x80004005): Tiempo de espera expirado. El período de tiempo de espera transcurrido antes de la finalización de la operación o el servidor no responde. La declaración ha sido terminada.]
System.Web.HttpRuntime.FirstRequestInit (contexto HttpContext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (HttpContext context) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate (I36)
Edición después 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:
- utilizando
Application["OnlineUsers"] = 0;
- el otro usando la base de datos
Entonces, para el método # 2 reinicio todos los usuarios en línea en Application_Start
. Hay más de 482,751 registros en esa tabla.
fuente
Respuestas:
Parece que tiene una consulta que tarda más de lo debido. A partir de su seguimiento de pila y su código, debería poder determinar exactamente qué consulta es.
Este tipo de tiempo de espera puede tener tres causas;
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 con el botón derecho en el nodo del servidor y seleccione Monitor de actividad . Echa un vistazo a los procesos en ejecución. Normalmente la mayoría estará inactiva o en ejecución. 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:
Si eso no funciona, también puedes intentar
No debe hacer esto cuando su servidor está bajo una carga pesada porque incurrirá temporalmente en un gran golpe de rendimiento ya que todos los procesos y consultas almacenados se vuelven a compilar cuando se ejecutan por primera vez. Sin embargo, como usted indica que el problema ocurre a veces , y el seguimiento de la pila indica que su aplicación se está iniciando, creo que está ejecutando una consulta que solo se ejecuta ocasionalmente. Es mejor que obligue a SQL Server a no reutilizar un plan de consulta anterior. Consulte esta respuesta para obtener detalles sobre cómo hacerlo.
Ya he tocado el tercer problema, pero puede determinar fácilmente si la consulta necesita ajustes ejecutando 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, probablemente deba ajustarla. Para obtener ayuda con eso, debe publicar la consulta exacta en una nueva pregunta.
fuente
exec sp_updatestats
problema resuelto. ¡Muchas gracias!En su código donde ejecuta el procedimiento almacenado, debería tener algo como esto:
Agregue dicha línea de código:
Esto esperará tanto tiempo como sea necesario para que se complete la operación.
fuente
Puede establecer la
CommandTimeout
propiedad del comando SQL para permitir la transacción SQL de larga ejecución.Es posible que también deba mirar la consulta SQL que está causando el tiempo de espera.
fuente
Si bien todas las respuestas anteriores abordan el problema, no cubrieron todos los casos.
Microsoft ha reconocido el problema y lo solucionó en 2011 para los sistemas operativos compatibles, por lo que si obtiene el seguimiento de la pila como:
Es posible que deba actualizar sus ensamblados .NET.
Ver KB 2605597 para más detalles.
https://support.microsoft.com/kb/2605597
fuente
Tal vez sea útil para alguien. Me enfrenté al 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 disposición adecuada resolvió el problema.
fuente
using
bloques) tengo este problema de tiempo de espera. Esto pareció resolverlo.Me enfrenté al mismo problema, trabajé alrededor de 3 días. Me di cuenta de que nuestro número de registros no es mucho, nuestro desarrollador senior mantiene 2 imágenes y huellas digitales en la base de datos. Cuando trato de obtener estos valores hexadecimales que toman mucho tiempo, calculo que el tiempo promedio para ejecutar mi procedimiento es de aproximadamente 38 segundos. El tiempo de espera predeterminado del comando es de 30 segundos, por lo que es menos del tiempo promedio requerido para ejecutar mi procedimiento almacenado. Configuré mi tiempo de espera de comando como a continuación
y funciona bien, pero a veces si su consulta demora más de 50 segundos, generará el mismo error.
fuente
Tienes que establecer el atributo CommandTimeout. Puede establecer el atributo CommandTimeout en la clase secundaria DbContext.
fuente
Encontré 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 1 GB).
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 se había agotado se cargó en tres segundos.
Otra cosa a investigar, al intentar resolver este error, es el tamaño de los archivos de registro de la base de datos. Es posible que sea necesario reducir los archivos de registro.
fuente
Tengo un problema con el cálculo grande en sp_foo que toma mucho tiempo, así que lo solucioné
con este pequeño código de bit
fuente
El tiempo de espera predeterminado es de 15 segundos, para cambiar eso, 0 es ilimitado, cualquier otro número es el número de segundos.
En codigo
En su Web.Config, "Tiempo de espera de comando = 0;" no exceda el tiempo de espera, o por debajo de 1 hora (3600 segundos)
fuente
@SilverLight .. Esto es claramente un problema con un objeto de base de datos. Puede ser una consulta mal escrita o índices faltantes. Pero a partir de ahora no le sugeriré que aumente el tiempo de espera sin investigar el problema con los objetos de su base de datos
Coloque un punto de interrupción en esta línea de código para averiguar 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.
fuente
tratar
luego reconstruya su índice
fuente
fuente
TLDR :
A menudo he encontrado este error por varias razones y he tenido varias soluciones, que incluyen:
fuente
También asegúrese de no tener una transacción pendiente. :)
Estaba haciendo algunas pruebas y comencé una transacción para estar seguro, pero nunca la cerré. Desearía que el error hubiera sido más explícito, ¡pero bueno!
fuente
Hemos tenido tiempos difíciles
Timeout expired/max pool reached
Sqlexception
. Como solución alternativa y para evitar reiniciar el servidor o el servicio, modificamos laMAX SERVER MEMORY
variable en SQL Server (ya sea a través de SQL Managment Studio o T-SQL):Esto soluciona temporalmente el problema hasta que vuelva a suceder. En nuestro caso, sospechamos que tiene que ver con fugas de conexión a nivel de aplicación.
fuente
Recientemente actualizamos a la versión NuGet de
SqlClient
(Microsoft.Data.SqlClient
) que contiene un error . Este error se introdujo durante la vida útil del ciclo 1.x y ya se ha solucionado. La solución estará disponible en la versión 2.0.0 que no está disponible en el momento de escribir este artículo. Una vista previa está disponible.Puede inspeccionar los detalles aquí: https://github.com/dotnet/SqlClient/issues/262
fuente