w3wp.exe suga memória

8

Em uma instalação do Small Business Server 2011, vários processos do w3wp.exe parecem estar usando uma quantidade desproporcional de memória. As instalações prontas para uso do SBS vêm com um total de 7 sites e 20 pools de aplicativos ASP.NET (itens específicos do Sharepoint, Exchange, WSUS e SBS, como Remote Web Workplace).

A dúzia resultante de processos w3wp.exe tende a consumir mais de 4 GB de memória do servidor ao longo do tempo, sendo o pool de aplicativos de pico o pertencente ao WSUS com cerca de 800 MB no conjunto de trabalho. Reciclar manualmente os pools de aplicativos por meio do MMC do IIS ajuda a reduzir temporariamente o uso de memória (os processos w3wp.exe diminuem para 10 MB, alguns deles se recuperam rapidamente), mas obviamente não é algo que um administrador deseja fazer o dia todo. Não consegui encontrar nenhuma recomendação sobre a reciclagem automática dos pools de aplicativos pré-instalados pelo SBS, por isso estou um pouco relutante em "simplesmente fazê-lo" nos sistemas de produção.

Minha pesquisa na rede sobre como limitar isso apenas levantou várias postagens afirmando que o consumo de memória w3wp não prejudicaria, mas beneficiava o desempenho, pois a memória seria "liberada quando necessário por outros aplicativos". O problema é que não funciona:

  • por um lado, um SBS é um servidor com várias funções, uma das funções (a principal) sendo o armazenamento em rede CIFS, que se beneficia imensamente do cache do sistema de arquivos, que novamente depende da memória estar "livre", como em "não usada por outros processos em qualquer way "- pools de aplicativos ASP.NET que quase nunca vêem usuários e comem memória são contraproducentes
  • Outra coisa é que ainda tenho que ver uma diminuição substancial do consumo de memória das instâncias w3wp devido à falta de memória - o que vejo é uma pequena redução de menos de 100 mb e troca excessiva - prejudicando o desempenho

Quase nunca administro aplicativos IIS ou ASP.NET, portanto, todas as idéias sobre como aparar efetivamente os requisitos de memória para os pools de aplicativos são bem-vindas.

o wabbit
fonte
O que esse aplicativo ASP.NET faz? Vi w3wp.exe usar muita memória quando um aplicativo falha ao fechar conexões com o Linq-To-SQL ou o Entity Framework.
Nate
Existem vários. Muitos estão relacionados ao Exchange, como serviços OWA / OMA e de sincronização, um excepcionalmente grande é WSUS, alguns são usados para Sharepoint ou personalizados sites específicos-SBS (CompanyWeb, Isolado Web local de trabalho)
a-wabbit

Respostas:

7

Bem-vindo ao maravilhoso mundo da SBS. Requisitos recomendados para RAM = 10 GB ... e EXIGE um mínimo de 8 GB. (de acordo com a Microsoft .) por um bom motivo. Não é uma máquina bem oleada e bem afinada ... é muito desleixada, inchada e tem tudo sob o sol reunido. Quanto mais RAM você puder jogar nessa caixa ... melhor. Infelizmente, você está limitado a 32 GB no máximo. Qual imho ... é bobo.

TheCompWiz
fonte
Acho que devo refinar um pouco minha resposta. Se você está preocupado com a quantidade de RAM consumida, economize muito tempo / dores de cabeça fazendo um dos seguintes: A) Não use o SBS ... use o servidor padrão e configure as funções que NECESSITA individualmente. ou B) Jogue mais RAM no sistema ... pois a RAM é bem barata. O SBS foi projetado para escritórios muito pequenos ... (10 a 20 estações de trabalho ...) e não é muito dimensionável.
TheCompWiz
Obrigado pela sua resposta. O sistema em que observei o comportamento tinha 16 GB de RAM, que é o limite físico. A memória disponível rapidamente foi preenchida com o store.exe do Exchange e várias instâncias do SQL Server e do w3wp.exe, que não são apenas "não ajustadas", mas também totalmente inovadoras. Sei como lidar com problemas excessivos de consumo de memória dos outros dois, pois, por acaso, gerencio sistemas Exchange e SQL Server com freqüência, mas com o w3wp, estou um pouco perdido. A rede em si tem apenas 11 usuários.
the-wabbit
Exchange, SQL Server e IIS têm mecanismos que tentam e consomem 100% da RAM para dados "em cache". Se algo mais pedidos mais RAM ... todos os 3 estão supostamente para escala-back para permitir que outros serviços para serem executados sem recorrer a troca. (na teoria) Na prática, no entanto, acho que você só precisa dar um soco em algumas coisas ... Você pode tentar ajustar tudo manualmente e definir limites rígidos ... mas estará sempre perseguindo aquele. Vou ver se consigo encontrar um artigo que li há alguns anos sobre a limitação de pools de aplicativos no IIS para você ...
TheCompWiz
7

Isto é o que acabei fazendo:

configurando o cache do aplicativo de servidor para o .NET AppPools como um valor baixo (5 MB), definindo o parâmetro privateBytesLimit no web.configat %WINDIR%\Microsoft.NET\Framework\<version>\Configcomo sugerido nesta resposta :

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

Isso ajudou a reduzir o uso de memória para um pouco mais de 1 GB com as configurações padrão de reciclagem de pool.

Aparentemente, o uso do tipo "servidor" de coletor de lixo ( <gcServer = "true">) também pode levar a um consumo significativo de memória , mas, ao que parece, <gcServer>é definido como falso por padrão.

o wabbit
fonte
FYI - um tempo atrás, começamos a configurar o gcserver como false depois de ler estes artigos: forums.asp.net/t/1654596.aspx/1 e msdn.microsoft.com/en-us/library/ff647787.aspx
Greg Askew,
@ the-wabbit O conselho para definir gcServer = false ainda é atual agora que a coleta de lixo do servidor ocorre simultaneamente?
Michael Steele
6

Se você suspeitar que o consumo de memória resultante é um problema devido a um defeito de software, poderá usar o Microsoft DebugDiag 1.2 para criar um despejo de memória completo e analisar o despejo quanto a problemas comuns. Se você acha que pode haver um problema de memória, é necessário ativar o rastreamento de vazamentos selecionando a opção "Monitorar vazamentos" e deixá-lo funcionar por um tempo antes de criar / analisar o despejo.

DebugDiag 1.2 Baixe
https://www.microsoft.com/download/en/details.aspx?id=26798

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Greg Askew
fonte
Obrigado pelo link, vou tentar. O pacote de instalação do MSI aparentemente apresenta problemas quando executado em versões localizadas (não americanas-inglesas) do Windows, tenho que verificar se há uma solução alternativa para isso.
the-wabbit
2

Você não precisa de um pool de aplicativos separado para cada aplicativo, apenas aqueles que não são confiáveis ​​ou aos quais deseja dar prioridade. Muitos podem compartilhar (mantendo diferentes versões .net separadas). Você pode limitar de forma mais realista a memória que um pool de aplicativos usará. Não deve haver necessidade de reciclar conjuntos repetidamente mais de uma vez por dia.

Além disso, há apenas tanta memória que pode ser liberada dessa maneira. Embora alguns deles sejam armazenados em cache, cada aplicativo precisa de uma certa quantidade de memória de trabalho, altamente dependente do aplicativo Web específico. Tentar restringir muito isso vai fazer com que as coisas parem.

O problema realmente é que o SBS tenta fazer muita coisa de uma só vez, você precisa observar o que realmente usa e desligar o que não usa.

Mas, para ser sincero com apenas 11 usuários, para onde está indo o resto da memória? Exchange e SQL para uso leve certamente não precisam de mais de 12 GB!

JamesRyan
fonte
Ah, você nunca experimentou a beleza de uma SBS, experimentou? O armazenamento de informações do Exchange aumenta para 8 GB, quando não restrito, e várias instâncias do servidor SQL ocupam mais 3 GB. A maioria dos pools de aplicativos está executando apenas 1-2 aplicativos com a mesma versão do .NET e no mesmo contexto de segurança. No entanto, não posso reagrupá-los por causa de problemas de suporte. Também é improvável que resolva os problemas de memória - se eu tiver apenas 4 processos de 1 GB em vez de 12 menores, pouco se ganha.
the-wabbit
A diferença em ter menos pools de aplicativos é que os vários caches estarão cheios do que é usado regularmente, empurrando o que não é. Com muitos pools de aplicativos, haverá mais desperdício. Quantos contextos de segurança você realmente precisa com 11 usuários? Sim, o Exchange usará alegremente o máximo de memória possível, mas também funcionará com apenas 2 GB para esses poucos usuários, se você o restringir. Com o SBS, você precisa aceitar que não pode usar as melhores práticas em todos os lugares ou executar qualquer uma das opções de maneira ideal; você precisa ser um pouco pragmático e não exagerar na engenharia.
precisa saber é o seguinte
Bem, se você está tentando executar 20 instâncias dele em um servidor, não é de admirar que esteja tentando colocar tudo na memória. Você realmente deveria ter mencionado isso na pergunta, uma vez que coloca as coisas sob uma luz totalmente diferente.
precisa saber é o seguinte
Na verdade, não - como afirmei, o problema surge com um sistema físico em que pools de aplicativos raramente usados ​​roubam memória do cache do sistema de arquivos muito mais valioso. Suspeitei que isso fosse devido a algum cache de objeto nos pools de aplicativos e estava procurando alguns meios para reduzir / desativar o cache.
the-wabbit