Como explicar o uso de memória no Windows Server fora da lista de processos em execução

9

Eu tenho um Windows 2003 Server rodando um pouco devagar, onde a carga de confirmação e o uso do arquivo de paginação aumentam e aumentam até eu reiniciar. Para consertar isso, preciso descobrir o que está consumindo toda a memória, e é aí que está o grande mistério.

Estatísticas atuais do Gerenciador de tarefas:

Physical Memory (K): 2096400
Commit Charge (K):   5364848
Page file usage:     5.11 GB

Tudo bem, então vamos abrir o SysInternals Process Explorer e verificar o tamanho do conjunto de trabalho de tudo o que está sendo executado. O maior culpado é uma instância do Tomcat usando 121.980K WS, 481.284K VM Size. Nada ali chega perto de explicar a taxa de confirmação de 5 GB.

O passo seguinte: SysInternals pslist : pslist -m, dividir-se a saída da coluna por coluna e calcular somas para os 61 processos que são relatados.

SUM (Working Set)  : 681,484 K
SUM (Private Bytes): 593,424 K

Estou basicamente entendendo mal o que as ferramentas estão relatando? Eu sempre tive a impressão de que um sistema operacional realmente comprometeria muito menos memória do que a quantidade total de memória virtual mapeada por um processo, supondo que ele nunca usaria tanto assim, e que observar a VM aqui é Um arenque vermelho.

jpdaigle
fonte
1
Atualização: Sim, este sistema está paginando e, frequentemente, recebo o aviso "Falha na memória virtual". Sempre que recebo o aviso, verifico as estatísticas da memória e não há nenhum processo que pareça estar se comportando particularmente mal, mas a estatística Memória, bytes confirmados está sempre acima de 5 GB.
jpdaigle

Respostas:

1

JP, acredito que seu comentário de que este é um servidor de teste de compilação / unidade automatizado que esteja executando menos do que o código estável diz tudo. Meu palpite é que esse servidor precisa ser reinicializado com frequência por causa do código instável em execução, provavelmente possui vazamentos de memória que estão dando os sintomas que você está vendo. Os vazamentos de memória não serão listados em nenhuma das árvores de processo dos processos em execução, pois são memória que é capturada por processos que não existem mais e ainda são alocados, mesmo que o processo associado a eles já se tenha perdido.

Obtenha uma janela de manutenção frequente para permitir a reinicialização automática da máquina, talvez noturnamente, algumas vezes por semana ou semanalmente, dependendo da velocidade com que esse comportamento começa a exibir problemas de desempenho.

Há alguns servidores do Oracle Application Servers no Windoze, que precisavam ser reinicializados duas vezes por dia. Expulsamos os usuários na hora do almoço e no meio da noite todos os dias. Isso foi há alguns anos, com um código de produção supostamente estável da Oracle.

Kevin K
fonte
2

Desculpe colar apenas alguns links - mas estamos usando algumas técnicas para encontrar vazamentos de memória, usando o logparser e o powershell, então vou compartilhar.

http://blogs.msdn.com/debuggingtoolbox/archive/2008/08/22/powershell-script-chart-and-statistics-from-top-20-objects-leaking.aspx

(O site Nunca duvide do teu depurador é excelente): http://blogs.msdn.com/carloc/archive/2007/09/14/something-you-need-to-know-before-start-debugging.aspx

Também fornecerei um link para a excelente visão de Mark Russinovich sobre o uso de memória no Windows:

http://blogs.technet.com/markrussinovich/search.aspx?q=memory&p=1

Além de abrir casos reais da Microsoft, o site da Equipe de Desempenho também possui muitas informações boas: http://blogs.technet.com/askperf/Default.aspx?p=2

mctsonic
fonte
1

A ferramenta principal para ajudar a diagnosticar isso é comum. Os contadores que eu observaria (para começar) são:

Memória, Bytes Confirmados, é uma medida da demanda por memória virtual
Processo, Conjunto de Trabalho, _ Memória virtual total em "ativo" usa
Arquivo de Paginação,% de arquivo de paginação em uso
Memória, Páginas / s (este não é necessariamente um indicador de pouca memória , embora todos pareçam supor que sim)
Memória, saída de páginas / s Quantas páginas de memória virtual foram gravadas no arquivo de paginação para liberar quadros de página de RAM para outros fins a cada segundo

Memória, Memória de bytes de cache,
Memória de bytes não agrupados de pool
, Memória de bytes paginados de pool
, Total de bytes de código do sistema
Memória, Total de bytes de driver de sistema

quando essa soma chegar perto de 2 GB, você terá problemas de desempenho geralmente devido à arquitetura de 32 bits

Memória, MBytes disponíveis - mede a quantidade de RAM disponível para atender às demandas de memória virtual (novas alocações ou para restaurar uma página do arquivo de paginação).

Consulte também http://members.shaw.ca/bsanders/WindowsGeneralWeb/RAMVirtualMemoryPageFileEtc.htm

Jim B
fonte
Link interessante. Neste servidor, estou vendo o Conjunto de Trabalho do Processo total em 640 MB, mas "Memória, Bytes Confirmados" é de 5,4 GB. Nenhum dos outros contadores mencionados é muito alto. Frequentemente recebo o aviso "Ficando sem memória virtual", e é por isso que estou investigando. Adicionando comentário ao OP.
jpdaigle
1

Há quanto tempo esse servidor está em execução desde a última reinicialização? É um fato infeliz da vida que o Windows tenha vazamentos de memória. ou seja, a memória alocada nem sempre é liberada de volta ao sistema. Os sintomas são exatamente o que você está vendo. Se você ainda não o fez, sugiro reiniciar pelo menos uma vez por semana. Muitos data centers reiniciam o Windows todos os dias, pois isso reduz bastante as chamadas de suporte. É claro que isso é muito mais fácil quando você usa clusters, porque não há tempo de inatividade.

John Gardeniers
fonte
0

Dizem que existe um administrador de sistema em algum lugar que realmente entende as estatísticas de memória do Windows, mas nunca as conheci.

No entanto, geralmente não é muito difícil encontrar um processo que se comporte mal. Tente usar o Perfmon para examinar os vários contadores de processos, como identificadores ou falhas de página / s.

JR

Pensamentos adicionais: você tem certeza de que está com pouca memória? O principal é se você está recebendo paginação. Se não houver paginação, você não terá pouca memória. Usando o PerfMon, dê uma olhada no contador Memória - Páginas / s.

John Rennie
fonte
Não vejo nada óbvio nos processos em execução. Existe alguma maneira possível de a memória não ser recuperada pelo sistema operacional após a saída de um processo? Este é um servidor automatizado de teste de compilação / unidade. Portanto, é claro que os processos travam o tempo todo, pois ele sempre executa compilações de ponta criadas automaticamente a partir do SVN.
jpdaigle
Ver a minha edição para mais alguns pensamentos
John Rennie
0

Lembre-se de que o conjunto de trabalho é o pouco de memória que é realmente representado pela memória física REAL. você também tem sua carga de memória virtual e o Windows compartilha o código da página, alguns pedaços do MFC serão compartilhados entre vários processos sem duplicar o uso da memória. Além disso, você tem o desejo incessante do Windows de manter o cache do sistema de arquivos o maior possível (eu já tinha aumentado para 800 MB em um laptop de 2,5 GB antes).

O gerenciamento de memória do Windows é muito robusto. No entanto, quando o Windows inicia a paginação, as coisas ficam feias e você SEMPRE precisa deixar espaço para o cache do sistema de arquivos - sempre sempre sempre. Rotineiramente, tenho que desligar e reiniciar o Firefox quando minhas mais de 80 guias controlam seu consumo de memória de até 1,2 gb / 1,2 + gb.

O Windows também desfoca um pouco a linha, entre as páginas que estão no cache e as páginas listadas como memória / conjunto de trabalho.

Chris K
fonte