Eu tenho muitos usuários no meu site (20000-60000 por dia), que é um site de download de arquivos para celular. Eu tenho acesso remoto ao meu servidor (Windows Server 2008-R2).
Já recebi erros "O servidor não está disponível" antes, mas agora estou vendo um erro de tempo limite de conexão.
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. 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 o local da exceção podem ser identificadas usando o rastreamento da pilha de exceções abaixo.
Rastreio de pilha:
[SqlException (0x80131904): 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 finalizada.]
System.Data.SqlClient.SqlConnection.OnError (exceção SqlException, Boolean breakConnection) +404
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning () +412
System.Data.SqlClient.TdsParser.Run (RunBehavior , SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) +1363
System.Data.SqlClient.SqlCommand.FinishExecuteReader (SqlDataReader2014)
System.Data.SqlClient.SqlCommand.RunExecuteReaderTds (CommandBehavior cmdBehavior, runBehavior runBehavior, booleano returnStream, assíncrono booleana) 6389442
System.Data.SqlClient.SqlCommand.RunExecuteReader (CommandBehavior cmdBehavior, runBehavior runBehavior, booleano returnStream, método de sequência, resultado DbAsyncResult) + 538
System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery (resultado DbAsyncResult, String methodName, Boolean sendToPipe) +689
System.Data.SqlClient.SqlCommand.ExecuteNonQuery () +327
NovinMedia.Data.DbObject.RunProcedure (String, , Int32 & linesAffected) +209
DataLayer.OnlineUsers.Update_SessionEnd_And_Online (Object Session_End, Boolean Online) +440
NiceFileExplorer.Global.Application_Start (remetente do objeto, EventArgs e) +163[HttpException (0x80004005): 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.]
System.Web.HttpApplicationFactory.EnsureAppStartCalledForIntegratedMode (HttpContext contexto, HttpApplication app) 4052053
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS (IntPtr appContext, HttpContext contexto, MethodInfo [] manipuladores) 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.Host[HttpException (0x80004005): 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.]
System.Web.HttpRuntime.FirstRequestInit (contexto HttpContext) +11686928 System.Web.HttpRuntime.EnsureFirstRequestInit (contexto HttpContext) +141 System.Web.HttpRuntime.ProcessRequestNotificationPrivate (IIS7Worker)
EDITAR DEPOIS DAS RESPOSTAS:
meu Application_Start
dentro 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 que está 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 métodos para obter usuários online:
- usando
Application["OnlineUsers"] = 0;
- o outro usando banco de dados
Portanto, para o método 2, redefino todos os usuários online em Application_Start
. Existem mais de 482.751 registros nessa tabela.
fonte
Respostas:
Parece que você tem uma consulta que está demorando mais do que deveria. No rastreamento da pilha e no código, você poderá determinar exatamente qual é a consulta.
Esse tipo de tempo limite pode ter três causas;
Pode ser difícil corrigir um impasse, mas é fácil determinar se é esse o caso. Conecte-se ao seu banco de dados 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á ociosa 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 banco de dados use um plano de consulta abaixo do ideal. Pode ser resolvido limpando as estatísticas:
Se isso não funcionar, você também pode tentar
Você não deve fazer isso quando o servidor estiver sob carga pesada, pois ocorrerá temporariamente uma grande ocorrência de desempenho, pois todos os procs e consultas armazenados serão recompilados quando executados pela primeira vez. No entanto, como você declara que o problema ocorre algumas vezes e o rastreamento da pilha indica que o aplicativo está sendo inicializado, acho que você está executando uma consulta que é executada apenas ocasionalmente. Pode ser melhor forçar o SQL Server a não reutilizar um plano de consulta anterior. Veja esta resposta para obter detalhes sobre como fazer isso.
Eu já falei sobre o terceiro problema, mas você pode determinar facilmente 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 estatísticas, você provavelmente precisará ajustá-las. Para obter ajuda, você deve postar a consulta exata em uma nova pergunta.
fonte
exec sp_updatestats
problema foi resolvida. Muito Obrigado!No seu código em que você executa o procedimento armazenado, você deve ter algo como isto:
Adicione essa linha de código:
Isso aguardará o tempo necessário para a operação ser concluída.
fonte
Você pode definir a
CommandTimeout
propriedade 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.
fonte
Embora todas as respostas anteriores tratem do problema, elas não cobriram todos os casos.
A Microsoft reconheceu o problema e o corrigiu em 2011 para os sistemas operacionais suportados. Portanto, se você receber o rastreamento de pilha, como:
pode ser necessário atualizar seus assemblies .NET.
Consulte o KB 2605597 para obter detalhes
https://support.microsoft.com/kb/2605597
fonte
Talvez seja útil para alguém. Eu enfrentei o mesmo problema e, no meu caso, o motivo foi o SqlConnection ter sido aberto e não descartado no método que chamei de loop com cerca de 2500 iterações. O pool de conexão estava esgotado. O descarte adequado resolveu o problema.
fonte
using
blocos), tenho esse problema de tempo limite. Isso pareceu resolver isso.Eu enfrentei o mesmo problema trabalhado nele em torno de 3 dias. Notei que nosso número de registros não é muito grande, pois nosso desenvolvedor sênior mantém 2 imagens e impressões digitais no banco de dados. Quando tento buscar esses valores hexadecimais, demorando muito tempo, calculo o tempo médio para executar meu procedimento em cerca de 38 segundos. O tempo limite do comando padrão é 30 segundos, portanto, é menor que o tempo médio necessário para executar meu procedimento armazenado. Defino meu commandtimeout como abaixo
e está funcionando bem, mas às vezes, se sua consulta demorar mais de 50 segundos, o mesmo erro será solicitado.
fonte
Você precisa definir o atributo CommandTimeout. Você pode definir o atributo CommandTimeout na classe filho DbContext.
fonte
Encontrei esse erro recentemente e, após uma breve investigação, descobri a causa: o espaço estava acabando no disco que contém o banco de dados (menos de 1 GB).
Assim que eu mudei os arquivos do banco de dados (.mdf e .ldf) para outro disco no mesmo servidor (com muito mais espaço), a mesma página (executando a consulta) que atingiu o tempo limite foi carregada em três segundos.
Outra coisa a investigar, ao tentar resolver esse erro, é o tamanho dos arquivos de log do banco de dados. Seus arquivos de log podem precisar ser reduzidos.
fonte
Eu tenho problema com o cálculo grande em sp_foo que leva muito tempo, então eu corrigi
com este pequeno código
fonte
O tempo limite padrão é de 15 segundos, para alterar isso, 0 é ilimitado, qualquer outro número é o número de segundos.
Em código
No seu Web.Config, "Tempo limite do comando = 0;" não exceda o tempo limite ou abaixo de 1 hora (3600 segundos)
fonte
@ SilverLight .. Este é claramente um problema com um objeto de banco de dados. 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 seus objetos de banco de dados
Coloque um ponto de interrupção nessa linha de código para descobrir o nome do procedimento e, em seguida, otimizar o procedimento, observando seu plano de execução.
Não posso ajudá-lo mais até o momento em que você publica detalhes sobre o procedimento armazenado.
fonte
experimentar
então reconstrua seu índice
fonte
fonte
TLDR :
Muitas vezes encontrei esse erro por vários motivos e tive várias soluções, incluindo:
fonte
Verifique também se você não possui uma transação pendente. :)
Eu estava fazendo alguns testes e comecei uma transação para ser segura, mas nunca a fechei. Eu gostaria que o erro tivesse sido mais explícito, mas tudo bem!
fonte
Tivemos tempos difíceis
Timeout expired/max pool reached
Sqlexception
. Como solução alternativa, e para impedir a reinicialização do servidor ou do serviço, modificamos aMAX SERVER MEMORY
variável no SQL Server (por meio do SQL Managment Studio ou T-SQL):Isso corrige temporariamente o problema até que ocorra novamente. No nosso caso, suspeitamos que isso tenha a ver com vazamentos de conexão no nível do aplicativo.
fonte
Atualizamos recentemente para a versão NuGet do
SqlClient
(Microsoft.Data.SqlClient
) que contém um bug . Este bug foi introduzido durante a vida útil do ciclo 1.x e já foi corrigido. A correção estará disponível na versão 2.0.0, que não está disponível no momento desta redação. Uma visualização está disponível.Você pode inspecionar os detalhes aqui: https://github.com/dotnet/SqlClient/issues/262
fonte