Como desativar o Mac OS X de usar swap quando ainda há memória "Inativa"?


61

Um fenômeno comum no meu uso diário (e vários outros de acordo com várias postagens na Internet) do OS X, o sistema parece ficar lento sempre que não há mais memória "Livre" disponível. Supostamente, isso ocorre devido à troca, pois a atividade de disco pesado é aparente e o vm_stat relata muitas paginações. (Corrija-me do errado)

No entanto, a quantidade de memória RAM "Inativa" geralmente fica em torno de 12,5% a 25% de toda a memória disponível (^ 1.) Quando a troca é iniciada / ocorre / termina.

De acordo com http://support.apple.com/kb/ht1342 :

Memória inativa

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

Por exemplo, se você estava usando o Mail e o encerrou, a RAM que o Mail estava usando é marcada como memória inativa. Essa 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 carregar o Mail no disco rígido mais lento.

E de acordo com http://developer.apple.com/library/mac/#documentation/Performance/Conceptual/ManagingMemory/Articles/AboutMemory.html :

A lista inativa contém páginas que atualmente residem na memória física, mas que não foram acessadas recentemente. Essas páginas contêm dados válidos, mas podem ser liberadas da memória a qualquer momento .

Então, basicamente: quando um programa é encerrado, sua memória fica marcada como Inativa e deve ser claimable a qualquer momento. Ainda assim, o OS X prefere começar a trocar a memória pelo arquivo Swap em vez de apenas reivindicá-la, sempre que a memória "Free" ficar baixa.

Por quê? Qual é a vantagem desse comportamento em, digamos, liberar instantaneamente a memória inativa e nem tocar no arquivo de troca? Algumas fontes (^ 2.) Indicam que o OS X pagina a memória "Inativa" para trocar antes de liberá-la, mas isso não faz sentido agora, se a memória puder ser liberada da memória a qualquer momento ? Trocar é caro, liberar é barato, certo?

Esse comportamento pode ser alterado usando alguma preferência ou hack conhecido? (De preferência um que não inclua a desativação de swap / dynamic_pager por completo e a reinicialização ...)

Aprecio o comando de limpeza , bem como o conceito de Reparar permissões de disco para forçar um pouco de memória livre, mas essas são maneiras de forçar dolorosamente mais memória livre do que realmente consertar a lógica de decisão de troca / liberação ...

Entre uma pergunta semelhante foi feita aqui: http://forums.macnn.com/90/mac-os-x/434650/why-does-os-x-swap-when/ e aqui: http: //hintsforums.macworld .com / showthread.php? t = 87688 mas, embora os OPs tenham respondido novamente à pergunta principal, nenhuma das respostas endereça uma resposta para ela ...

^ 1. ATUALIZAÇÃO 17-mar-2012 Desde que postei essa pergunta pela primeira vez, passei de 4 GB para 8 GB de RAM instalada, e o problema permanece. A quantidade de RAM "Inativa" era de 0,5 GB a 1,0 GB antes e agora é tipicamente de 1,0 a 2,0 GB quando a troca inicia / ocorre / termina, ou seja, parece que cerca de 12,5% a 25% da RAM é preservada como Inativa pelo OSX lógica do kernel.

^ 2 Por exemplo, https://apple.stackexchange.com/questions/4288/what-does-it-mean-if-i-have-lots-of-inactive-memory-at-the-end-of-a-work- dia :

Depois que toda a sua memória é usada (a memória livre é 0), o sistema operacional grava a memória inativa no arquivo de swap para liberar mais espaço na memória ativa.

ATUALIZAÇÃO 17 / mar / 2012

Aqui está um resumo dos métodos sugeridos para ajudar até agora:

O comando de limpeza

"Usado para aproximar as condições iniciais de inicialização com um cache de buffer de disco frio para análise de desempenho. Não afeta a memória anônima que foi alocada através de malloc, vm_allocate, etc".

Isso é útil para impedir que o osx troque o cache do disco (o que é ridículo que o osx realmente faça isso em primeiro lugar), mas com a desvantagem de que o cache do disco seja liberado, o que significa que, se o cache do disco não estivesse prestes a ser trocado, seria possível acabar com um cache de buffer de disco frio, provavelmente afetando negativamente o desempenho.

O aplicativo FreeMemory e / ou reparação de permissões de disco para forçar um pouco de memória livre

Não ajuda a liberar memória, movendo apenas alguns gigabytes de conteúdo da memória da ram para o hd. No final, isso causa muitos swap-ins quando tento usar os aplicativos que estavam abertos ao liberar memória, pois grande parte de sua vm está agora em swap.

Acelerando a alocação de troca usando o dynamicpagerwrapper

Parece uma coisa boa a ser feita para acelerar o uso da troca, mas não resolve o problema da troca osx em primeiro lugar enquanto ainda há memória inativa.

Desativando a troca desativando o dynamicpager e reiniciando

Isso forçará o osx a não usar swap no preço do sistema travado quando toda a memória for usada. Não é uma alternativa viável ...

Desativando a troca usando um dynamicpager hackeado

Semelhante à desativação do dynamicpager acima, alguns trechos dos comentários da postagem do blog indicam que esta não é uma solução viável: "A memória inativa está alta como sempre". "quando o sistema está ficando sem memória, todo o sistema trava ...", "se você consumir toda a memória do mac, a máquina provavelmente trava"

Para resumir, ainda não conheço uma maneira de desativar o Mac OS X de usar swap quando ainda há memória "Inativa". Se não for possível, talvez pelo menos haja uma explicação em algum lugar do por que o osx prefere trocar a memória que pode ser liberada da memória a qualquer momento ?


11
Eu tenho esse problema, ilustrado por estes números do Activity Monitor: bassistance.de/i/f2322d.png Quase nenhuma memória livre, mas muita memória inativa. Em vez de reivindicar isso, o OSX prefere começar a trocar bastante, como você pode ver pelas páginas de 40 GB.
Jörn Zaefferer

Tenho bastante memória livre e ainda há vários GB de swap sendo usados. 16GB rMBP.
Steven Lu

11
Aparentemente, algumas pessoas têm relatado benefícios de correr "purga" apple.stackexchange.com/questions/67031/... não negativo
rogerdpack

Respostas:


19

Por definição, memória inativa é a memória pronta para ser paginada e paginá-la pode envolver gravá-la para troca. Esse não é nenhum tipo de problema ou questão que deve ser otimizado; na verdade, ele está funcionando como projetado .

Infelizmente, os criadores de suporte técnico não são desenvolvedores de kernel, e a citação do artigo de suporte da Apple Knowledge Base está errada quando afirma que a memória inativa é a memória não utilizada pelos programas. Quando você sai de um programa, toda a memória residente fica livre; não para em inativo. No entanto, o segundo link para o site do desenvolvedor que descreve como o gerenciamento de memória funciona é um bom recurso, se lido completamente.

Existem muitos conceitos errados sobre o que "memória inativa" significa no OS X. Ao contrário dos conceitos errados, nem toda memória inativa está vazia, não utilizada, em cache ou eliminável. De fato, a memória ativa também pode ser armazenada em cache ou removível, se tiver sido acessada recentemente. Muita memória inativa também contém dados que não podem ser simplesmente descartados. Se fosse descartado, os programas travariam, porque as páginas descartadas teriam dados válidos (como diz a citação do lado do desenvolvedor do OS X) e os programas esperam que os dados armazenados na memória (virtual) não desapareçam.

A memória inativa contém os mesmos tipos de dados que a memória ativa. A única diferença é que o OS X notou que alguns pedaços de memória não são lidos ou gravados há algum tempo.

O motivo pelo qual o OS X classifica alguma memória como inativa e outras regiões como "ativa" tem a ver com paginação. Quando a memória estiver fraca, você precisará paginar alguns dados. A questão é: quais dados? Se você paginar os dados que um programa precisa imediatamente imediatamente, ele desperdiçará tempo e não realizará nada. Portanto, você deseja paginar a memória que um programa não precisará usar imediatamente novamente.

Antecipar quais páginas provavelmente serão desnecessárias no futuro é difícil, porque um programa pode usar sua memória virtual como quiser e não dizer nada ao sistema operacional sobre quais são seus planos. Mas como heurística, a maioria dos programas é "pegajosa" no uso de memória; se eles não tiverem usado algum pedaço de memória há algum tempo, provavelmente continuarão sem usar essa memória e provavelmente continuarão usando a memória usada recentemente.

Portanto, quando o sistema operacional decide paginar alguns dados, é necessária a estratégia de trocar páginas que não foram usadas recentemente. É por isso que o OS X classifica a memória que está sendo ocupada pelos programas em duas pilhas de "ativo" e "inativo". O link postado acima para o site do desenvolvedor, se lido completamente, informa como esse processo acontece:

  • Quando a memória começa a ficar fraca, o sistema operacional começa a percorrer as páginas da memória ativa e define um sinalizador em cada uma.
  • Se um programa lê ou grava em uma página, o sinalizador é limpo.
  • Se, após algum atraso, o sinalizador não for limpo, essa página será classificada na pilha "inativa".
  • Se uma página "inativa" é acessada por seu programa, ela é recolocada na pilha "ativa".
  • Quando a memória acaba, as páginas "inativas" são paginadas.

Observe que esse processo de classificação para decidir qual memória trocar é semelhante em todos os sistemas operacionais modernos. O Linux possui as mesmas duas listas de páginas ativas e inativas, conforme descrito em Entendendo o Linux Virtual Memory Manager . O Windows pode usar algo um pouco diferente com mais de duas classes de tempo recente; Não consigo encontrar uma descrição técnica recente e confiável no momento. Mais implementações são discutidas na página da Wikipedia intitulada "Algoritmo de substituição de página" . A única diferença no OS X era como as estatísticas eram mostradas: alguém decidiu que seria uma boa ideia mostrar números separados para ativo e inativo no topMonitor de atividade. Em retrospecto, essa provavelmente não era uma boa idéia (e isso mudou no OS X 10.9).

Esse processo de configuração e limpeza de sinalizadores e manutenção de pilhas ativas / inativas consome um pouco de energia do processador. Por esse motivo, o OS X não faz isso quando há muita memória livre. Portanto, os primeiros programas iniciados aparecerão como toda a memória "ativa" até que a memória livre comece a ficar fraca.

Portanto, ao iniciar a partir de uma folha em branco e abrir mais e mais programas, você poderá esperar a seguinte progressão no Activity Monitor:

  • Primeiro, há muita memória "livre" e muito pouca inatividade. Isso ocorre porque o sinalizador de memória não começou a funcionar.
  • À medida que a quantidade de memória livre diminui, o OS X começará a executar seu sinalizador de memória e você começará a ver a quantidade de "inativo" aumentando. Cada bit de "inativo" estava anteriormente "ativo".
  • Quando você ficar sem memória livre, as páginas da pilha "inativa" serão paginadas. O sinalizador de memória também estará executando a inclinação total, classificando a memória em ativa e inativa. Normalmente, você verá muitos "inativos" enquanto a troca estiver sendo gravada, indicando que o sinalizador de memória está fazendo o que deveria.

As páginas devemser classificados como inativos antes de serem trocados. É isso que a citação do site da Apple Developer significa quando diz "Essas páginas contêm dados válidos, mas podem ser liberadas da memória a qualquer momento". Isso contraria as páginas Ativas, que não serão liberadas até depois de serem rebaixadas para Inativas. Existem várias maneiras de liberar páginas; se a página foi mapeada a partir de um arquivo e não foi modificada, ela pode ser excluída imediatamente e relida por demanda. Da mesma forma, se a memória foi trocada anteriormente e não modificada desde que foi trocada. Os programas também podem alocar explicitamente cache e memória removível, para armazenar dados que podem ser esquecidos e recriados sob demanda (mas o motivo pelo qual um programa alocaria cache) é se leva um tempo significativo para recriar esses dados.

Portanto, analisar a quantidade de memória "inativa" no Activity Monitor e verificar que há muita inatividade ao mesmo tempo em que o computador está gravando para trocar, apenas informa que o sistema está funcionando como projetado.

Há também uma confusão entre memória inativa e cache de arquivos. Não sei por que há essa confusão, porque o Activity Monitor já os lista em cabeçalhos separados. Cache é a memória usada para armazenar dados recentes que foram lidos ou gravados no sistema de arquivos, caso precisem ser acessados ​​novamente. Quando a memória está baixa, o OS X tende a se livrar primeiro do cache. Se você tiver troca de trocas, e o Monitor de atividades mostrar uma grande pilha de cache (NÃO inativo), isso seria um problema. Mas a memória inativa é uma coisa diferente.

Em caso de dúvida, ignore a distinção entre "inativo" e "ativo". Considere-os como sendo um pedaço de "memória usada por programas" e adicione os dois números. É o que todos os outros sistemas operacionais fazem quando falam sobre o uso da memória.

NOTA para OS X 10.9: Mavericks introduziu a "compressão de memória", que é mais ou menos outra camada de troca. As páginas ativas agora são classificadas como inativas, depois compactadas (que podem aparecer como memória do Kernel dependendo de quais ferramentas você está usando) e depois gravadas para trocar à medida que o uso da memória aumenta. O Mavericks também parou de mostrar números separados para ativo e inativo no Activity Monitor, uma vez que isso não é algo útil de se olhar, especialmente devido aos conceitos errados que o cercam.


4

Atualmente, não há uma maneira fácil de ajustar o comportamento de troca (ou é assim chamado) do macos X. No entanto, existem alguns hacks disponíveis (requer conta de desenvolvedor e SDK):

http://cestdelamerde.com/archives/22-Killing-Mac-OS-X-Swapping-How-To-Disable-dynamic_pager.html

http://dropsafe.crypticide.com/article/3848

Boa sorte!

Postscript. Eu acho que você pode querer ler esta resposta (também por mim) para ter uma revisão mais geral de quais memórias ativas, inativas e outras no MacOSX: Memória com fio vs. Memória ativa no OS X


Obrigado por suas respostas. Ajustar a swappiness definitivamente ajudaria - que pena que não é fácil! Com relação ao primeiro link, estou realmente procurando por um hack que não inclua a desativação de swap / dynamic_pager por completo e a reinicialização, pois isso exige muito esforço para desativar o uso da troca, além de deixar o sistema instável ao se aproximar de uma quantidade baixa de memória inativa e livre. O segundo link refere-se ao problema de arquivos de troca cada vez maiores. Enquanto e questão importante, especialmente quando se está baixo em arquivos de swap, não é realmente relevante para a minha pergunta neste segmento ...
Motin

4

Não é uma solução permanente, mas pelo menos pode ajudar a recuperar alguma memória inativa, potencialmente evitando a temida troca: http://itunes.apple.com/nz/app/freememory/id460931672?mt=12

A ferramenta é gratuita e muito fácil de usar. Uma vez iniciado, selecione a opção "Memória livre" na barra de ferramentas / menu do sistema.

Diferentemente da tela de memória do ActivityMonitor, ela mostra apenas memória livre, o que parece ser um melhor indicador de troca acontecendo ou não.


Eu tenho avaliado este aplicativo desde a sua sugestão há cerca de dois meses. Parece que esse aplicativo realmente aumenta a quantidade de memória "livre" por meio de vários truques, incluindo reivindicar agressivamente muita memória e liberá-la. No entanto, isso faz com que a mesma quantidade de memória "liberada" seja trocada. Isso significa que não ajuda a liberar nenhuma memória, apenas movendo o conteúdo da memória da ram para o hd. No final, isso causa muitos swap-ins quando tento usar os aplicativos que estavam abertos ao liberar memória, pois grande parte de sua vm está agora em swap. :(
Motin

@Motin, eu uso o FreeMemory há meses, e isso não acontece, pelo menos na minha experiência. Se eu tivesse que adivinhar (com base no que vi no Activity Monitor), a diferença é que o FM consome a memória "ativa" primeiro, que é priorizada pelos caches de disco. Ele "libera" outra memória por ter maior prioridade e, em seguida, libera sua própria memória. Eu nunca vi isso ser trocado significativamente (talvez uma pequena quantidade alocada enquanto estiver consumindo).
Eyelidlessness

2

A partir do OS X 10.5, existem problemas evidentes de gerenciamento de memória no MAC OS X. A web já estava cheia de reclamações sobre a desaceleração dramática do sistema após algum tempo. Naquela época, eu tinha uma máquina mais lenta, o Mac Mini com 1 GB de RAM, então eu (erradamente) concluí que era devido a um hardware inferior.

Agora eu tenho 2010 MBP, core i7, 8 GB de RAM, GPU dupla. O Mac os X Snow Leopard foi doloroso, mas depois de migrar para o OS X Lion, trabalhar algumas coisas sérias no MAC começou a ser um pesadelo.

Finalmente consegui reproduzir o cenário problemático, por isso executei o teste e gravei a tela em vídeo.

Problema de desempenho do MAC OS X Lion - gerenciamento de memória quebrada

Eu executo o comando tar + bzip, que é um material básico do unix, na grande quantidade de arquivos de imagem, na minha pasta Imagens /. Pouco antes do início, eu executo o comando "purge" para excluir os dados do programa inativo / em cache.

Você pode ver no vídeo que a memória livre começa a cair muito rapidamente e a inatividade está aumentando constantemente. Se você der uma olhada no comando "bsdtar", são necessários apenas um fragmento de RAM; portanto, o problema não está nesse processo. Você não pode dizer que se trata de um vazamento de memória do programa, pois o problema não estaria no RAM inativo, mas no ativo / com fio.

Quando a memória livre caiu abaixo de 100mb, iniciei alguns aplicativos, como Safari, iPhoto e MS Word, e você pode ver no vídeo que leva alguns minutos para iniciar um aplicativo, quando normalmente (quando há RAM livre), levaria de 3 a 5 segundos para carregar.

Eu corro o mesmo cenário e os mesmos comandos na minha caixa do Linux Centos 6, não há problema! O uso da memória é de 10 a 20 mb, sem problemas com cache / buffer.

O gerenciamento de memória deve estar muito quebrado no Mac OS X!


2
O que você está vendo é o sistema que armazena arquivos em cache na memória. Concordo que há um problema, pois o cache nunca parece ser eliminado ... mas o próprio cache (e o crescimento da memória inativa como conseqüência) é um recurso de desempenho saudável e às vezes útil.
Eyelidlessness

Além disso, o ambiente de teste está longe de ser estéril. Não podemos dizer o que o QuickTime Player está fazendo ou qualquer outro programa aberto.
chrishiestand

1

Aposto que não há resposta certa para isso. É o mesmo com a memória que permanece ativa quando você coloca o Mac em repouso, ele cresce e cresce a cada sono que você faz.

No lado "divertido" (também conhecido como caro), você pode atualizar sua memória ou substituir o HDD por um SSD, para que a troca não seja de impacto no desempenho. Eu escolhi a primeira opção, pois a memória da Corsair agora está disponível a um preço razoável.

16GB RAM


2
Lembre-se de que os SSDs têm ciclos de gravação limitados. Observe também que, para SSDs não habilitados para aparar, as gravações podem eventualmente ser caras, pois a célula Flash precisa ser apagada.
Caranguejo Ondulado

Você pode citar uma fonte no problema "O sono causa um aumento no uso da memória"?
GordonM 8/07

Posso citar minha experiência? :) Fiz uma pesquisa rápida e encontrei o seguinte: discussões.apple.com / message/ 21624847# 21624847 + há muitos tópicos relacionados à memória inativa que não são limpos quando necessário. Pessoalmente, vi como, depois de cada sono, a memória inativa permanece como era antes e aumenta. 'purgar' é uma opção, mas eu não gostaria de limpar a memória inativa uma vez a cada 20 minutos (aposto que esse seria o caso com 4 GiB de RAM).

11
Os SSDs do @WavyCrab podem ter ciclos de gravação limitados, mas não há chance de você atingir esse limite. Eu não me preocuparia com isso, a menos que seja um SSD para um Data Center. De qualquer forma, se você for derrubar o SSD por excesso de gravação, derrubará um HDD mais cedo.
22614 Andrewi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.