Tempo limite expirado. O período de tempo limite decorrido antes da conclusão da operação ou o servidor não está respondendo. A instrução foi encerrada

Eu tenho muitos usuários no meu site (20000-60000 por dia), que é um site de download para arquivos móveis. Eu tenho access remoto ao meu servidor (windows server 2008-R2).
Recebi erros “Servidor indisponível” antes, mas estou vendo agora um erro de tempo limite de conexão.
Eu não estou familiarizado com isso – por que isso ocorre e como posso corrigi-lo?

O erro completo está abaixo:

Erro de Servidor na ‘/’ Aplicação. Tempo limite expirado. O período de tempo limite decorrido antes da conclusão da operação ou o servidor não está respondendo. A instrução foi encerrada. Descrição: ocorreu uma exceção não tratada durante a execução da solicitação da web atual. Por favor, revise o rastreamento de pilha para obter mais informações sobre o erro e onde ele se originou no código.

Detalhes da exceção: System.Data.SqlClient.SqlException: tempo limite expirado. O período de tempo limite decorrido antes da conclusão da operação ou o servidor não está respondendo. A instrução foi encerrada.

Erro de origem:

Uma exceção não tratada foi gerada durante a execução da solicitação da web atual. Informações sobre a origem e localização da exceção podem ser identificadas usando o rastreamento de pilha de exceção abaixo.

Rastreamento de pilha:

[SqlException (0x80131904): o tempo limite expirou. O período de tempo limite decorrido antes da conclusão da operação ou o servidor não está respondendo. A instrução foi encerrada.]
System.Data.SqlClient.SqlConnection.OnError (exceção SqlException, boolean breakConnection) +404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () +412
System.Data.SqlClient.TdsParser.Run (RunBehavior runBehavior, CmdHandler SqlCommand, DataStream SqlDataReader, 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, regressão booleano, asynchronous booleano) +6389442
System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, RunBehavior runBehavior, método booleano returnStream, String, resultado DbAsyncResult) +538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (resultado DbAsyncResult, String methodName, booleano sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
parameters NovinMedia.Data.DbObject.RunProcedure (String storedProcName, IDataParameter [], Int32 & rowsAffected) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (remetente do object, EventArgs e) +163

[HttpException (0 x 80004005): o tempo limite expirou. O período de tempo limite decorrido antes da conclusão da operação ou o servidor não está respondendo. A instrução foi encerrada.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (contexto HttpContext, aplicativo HttpApplication) +4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, contexto HttpContext, manipuladores MethodInfo []) +191
System.Web.HttpApplication.InitSpecial (estado HttpApplicationState, manipuladores MethodInfo [], IntPtr appContext, contexto HttpContext) +352
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance (IntPtr appContext, contexto HttpContext) +407
System.Web.Hosting.PipelineRuntime.InitializeApplication (IntPtr appContext) +375

[HttpException (0 x 80004005): o tempo limite expirou. O período de tempo limite decorrido antes da conclusão da operação ou o servidor não está respondendo. A instrução foi encerrada.]
System.Web.HttpRuntime.FirstRequestInit (contexto HttpContext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (contexto HttpContext) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7WorkerRequest wr, contexto HttpContext) +4863749


EDITAR APÓS RESPOSTAS:
meu Application_Start no Global.asax é como abaixo:

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

O procedimento armazenado sendo chamado é:

 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 

Eu tenho dois methods para obter usuários online:

  1. using Application["OnlineUsers"] = 0;
  2. o outro usando database

Portanto, para o método nº 2, redefino todos os usuários on-line no Application_Start . Existem mais de 482.751 registros nessa tabela.

    Parece que você tem uma consulta que está demorando mais do que deveria. Do seu rastreamento de pilha e seu código, você deve ser capaz de determinar exatamente qual consulta é.

    Esse tipo de tempo limite pode ter três causas;

    1. Há um impasse em algum lugar
    2. As statistics do database e / ou o cache do plano de consulta estão incorretos
    3. A consulta é muito complexa e precisa ser ajustada

    Um impasse pode ser difícil de consertar, mas é fácil determinar se é esse o caso. Conecte-se ao seu database com o Sql Server Management Studio. No painel esquerdo, clique com o botão direito do mouse no nó do servidor e selecione Activity Monitor . Dê uma olhada nos processos em execução. Normalmente, a maioria estará inativa ou em execução. Quando o problema ocorre, você pode identificar qualquer processo bloqueado pelo estado do processo. Se você clicar com o botão direito do mouse no processo e selecionar detalhes, ele mostrará a última consulta executada pelo processo.

    O segundo problema fará com que o database use um plano de consulta abaixo do ideal. Pode ser resolvido limpando as statistics:

     exec sp_updatestats 

    Se isso não funcionar, você também pode tentar

     dbcc freeproccache 

    Você não deve fazer isso quando seu servidor estiver sob carga pesada, pois sofrerá temporariamente um grande impacto de desempenho, já que todos os procs e consultas armazenados são recompilados quando executados pela primeira vez. No entanto, como você afirma que o problema ocorre algumas vezes , e o rastreamento de pilha indica que seu aplicativo está sendo inicializado, acho que você está executando uma consulta que é executada apenas ocasionalmente. Você pode estar melhor, forçando o SQL Server a não reutilizar um plano de consulta anterior. Veja esta resposta para detalhes sobre como fazer isso.

    Eu já toquei no terceiro problema, mas você pode facilmente determinar se a consulta precisa de ajuste, executando a consulta manualmente, por exemplo, usando o Sql Server Management Studio. Se a consulta demorar muito para ser concluída, mesmo depois de redefinir as statistics, você provavelmente precisará ajustá-las. Para obter ajuda com isso, você deve postar a consulta exata em uma nova pergunta.

    Em seu código onde você executa o procedimento armazenado, você deve ter algo parecido com isto:

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

    Adicione essa linha de código:

     c.CommandTimeout = 0; 

    Isso aguardará o tempo necessário para a conclusão da operação.

    Você pode definir a propriedade CommandTimeout do Comando SQL para permitir a transação SQL de longa execução.

    Você também pode precisar consultar a Consulta SQL que está causando o tempo limite.

    Embora todas as respostas anteriores abordassem o problema, elas não abrangiam todos os casos.

    A Microsoft reconheceu o problema e corrigiu-o em 2011 para sistemas operacionais suportados, portanto, se você obter o rastreamento de pilha 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) 

    talvez seja necessário atualizar seus assemblies do .NET.

    Esse problema ocorre devido a um erro no algoritmo de repetição de conexão para bancos de dados espelhados.

    Quando o algoritmo de repetição é usado, o provedor de dados aguarda a conclusão da primeira chamada de leitura (SniReadSync). A chamada é enviada para o computador de back-end que está executando o SQL Server e o tempo de espera é calculado multiplicando-se o valor de tempo limite da conexão por 0,08. No entanto, o provedor de dados define incorretamente uma conexão com um estado condenado se uma resposta for lenta e se a primeira chamada SniReadSync não for concluída antes que o tempo de espera expire.

    Veja KB 2605597 para detalhes

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

    Talvez seja útil para alguém. Enfrentei o mesmo problema e no meu caso o motivo foi o SqlConnection ser aberto e não descartado no método que eu chamei em loop com cerca de 2.500 iterações. O pool de conexões estava esgotado. A disposição adequada resolveu o problema.

    Enfrentei o mesmo problema trabalhado nele em torno de 3 dias. Eu notei como nosso número de registros não é muito nosso desenvolvedor sênior mantém 2 imagens e impressões digitais no database. Quando eu tento buscar esses valores hexadecimais que demoram muito tempo, eu calculo o tempo médio para executar meu procedimento em torno de 38 segundos. O tempo de comando padrão é 30 segundos, portanto, seu tempo menor que a média necessário para executar o procedimento armazenado. Eu configurei meu comando como abaixo

     cmd.CommandTimeout = 50 

    e está funcionando bem, mas, às vezes, se sua consulta demorar mais de 50 segundos, ele solicitará o mesmo erro.

    Você precisa definir o atributo CommandTimeout. Você pode definir o atributo CommandTimeout na class filho 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; } } 

    Eu encontrei este erro recentemente e depois de uma breve investigação, encontrei a causa de estarmos ficando sem espaço no disco que contém o database (menos de 1GB).

    Assim que mudei os arquivos do database (.mdf e .ldf) para outro disco no mesmo servidor (com muito mais espaço), a mesma página (executando a consulta) que tinha esgotado o tempo limite em três segundos.

    Uma outra coisa a investigar, ao tentar resolver esse erro, é o tamanho dos arquivos de log do database. Seus arquivos de log talvez precisem ser reduzidos.

    @SilverLight .. Este é claramente um problema com um object de database. Pode ser uma consulta mal escrita ou índices ausentes. Mas, a partir de agora, não vou sugerir que você aumente o tempo limite sem investigar o problema com os objects do database.

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

    Coloque um ponto de interrupção nessa linha de código para localizar o nome do procedimento e otimize o procedimento observando seu plano de execução.

    Não posso ajudá-lo mais até o momento em que você postar detalhes sobre o procedimento armazenado.

    Eu tenho problema com grandes cálculos em sp_foo que levam muito tempo, então eu consertei
    com este pequeno código

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

    experimentar

     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 

    então reconstrua seu índice