Por que o OS X usa swap quando há muita "memória inativa"?

22

Estou usando o OS X há alguns meses (Lion e agora Mountain Lion). Eu tenho 8 GB no meu mini e quase diariamente agora ele se aproxima disso. Na máquina Windows 7 com 8 GB, nunca tive esse tipo de problema. De qualquer forma, li na net que a memória inativa é o cache de aplicativos dos programas que foram fechados recentemente e pode ser usado para uma reabertura mais rápida. E essa memória inativa pode ser liberada para um novo aplicativo, se necessário. Não é liberado. Em vez disso, o OS X começa a trocar. Então, minha pergunta é por que o OS X usa swap quando há muita "memória inativa"? Aqui uma tela mostra o que quero dizer:

insira a descrição da imagem aqui

Eu realmente espero que exista uma maneira de fazer com que o OS X use esses 2,69 GB antes de começar a trocar.

Balchev
fonte
Sim, isso é estranho. É um aplicativo que ocupa toda a RAM? Talvez o OSX limite os aplicativos a não usar mais de 80% de RAM de uma só vez. Inativo não significa que é grátis. Está reservado para alguma coisa.
Piotr Kula
Não - muitos aplicativos, navegadores, Eclipse e etc. Pelo que li, é gratuito, já que é um cache de aplicativos recentemente fechado. Deve haver uma maneira de fazer com que o OS X não troque quando houver memória inativa
Balchev
I pode reproduzi-lo a qualquer momento e pode fazer uma tela do monitor de atividade, se for necessário
Balchev
2
Memória inativa não é memória livre.
precisa saber é o seguinte
2
@kinokijuf, no entanto, deve atuar como memória livre quando não houver mais memória livre. Se a memória inativa é sempre trocada para o disco de qualquer maneira, não há sentido real em fazer a distinção ativo - inativo.
Pieter

Respostas:

18

A troca aconteceu aparentemente quando as páginas de RAM inativas estavam realmente ativas.

( Atualização: como foi esclarecido em um comentário, este não é o seu caso. Portanto, as pessoas com o mesmo problema podem pular para a regra horizontal .)

Ou seja, você tinha muitos programas em execução e o kernel trocou algumas páginas. Então você saiu de alguns programas. O kernel marca suas páginas de RAM como inativas. Mas ele não trocará as páginas de volta para a RAM até que essas páginas sejam necessárias. Isso resulta em páginas inativas e trocadas.

Por que não trocar preventivamente as páginas? Porque isso seria apostar contra as probabilidades: a longo prazo, você perde. Vamos pensar em um exemplo simplificado: dois programas A e B que não cabem na RAM ao mesmo tempo. O programa A ainda está em execução e todas as páginas trocadas pertencem a A. O programa B foi encerrado e todas as páginas inativas pertencem a B.

Se o kernel trocar preventivamente as páginas de A e imediatamente após:

  • O programa A precisa acessar suas páginas -> Você vence - as páginas já estão na RAM.
  • você lança B novamente -> Você perde - você "pagou" o custo de trazer as páginas para a RAM e agora precisa enviá-las de volta.
  • você inicia outro programa C -> Você perde se A e C não couberem na RAM ao mesmo tempo. Se eles se encaixam, você está quieto.

Também leve em consideração que a troca (gravação no disco) é mais cara que a troca (leitura do disco). O que torna essa "aposta" ainda mais desinteressante.

Resumindo: confie no seu kernel e não tente enganá-lo.


Atualização: verifica-se que a memória inativa não funciona, pois o artigo Usando o Monitor de Atividade para ler a Memória do Sistema levou muitas pessoas a acreditar que ela funciona. A definição dada no artigo para memória inativa está correta:

Esta informação está na RAM, mas não está sendo usada ativamente, foi usada recentemente.

Mas o exemplo a seguir é totalmente enganador e simplificado demais (como meu exemplo para ser franco):

Por exemplo, se você estiver usando o Mail e o encerrar, a RAM que o Mail estava usando será marcada como memória inativa. A memória inativa está disponível para uso por outro aplicativo, assim como Memória livre. No entanto, se você abrir o Mail antes que sua memória Inativa seja usada por um aplicativo diferente, o Mail abrirá mais rapidamente porque sua memória Inativa é convertida em Memória Ativa, em vez de carregá-la da unidade mais lenta.

Eu procurei por mais recursos online e acabei indo para este tópico na lista de discussão do kernel do darwin, que é bastante informativa. Citando Jim Magee (da equipe de darwin - eu acho):

Em resumo, o sistema VM do kernel, ao lidar com a pressão da memória, varre as páginas em uso e tenta mantê-las em equilíbrio entre as marcações ativas e inativas. As páginas inativas são digitalizadas para reutilização enquanto marcadas como inativas. Se eles foram reutilizados, são marcados como ativos e alguma outra página deve passar do estado ativo para o inativo para detectar se está em uso ativo. Portanto, inativo é um nome impróprio. É uma abreviação de "possivelmente inativo, vamos tentar verificar isso".

Como você descobriu, o saldo interno pelo qual nos esforçamos (atualmente) é de aproximadamente 2/3 ativo versus 1/3 inativo ...

Isso explica o comportamento que você observa. Ou seja, as páginas inativas que você vê pertencem a programas em execução que não foram usados ​​recentemente. Portanto, quando você inicia um novo programa, as páginas inativas são trocadas. Ao mesmo tempo, as páginas de outros programas são marcadas como inativas para manter a proporção 2/1 de ativo versus inativo.

O tópico também contém algumas sugestões para aprender mais sobre os componentes internos do darwin. Existem também algumas sugestões, caso você comece a investigar o uso da memória devido a problemas de beachball (que geralmente têm pouco a ver com isso).

A conclusão permanece a mesma: confie no seu kernel e não tente enganá-lo. :-)

m000
fonte
1
Oi, Não sei se você me entende - estou falando no momento em que você tem 100-200 MB de memória livre, 2,6 GB "inativos" e inicia outro programa, digamos eclipse, xcode e etc. O que acontece é que ele não usa esses 2,6 GB e, em vez de swap do memory.Not ativa certeza se você conseguir o que eu mean.Anyway, obrigado pela sua resposta
Balchev
Isso está claro agora. Talvez você deva adicionar o exemplo deste comentário à sua pergunta. Eu adicionei informações adicionais que acho que fornecem uma explicação adequada para o que você observa.
M000
Não tenho certeza se devo editar minha resposta original. Isso explica um caso diferente (como eu não entendi sua pergunta antes do seu comentário) e pode confundir as pessoas.
M000
Então, como o Radoo diz em seu comentário - "OS X é uma fera faminta". Eu não esperava que o OS X tivesse tanta fome de memória (tanto o Lion quanto o agora Mountain Lion) e é por isso que pensei que houvesse algo suspeito aqui. Obrigado por sua resposta atualizada.
Balchev
6

Você pode desativar a paginação com segurança se tiver RAM suficiente.

Experimente estes comandos.

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
sudo rm /private/var/vm/swapfile*

Em seguida, reinicie e verifique se o processo dynamic_pager não está mais em execução.

Verifique se não foram criados arquivos de troca /private/var/vm/.

Para reativar, tente os seguintes comandos:

sudo launchctl load -wF /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist

Você também pode desativar o Spotlight para liberar mais memória ram e reduzir a atividade do disco. Os seguintes comandos são usados ​​para desativar e ativar o Spotlight.

sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
sudo launchctl load -wF /System/Library/LaunchDaemons/com.apple.metadata.mds.plist
arundevma
fonte
Li na net que desativar a troca no OSX pode levar a um comportamento inesperado do sistema e travar. Isso é verdade?
Balchev 23/08/12
Quando sua memória estiver fraca, isso acontecerá. Mas se você tiver memória suficiente, como 8 Gb, isso não causará nenhum problema.
Arundevma
2
“Memória suficiente, como 8 Gb” - sorry, que é tão bonito ... :)
Bombe
0

Não há muito que você possa fazer. Por que faz isso? Porque é assim que o OS X funciona. A parte interessante é como a memória ocupada está aumentando a cada sono que o Mac recebe.

O que você pode fazer:

  1. Atualize a RAM.
  2. Execute o comando " limpeza " sagrado para limpar a maior parte da memória inativa, sempre que necessário.
  3. Desativar a troca http://osxdaily.com/2010/10/08/mac-virtual-memory-swap/

fonte
Olá, usei o comando de limpeza, mas na maioria das vezes libera menos da metade da memória "inativa". Eu li que desabilitar a troca no OSX pode levar a um comportamento inesperado do sistema e travar. Então, eu fui com 1) Agora está tudo bem com 16 gb :) Apenas essa quantidade de memória usada para servidores, não para desktops :) Obrigado por sua resposta
Balchev 23/08/2012
Eu tenho 16 GB no meu Macbook Pro, isso não é um servidor. :) É sabido que o OS X é uma fera faminta quando se trata de memória, especialmente quando vários aplicativos médios / grandes são usados ​​ao mesmo tempo. Consegui preencher todos esses 16 GB sem abrir nenhum software de edição de imagem / vídeo, apenas alguns jogos e aplicativos pequenos. A memória inativos foi de cerca de 4 GB ...
Você também deve levar em consideração que muitos aplicativos do OS X já têm 64 bits. Os aplicativos de 64 bits alocam mais memória do que os aplicativos de 32 bits, devido ao aumento do espaço de endereçamento.
0

O sistema está funcionando como projetado. Mesmo quando não há pressão na memória, pode fazer sentido escrever algumas páginas que não podem ser descartadas, mas que não foram usadas recentemente para trocar quando o sistema não está ocupado. Dessa forma, se houver pressão de memória posteriormente, essas páginas poderão ser removidas da RAM sem precisar primeiro gravá-las para serem trocadas enquanto o sistema estiver ocupado.

David Schwartz
fonte
1
é mal projetado então. é muito agressivo na alocação e uso de espaço de troca.
Mendota #
Por que isso Importa? Se houver muita troca livre, alocar espaço de troca é inofensivo. Isso é especialmente verdade quando o swap não contém os dados necessários porque a remoção das alocações não tem custo. Esse é um bom design - fazer um trabalho árduo quando é quase gratuito, em vez de adiá-lo para mais tarde, quando o sistema estiver sob pressão.
David Schwartz
2
seu design é ruim quando é muito agressivo e causa interrupções ou interrupções nos programas que, por engano, é marcado como inativo e começa a mudar para troca. Enquanto isso, há mais oito shows grátis em RAM: /
mendota
Eu concordo com Mendota. Depois de desativar completamente a troca, meu sistema está funcionando sem problemas.
Anton Kuzmin 19/09
@AntonKuzmin Isso realmente não tem nada a ver com o que é essa questão. Se você ler esta pergunta, ela não diz nada sobre gagueira ou qualquer problema que seja.
David Schwartz