Temos aproximadamente 200 servidores, Hyper V, File Cluster e IIS, que estão enfrentando o mesmo problema; um evento ocorre no servidor através do uso normal que atinge o máximo ou o máximo possível da RAM no servidor. Quando isso acontece, o serviço SVCHOST / Estação de Trabalho, especificamente (eliminado isolando o serviço Estação de Trabalho do próprio SVCHOST) para de liberar identificadores / threads e a memória usada por esse serviço nunca é liberada. Em alguns casos extremos, temos serviços de estação de trabalho que usam até 40 GB de RAM em um servidor de 255 GB. Também encontrando mais de 40 milhões de identificadores em alguns casos.
Na reinicialização, é claro que o problema desaparece e não aparece novamente até que toda a memória tenha sido usada, digamos, pelo processo W3 ou pelas VMs HyperV, depois disso, o serviço Estação de Trabalho começa a pegar toda a RAM. O processo é muito lento e pode levar semanas / meses, dependendo da quantidade de RAM em um servidor.
Tanto os servidores Hyper V como os servidores IIS acessam compartilhamentos para arquivos de trabalho; esses compartilhamentos estão no armazenamento SSD; portanto, eles têm um bom desempenho. Instalamos todos os patches atuais, mas não mudamos para o R2, pois temos muitas ferramentas implementadas que tornarão essa etapa significativa e não podemos encontrar nenhuma indicação clara de que isso seria corrigido no R2.
Executamos o ProcMon e outras ferramentas, mas nos servidores mais problemáticos essas ferramentas nem sequer são executadas. Por outro lado, os resultados fornecidos apenas mostram que parece haver realmente um vazamento de memória nesse processo.
Existe uma maneira de liberar a memória desse processo ou evitar o bug todos juntos? Não queremos ter que reiniciar e não podemos reiniciar o processo quando estiver em um estado de erro. O processo fica congelado.
Estamos tentando evitar reinicializações regulares para 'corrigir' esse problema, para que todas as respostas sejam apreciadas.
Respostas:
Eu tive um problema estranhamente semelhante em que o svchost estava destruindo o desempenho do servidor.
A solução: Acontece que eu tinha um log de eventos completo. Eu limpei e tudo estava de volta e funcionando como se nada tivesse acontecido.
(Eu também recomendo alterar o tamanho do log de eventos do padrão, veja abaixo)
Para definir o tamanho máximo do log usando a interface do Windows
- Inicie o Visualizador de Eventos.
- Na árvore do console, navegue e selecione o log de eventos que deseja gerenciar.
- No menu Ação, clique em Propriedades.
- Em Tamanho máximo do log (KB), use o controle giratório para definir o valor desejado e clique em OK.
Parece exatamente o que está acontecendo aqui, mas acabou sendo uma solução muito fácil. Uma reinicialização resolveria temporariamente o problema, mas assim que algo tentasse gravar no log, tudo ficaria fora de controle e continuaria consumindo recursos.
Espero que isto ajude!
fonte
Não há como liberar (adequadamente) externamente (adequadamente) a memória alocada ou manipular recursos sem matar o aplicativo ofensivo.
Você está tendo um vazamento de memória e recursos. A única maneira de resolver o problema é encontrar o vazamento e evitar seu gatilho (se possível) ou corrigi-lo no nível do código-fonte; No último caso, você precisa da ajuda da Microsoft para produzir o patch, mas parece que eles esperam que você diga "exatamente" onde está realmente o problema.
Você pode tentar encontrar o culpado, identificando o vazamento de memória / recurso usando, por exemplo, o MS Application Verifier
fonte
Criar RAM é fácil, mas não há solução.
Sugiro Sysinternals RAMMAP ou VMMAP para uma investigação mais aprofundada. Com essas ferramentas, você pode ver melhor o que acontece. muitas vezes é um problema de metarquivo.
Desde o Server 2008, temos esse problema com todos os servidores de terminal que ficam sem memória com um consumo inacreditável de memória ao longo do tempo ao iniciar aplicativos a partir do compartilhamento.
Nossa solução alternativa é hospedar esses aplicativos em um Terminal Server separado e limpar frequentemente o consumo de memória.
Fazemos isso com um aplicativo de linha de comando c ++ auto-projetado usando
SetProcessWorkingSetSize () com SeDebugPrivilege em todos os processos
É altamente recomendável não fazer algo assim;)
fonte