Por que o Windows 2008 usa swap antes que a memória esteja cheia?

9

Eu administro um servidor Windows 2008 (bem, no Amazon EC2) executando o IIS e um aplicativo da Web .NET4. Eu tenho um alerta de memória no outro dia e fui e olhei, e com certeza a memória do processo tinha crescido ao longo do tempo através de algum tipo de vazamento lento. Ele não cresceu muito, apenas como 60M a 200M, mas o suficiente estava acontecendo com a caixa que passou por cima do nosso limite muito baixo (75%) para desligar o monitor.

Reciclizei o pool do aplicativo e a memória foi liberada, e notei, ao analisar as estatísticas, que o espaço de troca estava sendo usado significativamente e que mais de 1 GB foi liberado com essa reciclagem.

Talvez essa seja uma pergunta básica, mas eu sou um cara do UNIX e estou acostumado a trocar de roupa não sendo usado até que você esteja sem memória. Esta caixa nunca foi superior a 75% de uso de memória. Isso é uma coisa do Windows ou uma coisa .NET ou uma coisa da Amazon? Eu suspeito que há um vazamento de memória muito maior neste aplicativo do que suspeito - não está vazando de 60M para 200M, está vazando de 60M para 1.2GB, mas muito disso está de alguma forma indo "frio" e sendo empurrado para swap?

Eu tenho o conjunto de reciclagem de memória no pool de aplicativos, mas ele dispara a memória completa da caixa, portanto, esse aplicativo pode ficar realmente muito grande antes de ser reciclado automaticamente.

Eu poderia configurar uma reciclagem regular "cronometrada", mas isso é uma solução alternativa, conseguirei que o desenvolvedor corrija o aplicativo, mas precise entender o que está acontecendo aqui com o uso da troca para ter certeza de que estou entendendo isso corretamente. / p>

Edite com mais informações: memória de instância: 1,7 GB troca: 4,5 GB

Eu vejo o processo w3wp.exe no taskmgr mostrando essa memória: 211.000k. Mas quando eu reiniciei (é em seu próprio pool de aplicativos, e é o único aplicativo na caixa), seu uso de memória desceu para o seu ponto de partida normal de 60M e como 1 GB + de swap também liberado. No taskmgr, acabei de ter o status usual de Memória (Private Working Set), mas vi a troca mudar através do meu outro monitoramento (Cloudkick). Voltando atrás e olhando para ele hoje, a memória está de volta a 195M no processo (1,2 GB no total) e o swap subiu de 1,0 GB para 1,1 GB, comprando não todo o caminho de volta onde estava (fazendo gráficos ao longo do tempo, é um creep lento).

Estou menos preocupado com este aplicativo específico e mais preocupado em entender quando o Windows faz a troca e como ele usa isso, e o que deve preocupar com a memória do Windows e o uso de troca em geral.

    
por Ernest Mueller 26.08.2011 / 16:50

2 respostas

17

O Windows e o Linux têm duas estratégias de troca / troca de páginas diferentes.

Linux

O Linux quer evitar o uso do espaço de troca e aguarda até o último momento possível. Se você vir uma grande quantidade de swap no linux, seu sistema provavelmente está ou está com problemas. Essa estratégia é boa para minimizar o i / o geral do disco, que é a parte mais lenta do sistema, mas mais fraca para sistemas com períodos alternados de carga leve e pesada (e honestamente, isso é a maioria de nós). Os momentos em que sua carga já está pesada agora serão sobrecarregados pelo disco extra "i / o" ou, em outras palavras, você precisa projetar seu servidor com o objetivo de ter memória suficiente que você não troca mesmo durante os maiores tempos de carga esperados.

Windows

O Windows quer tratar a memória como um mero cache do arquivo de paginação. Sua memória real está sempre no disco, mas irá ler / gravar a partir do "cache" primeiro, se puder. Essa estratégia é boa para equilibrar sua carga ao longo do tempo; quando o sistema fica ocupado e precisa trocar páginas, a página atual já está no disco e metade do trabalho já está concluído. Esta abordagem fez grande sentido quando o Windows era novo, 32MB (esqueça GB) ainda era muito RAM, e a frequente necessidade de usar o espaço de troca era um dado. Ainda hoje isso é bom para cargas de trabalho que alternam entre cargas leves e ocupadas, pois ajuda a distribuir o disco de modo mais uniforme ao longo do tempo.

As versões modernas do Windows têm otimizações adicionais, como SuperFetch, para pré-carregar e preparar páginas de memória no disco e na RAM quando a carga é leve, para ajudar a evitar gravações extras de disco ao carregar um programa pela primeira vez. Tudo isso significa que você pode projetar seu sistema de forma que ele precise de RAM suficiente para lidar com algo menor que a carga esperada mais alta, e você ainda pode ter um desempenho pelo menos aceitável o tempo todo, com custos reduzidos.

Convergência

Este conceito de medir ou prever a carga em um ambiente de teste primeiro e depois alocar recursos de produção quando essa carga é conhecida é um desenvolvimento relativamente recente na construção de sistemas, tornado possível, ou pelo menos prático, em parte com o advento de em seguida, servidores em nuvem. Dependendo da sua carga, você pode até projetar o sistema de tal forma que ele nunca precise trocar nada. Nesses casos, o Windows permite que você desative a paginação e se comporte mais como um sistema linux, mas é preciso ter cuidado: se o design do seu sistema exigir mais memória do que você acha que pode se meter em problemas dessa maneira.

Por outro lado, os kernels Linux modernos estão mais dispostos a trocar para o disco de forma oportunista do que eram antes. Portanto, a diferença nas estratégias de gerenciamento de memória entre os dois sistemas é agora menos distinta do que costumava ser, mas ainda está presente. Ambos os sistemas têm seus méritos e cada um observa o outro para ver quais avanços eles podem copiar.

    
por 26.08.2011 / 19:12
7

O Windows (e o Linux e outros sistemas operacionais Unix-a-like) moverão páginas que não foram usadas por algum tempo no disco para liberar espaço para buffers e cache para acelerar a atividade de E / S ativa. Além disso, os aplicativos frequentemente alocam mais memória do que eles vão usar imediatamente - isso pode encorajar o Kernel a mostrar algumas coisas que não foram tocadas recentemente em segundo plano, para que esses aplicativos não vejam o atraso de paginação quando de repente iniciam usando essa alocação.

No Linux você pode ajustar (ou bloquear) esse comportamento alterando os valores "swappiness" relevantes no sistema de arquivos /proc - sem dúvida existem valores de registro que você pode alterar para alterar o comportamento do Windows também.

Outra coisa a ter em conta é que quando algo foi paginado e depois lido novamente, o kernel não irá removê-lo do arquivo de paginação até que o arquivo esteja cheio ou a página na RAM seja alterada. Desta forma, se precisar voltar a página para fora, pode fazê-lo sem precisar escrever as páginas no disco: o conteúdo já está lá. Isso pode melhorar muito o desempenho em situações em que a superalocação de memória tenha sido tão ruim a ponto de causar a distorção dos arquivos de paginação (um número significativo de páginas sendo constantemente mapeadas para dentro e para fora). É provável que você descubra que alguns dados foram enviados por esse vazamento de memória e, desde então, foram lidos novamente, mas não foram apagados do disco, no caso de essas páginas precisarem ser mapeadas ou RAM para liberar espaço novamente mais tarde. No Linux, o valor "SwapCached" em /proc/meminfo mostra quantos dados estão presentes nas páginas que possuem cópias idênticas na RAM e no disco. O Windows, sem dúvida, usa a mesma otimização (ou algo semelhante), mas não estou exatamente onde procurar para ver o quanto isso está acontecendo (sem dúvida, há contadores de monitor de desempenho relevantes que você pode consultar).

tl; dr: Isso é normal. Um moderno Kernel do sistema operacional tentará ser inteligente e maximizar a quantidade de memória RAM que pode usar como cache para salvar operações de E / S e, às vezes, terá dados copiados no disco e na RAM para salvar E / S se precisar excluir esses bits de RAM depois. As chances são, por mais intuitivas que sejam, de que esse uso de arquivos de paginação dessas duas maneiras, mesmo que você não esteja atualmente com pouca memória RAM, está melhorando seu desempenho geral em vez de diminuí-lo.

    
por 26.08.2011 / 18:17