O que devo fazer para garantir que o IIS não recicle meu aplicativo?


82

Eu tenho um aplicativo de serviço WCF hospedado no IIS. Na inicialização, ele busca um recurso muito caro (em termos de tempo e CPU) para usar como cache local.

Infelizmente, o IIS parece reciclar o processo regularmente. Portanto, estou tentando alterar as configurações no pool de aplicativos para garantir que o IIS não recicle o aplicativo. Até agora, mudei o seguinte:

  • Limite de intervalo na CPU de 5 a 0.
  • Tempo limite ocioso no modelo de processo de 20 a 0.
  • Intervalo de tempo regular em Reciclagem de 1740 a 0.

Isso será suficiente? E tenho perguntas específicas sobre os itens que alterei:

  1. O que significa especificamente a configuração Limit Interval em CPU? Isso significa que, se um determinado uso da CPU for excedido, o pool de aplicativos será reciclado?
  2. O que exatamente significa "reciclado"? O aplicativo está completamente desativado e reiniciado?
  3. Qual é a diferença entre "Encerramento do processo do trabalhador" e "Reciclagem do pool de aplicativos"? A documentação para o tempo limite ocioso no modelo de processo fala sobre o encerramento do processo do trabalhador. Enquanto os documentos para Intervalo de tempo regular em Reciclagem falam sobre reciclagem de pool de aplicativos. Não entendo bem a diferença entre os dois. Eu pensei que o w3wp.exe é o processo de trabalho que executa o pool de aplicativos. Alguém pode explicar a diferença para a aplicação entre os dois?

O motivo para ter as tags IIS7 e IIS7.5 é porque o aplicativo será executado em ambos e espero que as respostas sejam as mesmas entre as versões.

Imagem para referência: insira a descrição da imagem aqui


Onde você conseguiu essa captura de tela acima com as configurações do IIS?
Andrew William Ross

Essa é a folha de propriedades Advanced Pool de aplicativos.
TristanK

Respostas:


105

Reciclando

A reciclagem é geralmente * onde o IIS inicia um novo processo como um contêiner para o seu aplicativo e, em seguida, entrega o antigo ao ShutdownTimeLimit para que ele desapareça por vontade própria antes de ser morto.

* - geralmente: consulte DisallowOverlappingRotation / configuração "Desativar reciclagem sobreposta"

É destrutivo , pois o processo original e todas as suas informações de estado são descartadas. O uso de um estado de sessão fora de processo (por exemplo, Servidor de Estado ou banco de dados ou até mesmo um cookie se seu estado for pequeno) pode permitir que você contorne isso.

Mas, por padrão, ela se sobrepõe - o que significa que a duração de uma interrupção é minimizada porque o novo processo é iniciado e está conectado à fila de solicitações, antes que o antigo seja informado "você tem [ShutdownTimeLimit] segundos para desaparecer. Por favor, cumpra."

Configurações

Para sua pergunta: todas as configurações nessa página controlam a reciclagem de alguma forma. "Desligamento" pode ser descrito como "reciclagem proativa" - onde o próprio processo decide que é hora de partir e sai de maneira ordenada.

A reciclagem reativa é onde o WAS detecta um problema e dispara no processo (após estabelecer um W3WP de substituição adequado).

Agora, aqui estão algumas coisas que podem causar a reciclagem de um formulário ou de outro:

  • um ISAPI decidindo que não é saudável
  • qualquer módulo travando
  • tempo limite inativo
  • limitação da CPU
  • ajustando propriedades do pool de aplicativos
    • como sua mãe pode ter gritado a certa altura: "Pare de mexer nela, ou isso nunca vai melhorar!"
  • falha no "ping" *, na verdade, não é o ping em si, porque ele usa um pipe nomeado - mais "detecção de vida"
  • todas as configurações na captura de tela acima

O que fazer:

Geralmente:

  • Desative tempos limite inativos . 20 minutos de inatividade = boom! Novo processo na próxima solicitação recebida. Defina isso como zero.

  • Desativar intervalo de tempo regular - o padrão de 29 horas foi descrito como "insano", "irritante" e "inteligente" por várias partes. Na verdade, apenas dois deles são verdadeiros.

  • Opcionalmente Ligue DisallowRotationOnConfigChange (acima, Disable Reycling para alterações de configuração ) se você apenas não pode parar de jogar com ele - o que lhe permite alterar qualquer configuração de pool de aplicativo sem ela instantaneamente sinalizando para o trabalhador processos que ele precisa ser morto. Você precisa reciclar manualmente o pool de aplicativos para que as configurações entrem em vigor, o que permite predefinir as configurações e usar uma janela de alteração para aplicá-las no processo de reciclagem.

  • Como princípio geral, deixe o ping ativado . Essa é a sua rede de segurança. Eu já vi pessoas desligá-lo e, em seguida, o site trava indefinidamente às vezes, levando ao pânico ... então, se as configurações forem muito agressivas para o seu aplicativo aparentemente muito, muito, muito lento para responder, recue um pouco e veja o que você recebe, em vez de desligá-lo. (A menos que você tenha configurado o dumping no modo de falha automática para W3WPs travados por meio de seu próprio processo de monitoramento)

Isso é suficiente para fazer com que um processo bem-comportado viva para sempre. Se morrer, com certeza, será substituído. Se ele trava, ping deve pegar isso e um novo deve começar dentro de 2 minutos (por padrão; pior caso calc deve ser: até freqüência de ping + tempo limite de ping + limite de tempo de inicialização antes de os pedidos começar a trabalhar novamente).

Normalmente , a limitação da CPU não é interessante porque, por padrão, está desativada e também está configurada para não fazer nada; se estivesse configurado para interromper o processo, com certeza, isso seria um gatilho de reciclagem. Deixe isso de lado. Nota para o IIS 8.x, a otimização da CPU também se torna uma opção.

Um AppPool (IIS) não é um AppDomain (.Net) (mas pode conter um / alguns)

Mas ... então entramos na terra .Net e na reciclagem do AppDomain, que também pode causar perda de estado. (Consulte: https://blogs.msdn.microsoft.com/tess/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles/ )

Versão curta, você faz isso por tocar um arquivo web.config em sua pasta de conteúdo (novamente com a colheita!), Ou através da criação de uma pasta na pasta ou um arquivo ASPX, ou .. outras coisas ... e é sobre tão destrutivo quanto a reciclagem de um pool de aplicativos, menos os custos de inicialização do código nativo (é puramente um conceito de código gerenciado (.Net); portanto, apenas o código gerenciado acontece aqui).

O antivírus também pode acionar isso, pois verifica os arquivos web.config, causando uma notificação de alteração, causando ....


2
Aguarde, aguarde, aguarde ... por que LER um web.config do Antivirus acionaria uma notificação de alteração? Qualquer antivírus que "toque" em um web.config sem motivo é lixo imho.
Shiv

O AV pode não apenas ler, mas também gravar - por exemplo, em um fluxo de dados alternativo, registrando a versão do mecanismo usada pela última vez para verificar um arquivo. Como um pensamento.
TristanK 22/02

7

Por favor, verifique,

Por que reciclamos nossos pools de aplicativos?

se você navegar na web para descobrir o motivo pelo qual os pools de aplicativos são configurados para reciclagem automática periodicamente, será difícil encontrar uma resposta razoável que não se refira a problemas de memória. É como se a comunidade em geral tivesse aceitado o fato de que nossos aplicativos da Web (ou camadas de serviço hospedados no IIS) precisarão ser reciclados para evitar problemas de memória.

Sempre sou da opinião de que, se seu código exigir reinicializações periódicas para continuar funcionando corretamente, algo estará claramente errado. Há um erro no seu código em algum lugar e você precisa corrigi-lo, em vez de reiniciar o processo ocasionalmente para fazer com que o problema 'desapareça'.

Realmente precisamos começar a focar mais no gerenciamento de memória no .NET e garantir que nossos aplicativos possam continuar funcionando sem problemas.


3
Uma razão foi que o .NET usa heap separado para 'objetos grandes' (geralmente 85K ou maiores ou algo assim) que não são compactados quando ocorre a coleta de lixo (embora no .NET 4.5.1 eu acho que eles adicionaram opção para compactar o LOH) e no ASP.NET ao renderizar HTML no lado do servidor, não é incomum ver 85K de HTML (especialmente para conteúdo repetido, como tabelas e grades) e esse HTML é basicamente em um ponto apenas um grande objeto String no servidor e se é qualificado como um objeto grande, ele contribui para a fragmentação do heap de objetos grandes, resultando eventualmente em OutOfMemoryException e, portanto, reciclando
nada é necessário.

0

Com base no cenário OP (longa inicialização na inicialização / aquecimento), outra coisa a verificar é o tempo limite de inicialização (segundos), que possui um valor padrão de 90 segundos. Se a inicialização demorar mais do que o tempo limite de inicialização, o processo do operador poderá ser encerrado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.