Recorte de cache do ASP.NET ciente do limite de memória do pool de aplicativos?

3

Estou executando um aplicativo ASP.NET no Win2003 32bit que tende a alocar muita memória. Para evitar OutOfMemoryExceptions que começam a aparecer quando o processo W3P excede 1 GB, defini um limite máximo de memória virtual de 850 MB para o pool de aplicativos, para que o aplicativo seja reiniciado em vez de gerar exceções.

Embora não forneça exceções, essas reinicializações ainda levam à degeneração do desempenho temporal (baixa taxa de acertos do cache, compilação do aspx etc.), portanto, eu gostaria de minimizar o número de reinicializações. Observando os contadores de desempenho, vejo que o cache do ASP.NET funciona como planejado (a contagem de itens e a taxa de acertos do cache aumentam após o início, depois que alguns itens são removidos provavelmente devido às datas de expiração), exceto as aparências do cache.

g. Eu esperaria que o corte de cache fosse ativado quando e. g. 750 MB estão em uso e metade disso é cache. Mas isso nunca acontece, sob carga continua a alocar mais e mais memória em vez de e. g. trashing de itens de cache baixos do prio, até atingir o limite de memória.

Alguém sabe o que realmente acionaria o corte de cache? Memória física disponível? Existe alguma outra configuração disponível para otimizar este cenário?

(Sim, eu sei, 32 bits é tão 2004 e com x64 esse problema iria embora, provavelmente até mesmo com a mesma quantidade de memória, mas para este aplicativo eu estou preso com este servidor por mais alguns meses e tenho que continue correndo ...)

    
por realMarkusSchmidt 27.08.2010 / 14:52

1 resposta

4

Eu finalmente encontrei o problema. Há uma seção de configuração web.config opcional para o cache do ASP.NET: link

A configuração padrão é absolutamente absurda para caixas de 32 bits com mais de 2 GB de RAM: ela começa a descartar itens do cache, se menos de 10% de RAM física estiver disponível . Tendo e. g. 4 GB de RAM instalados e um limite de 2 GB por processo, isso nunca acontecerá. Portanto, o tamanho do cache (e, portanto, o tamanho do heap, principalmente o heap da geração 2) está aumentando e aumentando até que você execute o OutOfMemoryExceptions ou atinja o limite do pool de aplicativos.

Agora adicionei isso ao meu web.config:

<configuration>
  <system.web>
    <caching>
      <cache privateBytesLimit="400000000" privateBytesPollTime="00:01:00" />
    </caching>
  </system.web>
</configuration>

Além disso, defini os seguintes limites para o pool de aplicativos:

  • 1400 MB de limite de memória virtual
  • 800 MB de limite de memória usado (bytes privados)

Veja este ótimo artigo para informações sobre esses valores: link

Agora, se eu carregar o teste do meu aplicativo de forma que muitos objetos serão adicionados ao cache em pouco tempo, poderei ver o contador de desempenho de trims do cache ASP.NET aumentando, e o uso da memória permanece constantemente sob o meu limites de reinicialização.

    
por 31.08.2010 / 20:09