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

9

Administro um servidor Windows 2008 (também no Amazon EC2) executando o IIS e um aplicativo da Web .NET4. Recebi um alerta de memória no outro dia e olhei, e com certeza a memória do processo havia aumentado ao longo do tempo através de algum tipo de vazamento lento. Ele não cresceu muito, assim como 60 a 200 milhões, mas o suficiente estava acontecendo com a caixa que ultrapassava nosso limite bastante baixo (75%) para acionar o monitor.

Reciclei o pool do aplicativo e a memória foi liberada e notei ao revisar as estatísticas que o espaço de troca estava sendo usado significativamente e que mais de 1 GB dele 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 não me acostumar até você ficar sem memória. Essa caixa nunca foi acima de 75% do uso de memória. Isso é uma coisa do Windows ou .NET ou Amazon? Eu suspeito que exista um vazamento de memória muito maior neste aplicativo do que se suspeita - não está vazando de 60M para 200M, está vazando de 60M para 1.2GB, mas muito disso está de alguma forma ficando "frio" e sendo pressionado para trocar?

Eu tenho a reciclagem de memória definida no pool de aplicativos, mas ela dispara a memória cheia da caixa, para que esse aplicativo possa ficar realmente muito grande antes de ser reciclado automaticamente.

Eu poderia configurar a reciclagem "cronometrada" regular, mas essa é uma solução alternativa, solicitarei ao desenvolvedor que corrija o aplicativo, mas preciso entender o que está acontecendo aqui com o uso da troca para garantir que estou entendendo direito.

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

Eu vejo o processo w3wp.exe no taskmgr mostrando essa Memória: 211.000k. Mas quando eu o reiniciei (ele está em seu próprio pool de aplicativos e é o único aplicativo na caixa), seu uso de memória caiu para o ponto inicial normal de 60M e como 1 GB + de troca também foi liberado. No taskmgr, eu tinha apenas as estatísticas usuais da Memória (Conjunto de Trabalho Privado), mas vi a troca mudar através do meu outro monitoramento (Cloudkick). Voltando e analisando hoje, a memória está recuperando até 195M no processo (1,2 GB no total) e a troca subiu de 1,0 GB para 1,1 GB, mas nem sempre voltou até onde estava (gráficos ao longo do tempo, é um lenta fluência).

Estou menos preocupado com esse aplicativo específico e mais apenas com o entendimento de quando o Windows troca e como ele usa isso, e com o que se preocupar com a memória do Windows e o uso de troca em geral.

Ernest Mueller
fonte
4
BTW, pelo menos Linux vai trocar páginas de forma oportunista, se eles não foram acessados em um longo tempo, mesmo se o sistema não está afiando perto de usar toda a RAM disponível. Ele faz isso para liberar memória para o cache de disco, amortecedores, etc.
EEAA
Quanta memória esta instância possui? Você está dizendo que o processo w3wp.exe está atingindo 1 GB? Este é o único site em execução nesse pool de aplicativos?
Kev
@ KevΩ Adicionado mais informações no Q, a seu pedido.
Ernest Mueller
@ErikA, bom saber, eu acho que ouvi os caras que dizem "se você está trocando, você já tem desempenho ruim, basta desativar a troca completamente e não ficar sem memória RAM", então eu não ' Não assisto trocar tanto.
Ernest Mueller
Se o seu disco está debulhando, é verdade. Se trocar, está abrindo espaço para buffers e coisas do tipo.
Bart Silverstrim

Respostas:

17

Windows e linux têm duas estratégias diferentes de página / troca.

Linux

O Linux deseja evitar o uso de espaço de troca e aguarda até o último momento possível. Se você vir uma grande quantidade de trocas no linux, é provável que seu sistema esteja ou esteja com problemas. Essa estratégia é boa para minimizar a E / S geral do disco, que é a parte mais lenta do seu sistema, mas mais fraca para sistemas com períodos alternados de carga leve e pesada (e honestamente, é a maioria de nós). Os momentos em que sua carga já é pesada agora serão sobrecarregados pela E / S "extra" do disco ou, dito de outra forma, você precisará projetar as compilações do servidor para ter RAM suficiente que você não troque nem durante o tempos de carregamento esperados mais altos.

janelas

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 será lida / gravada a partir do "cache" primeiro, se puder. Essa estratégia é boa para reduzir sua carga ao longo do tempo; quando o sistema fica ocupado e precisa trocar de página, a página atual já está no disco e metade do trabalho já está concluída. Essa abordagem fazia muito sentido quando o Windows era jovem, 32 MB (esqueça GB) ainda possuía muita RAM e a necessidade freqüente de usar 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 espalhar a E / S do disco de maneira 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 a necessidade de gravações extras no disco ao carregar um programa pela primeira vez. Tudo isso significa que você pode projetar seu sistema para precisar apenas de RAM suficiente para algo menor que a carga mais alta esperada, para que você possa ter pelo menos um desempenho aceitável o tempo todo, com custos reduzidos.

Convergência

Esse conceito de medir ou prever a carga em um ambiente de teste e depois alocar recursos de produção quando a carga é conhecida é um desenvolvimento relativamente recente na construção do sistema, tornado possível, ou pelo menos prático, em parte com o advento dos servidores virtuais e, em seguida, na nuvem . Dependendo da sua carga, você pode até projetar o sistema para que ele nunca precise ser trocado. Nesses casos, o Windows permite desativar a paginação e se comportar mais como um sistema Linux. No entanto, você precisa ter cuidado; se o design do sistema exigir mais memória do que o esperado, você poderá ter problemas dessa maneira.

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

Joel Coel
fonte
Muito específico na estratégia final do Windows, obrigado! Também validado por este KB da Microsoft, encontrei ... support.microsoft.com/kb/2267427
Ernest Mueller
1
O Linux não espera necessariamente o último momento possível, a menos que você defina explicitamente vm.swappiness = 0. No valor padrão 60, ele trocará as páginas que não foram tocadas por um tempo.
Kjetil Joergensen
@KjetilJoergensen certifique-se de ler a última seção sobre convergência.
Joel Coel
1
@JoelCoel I incondicionalmente retrair minha crítica :)
Kjetil Joergensen
7

O Windows (e Linux e outros sistemas operacionais semelhantes ao Unix) moverão as 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 geralmente alocam mais memória do que vão usar imediatamente - isso pode incentivar o Kernel a paginar algumas coisas que não foram tocadas recentemente em segundo plano, para que os aplicativos não vejam o atraso na paginação quando eles começarem repentinamente usando essa alocação.

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

Outra coisa a ter em atenção é que, quando algo for paginado e depois lido novamente, o kernel não o removerá do arquivo de paginação até que o arquivo esteja cheio ou a página na RAM seja alterada. Dessa forma, se precisar paginar essa parte novamente, poderá fazê-lo sem precisar gravar as páginas no disco: o conteúdo já está lá. Isso pode melhorar muito o desempenho em situações em que a confirmação excessiva de memória ficou tão ruim que causou a distorção dos arquivos de página (um número significativo de páginas é constantemente mapeado 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, caso essas páginas precisem ser mapeadas ou RAM para liberar espaço mais tarde. No Linux, o valor "SwapCached" em/proc/meminfomostra quantos dados estão presentes em páginas que têm 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, existem contadores relevantes de monitor de desempenho que você pode consultar).

tl; dr: Isso é normal. Um Kernel do sistema operacional moderno tentará ser inteligente e maximizar a quantidade de 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 a E / S, se precisar paginar esses bits. de RAM mais tarde. As chances são, por mais intuitivas que sejam, que esse uso de arquivos de paginação dessas duas maneiras, mesmo que você não tenha pouca memória RAM, esteja melhorando seu desempenho geral em vez de diminuí-lo.

David Spillett
fonte