QUANDO o pool de aplicativos do IIS 6.0 CRASH com problemas de memória?

1

Temos tido problemas de falta de memória com o nosso site ASP / .NET clássico e misto há algum tempo. Basicamente, vemos alguns casos diferentes:

  1. Alguma solicitação (consulta SQL que retorna um conjunto de registros LARGE) faz com que a memória aumente drasticamente (Bytes privados e virtuais), e o processo de trabalho do IIS falha e o pool de aplicativos é reciclado.
  2. Os Bytes privados permanecem "normais", mas o Virtual Bytes está no máximo (~ 2 GB) e o processo de trabalho do IIS falha, o pool de aplicativos é reciclado.

Crashes têm os ID's do evento: 1009, 1011, & 1013.

Em ambos os casos, o ASP reporta mensagens de memória insuficiente em nosso log de aplicativo.

Se realmente estamos 'sem memória', por que os usuários JÁ no aplicativo ainda podem funcionar e novos usuários estão bloqueados até mesmo no login? Isso não significaria que nenhum pedido poderia ser atendido?

Obviamente, o IIS ainda pode atender a algumas solicitações - portanto, a resposta provavelmente é que isso depende da solicitação específica. Talvez um seja mais 'caro' do que o outro?

Em qualquer caso, minha pergunta final é: em que ponto o pool de aplicativos diz que é suficiente, devo reciclar?

Nós executamos o DebugDiag e vimos alguns heaps acima de 90% ou mesmo 100% fragmentados, então a reciclagem acontece somente quando a fragmentação é alta E não há mais espaço de heap ?

Esta é uma questão um pouco subjetiva, mas espero conseguir alguma informação sobre o que é esse limite!

Obrigado.

    
por tresstylez 02.03.2012 / 20:36

1 resposta

1

A menos que o processo do operador quebre um dos critérios de reciclagem configurados (o limite de bytes virtuais parece ser bom?) ou não esteja respondendo a pings, ele não é reciclado.

As aplicações (ISAPIs) podem comunicar-se como não saudáveis, o que desencadeia uma reciclagem, mas isso acontece em condições bastante restritas.

Seu aplicativo basicamente fragmenta a memória enquanto ela é executada, e a OOM reflete isso - não há memória livre e não alocada contígua disponível para novas alocações; eles falham.

Suas opções com base na descrição são:

  • corrija o padrão de alocação

  • separe as partes do aplicativo em pools de aplicativos separados (execute .Net separadamente do ASP, por exemplo) - nem todos os aplicativos podem ser divididos dessa maneira, mas é uma vitória fácil para os que podem. Dois pools de aplicativos = 2 (ou mais) processos de trabalho = 2 GB por espaço de endereço do processo de trabalho

  • implemente um limite de bytes virtuais para reciclar o pool de aplicativos quando ele ficar muito grande

  • implemente uma reciclagem diária para evitar que o aplicativo chegue ao ponto em que todo o espaço da memória é fragmentado

  • se o seu aplicativo for sem estado, experimente jardinagem na web; aumentar o número máximo de processos de trabalho para evitar falhas por mais tempo.

  • Executar como um aplicativo de 32 bits em um sistema de 64 bits; 4 GB são fornecidos para processos de trabalho.

Essencialmente, se (o que for) o heap ficar super fragmentado, você estará em uma espiral de morte nesse ponto e precisará de um novo processo de trabalho.

O IIS não tem cintos de segurança embutidos para isso, portanto, implementar um limite de reciclagem em seu processo antes que chegue a esse ponto - ou apenas dizer "esqueça isso, estou indo para 64 bits!" podem ser soluções possíveis.

    
por 03.03.2012 / 07:24