IIS 6 + serviço da web ASP.NET - exceção DW20 e stackoverflow

4

Considere um serviço da Web SOAP do ASP.NET que é iniciado corretamente, mas é difícil quando recebe seu primeiro hit.

Por favor, note que esta é a implantação funciona no ambiente de teste, mas não no ambiente PreProd. Ambos são o Windows 2003 SP3 + IIS 6 + ASP.NET 3.5. Tudo atualizado.

O comportamento que estamos vendo é:

  • reinicie o site & pool de aplicativos
  • o pool de aplicativos está configurado para ser executado no serviço de rede.
  • navegar para o .asmx e .wsdl respondem normalmente, conforme esperado.
  • envia uma solicitação SOAP normal / bem formada normal para o serviço da web
  • 100% de uso da CPU
  • após 5 segundos, o pedido de página / site retorna "Serviço indisponível"
  • nenhuma entrada é criada no arquivo de log do IIS (por exemplo, c: \ windows \ system32 \ logfiles \ W3C-foo)
  • o pool de aplicativos acaba sendo interrompido

Os processos que atingem a CPU com força são dw20.exe . Não tenho certeza porque o Dr. Watson está envolvido aqui.

O log de eventos mostra um erro de tempo de execução do ASP.NET:

Gerenciadordetarefas:

Texto do registro de eventos :

EventTypeclr20r3,P1w3wp.exe,P26.0.3790.3959,P345d6968e,P4errormanagement,P51.0.0.0,P64b86a13f,P724,P80,P9system.stackoverflowexception,P10NIL.

Perguntas

Algumaopiniãosobreoqueestaexceçãosystem.stackoverflowpodeser?Dadoqueocódigoéomesmoentreosambientes,podeserumproblemadecargaútil?Poderiaserumproblemadeconfiguração?Vocêpodeveronomedomeuassembly.NETlánamensagemdeexceção:"ErrorManagement"

    
por p.campbell 02.03.2010 / 19:23

5 respostas

2

A resolução para este problema (provavelmente único):

  • remover e recriar todos os pools de aplicativos (provavelmente isso foi um exagero e desnecessário)
  • exclua os arquivos de aplicativos no disco
  • reimplanta e nova compilação & versão do aplicativo
  • certifique-se de que todas as referências estejam incluídas no diretório bin
por 08.03.2010 / 19:52
2

As exceções do Stackoverflow são um caso especial, porque o aplicativo afetado não pode fazer mais nada (por exemplo, registrar um rastreamento de pilha) - nesse caso, o processo do pool de aplicativos (w3p.exe) é finalizado pelo SO. É por isso que o Dr. Watson / DW20 se envolve. Você poderia tentar depurar o despejo que o DW20 salvou usando o WinDbg com a extensão SOS (espere uma curva de aprendizado se você não estiver familiarizado com esse conjunto de ferramentas - espero que isso se torne mais fácil com o VS2010 como prometido).

O alto uso de CPU (e frequentemente alto uso de memória) é causado pelo DW20, o que é especialmente irritante se o "crash-restart-loop" for mais rápido que o DW20 e assim vários processos do DW20 se acumulam.

A configuração do pool de aplicativos padrão do IIS é reiniciar os aplicativos paralisados no máximo 3 vezes em um curto período de tempo; caso contrário, eles serão interrompidos para proteger o servidor contra DoS.

Com relação à causa raiz, o stackoverflow: Pode ser tudo ... mas e quanto a essa suposição: O acesso ao banco de dados está falhando devido a configuração incorreta, a exceção é gerada e seu aplicativo está registrando exceções no banco de dados, sem detectar exceções tratamento de exceções;)

    
por 08.03.2010 / 20:39
1

Eu tive esse problema e descobri que eu tinha uma instrução LINQ que estava tentando excluir algumas linhas. Ele estava falhando a cada dia, então a quantidade de linhas continuava subindo e subindo. As exceções foram realmente tratadas e registradas em uma tabela que eu fiz, então eu a encontrei lá. Encontrei a tabela de problemas e foi 700k + de linhas super pesadas. Meu LINQ ficou assim:

var db = new DatabaseDataContext();
        var updateQueueLogs = db.UpdateQueueLogs;

        List<UpdateQueueLog> listToDelete;

        using (new TransactionScope(
            TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
        {
            listToDelete = (from updateQueueLog
                              in db.UpdateQueueLogs
                            where updateQueueLog.CreatedAt < DateTime.Now.AddDays(-7)
                            select updateQueueLog).ToList();
        }

        updateQueueLogs.DeleteAllOnSubmit(listToDelete);

        db.SubmitChanges();

Então, estava puxando os objetos completos e obtendo exceções OutofMemory. Eu mudei este código para um proc armazenado:

delete from UpdateQueueLogs
 where CreatedAt < DATEADD(day,-7,getdate())

Eu só queria postar isso, porque se você não está vendo as exceções, você pode querer verificar algumas das suas contagens de linha da tabela SQL e ver se pode haver algumas instruções LINQ que estão expirando.

    
por 29.02.2012 / 00:42
0

Parece que você está recebendo uma exceção não tratada que, por sua vez, mata o processo de trabalho do asp.net. Veja se isso ajuda:

link

    
por 02.03.2010 / 20:50
0

Verifique se há erros no Visualizador de Eventos (geralmente log do aplicativo). Está sob ferramentas administrativas.

Além disso, o ponto positivo do @ markus do IIS ter uma configuração padrão bastante difícil "não mais do que X encadeamentos de encadeamento por Y tempo", de modo que se você acertar a página apenas algumas vezes com esse erro, todo o Pool de Aplicativos é retirado. Mais uma vez, verifique o Visualizador de Eventos.

    
por 27.07.2012 / 11:16