Por que usar swap quando há espaço livre mais do que suficiente na RAM?

124

Usar espaço de troca em vez da RAM pode diminuir drasticamente o PC.

Então, por que, quando tenho mais do que suficiente RAM disponível, meu sistema Linux (Arch) usa a troca?

Confira minha saída conky abaixo:

saída conky

Além disso, isso poderia ser a causa dos problemas de velocidade e capacidade de resposta do sistema que estou tendo?

Saída de free -m:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357
Stefan
fonte
5
Tenho certeza de que a dinâmica desse problema mudou significativamente, com os SSDs se tornando a norma. Embora o SSD do consumidor comum ainda seja muito mais lento que a RAM, agora é uma questão do que é mais barato - RAM $ / GB ou SSD $ / GB. O SSD mais lento é muito mais barato e, na maioria dos casos, rápido o suficiente, portanto, mesmo a troca não deve atrapalhar significativamente a experiência do usuário, como costumava ocorrer com a mídia rotacional.
lkraav
7
Às vezes, se você usou a troca no passado por causa da RAM completa, pode ter uma situação em que os dados trocados anteriormente ficam lá porque não são dados úteis no momento.
Totor 21/03
1
Como Totor disse. Às vezes, o sistema pagina algo (por qualquer motivo). Se, posteriormente, essa página for retornada à memória para uma operação de leitura, a cópia no espaço de troca não será excluída. Se a mesma página for posteriormente paginada novamente, sem ser alterada, poderá fazê-lo sem gravar no disco novamente. A cópia existente já está atualizada. Em outras palavras, uma página pode ocupar espaço na memória principal e na troca.
Izak 18/06/2016

Respostas:

93

É normal que os sistemas Linux usem alguma troca, mesmo se ainda houver RAM livre. O kernel do Linux se moverá para trocar as páginas de memória que raramente são usadas (por exemplo, as gettyinstâncias em que você usa apenas o X11 e algum outro daemon inativo).

O uso do espaço de troca se torna um problema apenas quando não há RAM suficiente disponível e o kernel é forçado a mover continuamente as páginas de memória para trocar e voltar à RAM, apenas para manter os aplicativos em execução. Nesse caso, os aplicativos de monitor do sistema mostrariam muita atividade de E / S do disco.

Para comparação, meu sistema Ubuntu 10.04, com dois usuários logados com sessões X11 executando a área de trabalho GNOME, usa ~ 600 MB de swap e ~ 1 GB de RAM (sem contar os buffers e o cache fs), então eu diria que seus números para swap o uso parece normal.

Riccardo Murri
fonte
39
Ao trocar programas inativos, você tem mais memória para armazenamento em cache de arquivos. E isso acelera as coisas.
precisa saber é o seguinte
91

Esse comportamento pode ser configurado definindo o valor de:

/proc/sys/vm/swappiness

O valor padrão é 60. Configurá-lo como 0 significa nunca usar swap quando ainda há RAM restante e 100 trocando memória o mais rápido possível.

Para alterar o valor temporariamente (perdido na reinicialização):

sudo sysctl vm.swappiness=10

Para alterar o valor permanentemente, edite o arquivo:

/etc/sysctl.conf

como root (por exemplo sudo nano /etc/sysctl.conf) e altere ou adicione (se não houver) a linha:

vm.swappiness

para o valor desejado. Se esse arquivo não existir (por exemplo, no Arch Linux), tente /etc/sysctl.d/99-sysctl.conf.

Houve um debate sobre se a troca com a memória livre disponível é boa ou ruim, mas a ajuda do Ubuntu realmente recomenda um valor de 10 para sistemas Desktop . Veja também este tutorial sobre o Digital Ocean for CentOS .

Marcel Stimberg
fonte
27
Observe que reduzir a troca não significa necessariamente um aumento no desempenho ou na capacidade de resposta. Vi relatórios de aumento de swappiness se traduzindo em melhor desempenho. Não acredite em nada que você leia que não inclua valores de referência e verifique se eles usam uma carga de trabalho semelhante à sua.
Gilles
Isso persiste durante a reinicialização? Eu pensei / proc foi regenerado cada inicialização.
HandyGandy
@HandyGandy: adicionei informações à resposta sobre como alterá-las permanentemente.
Marcel Stimberg
@HandyGandy: para ser pedante, / proc não é regenerado em cada inicialização, mas proc é um sistema de arquivos virtual, por isso é apenas "gerado" quando você os acessa. Ele não existe no disco.
Lie Ryan
swappinessO valor não tem efeito no meu sistema. Mesmo configurá-lo como 0, continuará a mover páginas cruciais e frequentemente usadas (por exemplo, o índice do meu IDE) para trocar quando ainda houver 2 GB de RAM grátis.
Chefarov 5/08
46

O Linux começa a trocar antes que a RAM seja preenchida. Isso é feito para melhorar o desempenho e a capacidade de resposta:

  • O desempenho aumenta porque às vezes a RAM é melhor usada para cache de disco do que para armazenar memória de programa. Portanto, é melhor trocar um programa que está inativo por um tempo e, em vez disso, manter os arquivos mais usados ​​em cache.

  • A capacidade de resposta é aprimorada trocando as páginas quando o sistema está ocioso, e não quando a memória está cheia e algum programa está sendo executado e solicitando mais RAM para concluir uma tarefa.

A troca desacelera o sistema, é claro - mas a alternativa à troca não é trocar, é ter mais RAM ou usar menos RAM.

Gilles
fonte
Então, de certa forma, swap é uma medida caso a caso ? Isso e a coisa de hibernação ?
tshepang 13/01
@Tshepang: Ter uma troca suficiente para caber na sua memória virtual não é "caso", é necessário (caso contrário, seus programas travarão devido à falta de memória).
Gilles
1
@Tschepang: O assassino do OOM é o motivo pelo qual eles quebram. (Tecnicamente, você poderia ficar sem um killer do OOM e simplesmente não conseguir alocar nada, mas isso teria uma boa chance de bloquear o sistema; o killer do OOM torna um pouco mais provável que o administrador possa fazer login e para que os processos importantes continuem em execução.)
Gilles
1
Entendo o seu ponto de "trocar as páginas quando o sistema está ocioso, e não quando a memória está cheia", mas o cara mal usa 15% de sua RAM. Longe de quase cheio, não é? Apesar de uma troca anterior causada por completo RAM pode ter deixado essa situação ...
Totor
1
"O Linux começa a trocar antes que a RAM seja preenchida" quando? exatamente
Yousha Aleayoub 14/10
11

Este é um post antigo, no entanto, eu ainda teria a liberdade de colocar meus pensamentos aqui.

Começando de baixo, o Linux primeiro dividia a memória em páginas (geralmente 4K por página no sistema x86_64). Depois disso, a memória virtual é criada, cujo mapeamento é feito com memória física usando a MMU (Unidade de Gerenciamento de Memória).

Os processos recebem memória alocada da área de memória virtual; portanto, observe que, quando você vê / proc / meminfo, verá o VMalloc * como os detalhes da memória virtual.

Digamos que você tenha um processo que solicite memória (digamos 300 MB - um navegador da web). O processo seria alocado a 300 MB da memória virtual; no entanto, não é necessário que a memória seja mapeada (que é mapeada para a memória física). Existe o conceito de "Copiar na gravação" para gerenciamento de memória, pelo qual, se seus processos realmente usarem a memória alocada na memória virtual (isto é, alguns gravam na memória), somente então eles serão mapeados para a memória física. Isso ajuda o kernel a funcionar corretamente em um ambiente de múltiplos processos com eficiência.

O que são cache?

Muita memória usada pelos processos é compartilhada. Digamos que a biblioteca glibc seja usada por quase todos os processos. Qual é o objetivo de manter várias cópias da glibc na memória, quando todo processo pode acessar o mesmo local da memória e fazer o trabalho. Esses recursos usados ​​com freqüência são mantidos em cache para que, quando os processos exigirem, possam ser referenciados no mesmo local da memória. Isso ajuda a acelerar os processos, pois a leitura do glibc (etc.) De novo e de novo do disco seria demorada.

O exemplo acima foi para bibliotecas compartilhadas, por exemplo, semelhante também é válido para a leitura de arquivos. Se você ler um arquivo grande (digamos 100-200MB) pela primeira vez, levará muito tempo. No entanto, quando você tenta fazer a mesma leitura novamente, seria mais rápido. Os dados foram armazenados em cache na memória e a releitura não foi realizada para todos os blocos.

O que é buffer?

No que diz respeito ao buffer, quando um processo arquiva E / S, ele depende do buffer do kernel para gravar dados no disco. Os processos solicitam que o kernel faça o trabalho. Portanto, em nome do processo, o kernel grava os dados em seu "buffer" e informa ao processo que a gravação está concluída. De maneira assíncrona, o kernel continuará sincronizando esses dados no buffer para o disco. Dessa forma, os processos contam com o kernel para escolher um horário correto para sincronizar os dados no disco, e os processos podem continuar trabalhando adiante. Lembre-se, é a E / S geral que os processos normais estão executando. No entanto, processos especializados, que precisam confirmar que a E / S é realmente feita no disco, podem usar outro mecanismo para executar a E / S no disco. Alguns utilitários de código-fonte aberto são libaio. Além disso, existem maneiras de chamar a sincronização explícita para os FDs abertos no seu contexto de processos,

O que são falhas de página então?

Considere um exemplo, quando você inicia um processo (por exemplo, um navegador da web), cujo binário é de cerca de 300 MB. No entanto, os 300 MB completos do binário do navegador da Web não começam a funcionar instantaneamente. O processo continua passando de funções para funções em seu código. Como dito anteriormente, a memória virtual seria consumida em 300 MB, no entanto, nem toda a memória é mapeada para a memória física (RSS - a memória residente seria menor, consulte a saída principal). Quando a execução do código atinge um ponto, para o qual a memória não é realmente mapeada fisicamente, haveria uma falha na página. O kernel mapeia essa memória para física, associa a página de memória ao seu processo. Essa falha de página é chamada de "Falhas secundárias na página". Da mesma forma, quando um processo está executando as principais falhas de página de E / S do arquivo, são levantadas.

Quando e por que o Swap Out acontece?

Situação 1:

De acordo com os detalhes acima, vamos considerar um cenário em que a boa quantidade de memória se torna mapeada na memória. E agora um processo é iniciado, o que requer memória. Como discutido acima, o kernel precisará fazer algum mapeamento de memória. No entanto, não há RAM física suficiente disponível para mapear a memória. Agora, o kernel examinará primeiro o cache, terá algumas páginas de memória antigas que não estão sendo usadas. Ele liberará essas páginas em uma partição separada (chamada SWAP), liberará algumas páginas e mapeará as páginas liberadas para a nova solicitação. Como a gravação em disco é muito mais lenta que a RAM de estado sólido, esse processo leva muito tempo e, portanto, é observada uma lentidão.

Situação 2:

Digamos que você veja muita memória livre disponível no sistema. Mesmo assim, você vê que há muita troca acontecendo. Pode haver um problema provável de fragmentação da memória. Considere um processo que exige 50 MB de memória contígua do kernel. (tenha em mente contíguo). Obviamente, o kernel teria alocado páginas aleatoriamente para diferentes processos e liberado algumas delas. No entanto, quando exigimos memória contígua, ela deve procurar um pedaço que satisfaça a demanda dos processos. Se não conseguir obter essa memória, será necessário trocar algumas páginas antigas de memória e depois alocar páginas contíguas. Mesmo nesses casos, o SWAP out aconteceria. Iniciando o Kernel ver 2.6 e acima, esses problemas de fragmentação reduziram consideravelmente. No entanto, se o sistema estiver em execução por um longo período, esses problemas ainda poderão surgir.

Veja este exemplo ( saída vmstat )

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 2016-10-30 03:57:04, vemos que ainda há uma boa quantidade de RAM livre disponível. No entanto, mesmo assim, a troca aconteceu. Verificamos a árvore do processo neste momento e não vimos nenhum processo que demandasse uma quantidade tão alta de memória (mais do que memória livre). A suspeita óbvia foi a Situação 2 descrita acima. Verificamos os logs buddyinfo e zoneinfo acima (Use echo m> / proc / sysrq-trigger para verificá-los, a saída entra em syslogs).

Para um sistema normal, a comparação das informações da zona é a seguinte. E gráficos para cache / memória livre / baixa também são mencionados abaixo

informação da zona

trocar livre baixo livre

Observando as informações, fica claro que há fragmentação da memória no nó 0 e no nó 1 normal (o nó é uma máquina baseada em NUMA, portanto, vários nós (consulte numactl para verificar as informações do seu sistema)).

A fragmentação da memória também é uma razão pela qual o uso de swap pode aumentar mesmo quando há memória livre.

Anugraha Sinha
fonte
2
Você deve esclarecer se, na "situação 2", o processo exigente está alocando memória física, o que é um caso incomum. A maioria dos processos está lidando apenas com memória virtual, onde a fragmentação é quase irrelevante. Você também pode explicar melhor como afirma que há fragmentação da memória nos números e no gráfico exibido, pois isso não é óbvio à primeira vista. Ah, e por falar nisso, você está realmente falando de contíguo memória, esperemos que não contagiosa memória ;-)
jlliagre
@ jlliagre: Obrigado pelas contribuições. Estou editando o erro "contíguo".
Anugraha Sinha
5

Ter mais memória disponível

Como todos disseram, sim, a troca ajudará você a se livrar da memória não utilizada, para que você possa ter mais memória disponível.

Hibernando

Mas o swap também pode ser usado para hibernar, o que pode ser realmente útil quando você tem um laptop ou deseja economizar energia e colocar seu computador e trabalhar em hibernação antes de sair do trabalho. Assim, você pode começar mais rapidamente na manhã seguinte.

Ter uma função de hibernação é uma das principais razões pelas quais ainda hoje recomendamos que você tenha pelo menos o tamanho da RAM para a troca. Dessa forma, o sistema pode colocar toda a RAM usada no swap e entrar em hibernação.

Defeitos

Tome cuidado para que uma vez trocados os dados de um processo possam ser lidos no swap mesmo após o desligamento, a menos que o swap tenha sido criptografado (é claro).

O uso de troca criptografada com hibernação não funciona imediatamente com todas as distribuições. Você precisa usar uma chave de criptografia constante (algumas configurações geram aleatoriamente a chave de criptografia de espaço de troca em cada inicialização) e um initrd / initramfs para ativar o volume criptografado antes de continuar.

Huygens
fonte
3

Muitos programas modernos são construídos em estruturas inchadas que arrastam muitos lixo que você realmente não precisa para executar o programa. Trocar essas páginas não usadas libera RAM para cache e programas que podem realmente fazer uso da RAM.

Falo por experiência pessoal dolorosa aqui.

No ano passado, mudei um dos meus sites para uma nova e promissora estrutura de servidores da Web, construída sobre o Firefox. Pode parecer estranho criar um sistema do lado do servidor sobre um programa focado no cliente como o Firefox, mas teve alguns benefícios enormes. O Firefox é muito poderoso, oferece alguns serviços internos realmente impressionantes e reduz a incompatibilidade de impedâncias entre servidor e cliente para que ambas executem plataformas semelhantes.

Mas há uma desvantagem: o Firefox é grande. Realmente grande. Esse era um tipo de projeto da versão 1.x, portanto eles não haviam conseguido resolver problemas como remover o suporte da GUI. [*] Meu site não precisava disso, mas porque a tecnologia VPS usada pelo meu provedor de hospedagem não ' permitir espaço de troca, esse código da GUI e todas as outras partes do Firefox que não usei consumiam RAM real. Acabei precisando de 512 MB de RAM, no mínimo, apenas para executar o site sem travar devido ao esgotamento da memória. Se meu VPS tivesse algum espaço de troca, eu provavelmente poderia ter conseguido um plano de 256 MB.

[*] A remoção do código da GUI da estrutura pode até não ser desejável, pois um dos benefícios dessa plataforma era a raspagem na web de alta fidelidade, porque a estrutura do lado do servidor podia baixar páginas da Web de outro site e você podia manipulá-las. assim como você faria no lado do cliente. Pense em mashups. Muito desse tipo de coisa seria interrompido se você não pudesse "renderizar" a página da web em algum contexto gráfico.

A propósito, esse quadro da web está basicamente morto agora, então não há sentido em nomeá-lo e envergonhá-lo. É melhor levar a lição mais a sério: sim, a troca ainda é útil, mesmo se você tiver shows de RAM grátis.

Warren Young
fonte
3

Do Ubuntu Swap FAQ ao qual Marcel se vinculou

Como base mínima, é altamente recomendável que o espaço de troca seja igual à quantidade de memória física (RAM). Além disso, é recomendável que o espaço de troca seja o dobro da quantidade de memória física (RAM), dependendo da quantidade de disco rígido

Eu acho que você deve aumentar seu espaço de troca no seu sistema. A troca acelera a alocação de memória RAM, permitindo descartar os dados já paginados.

Jader Dias
fonte
6
Eu ainda acho isso inacreditável. Por que eu preciso de 8 GB de swap para o meu sistema de 4 GB e sem hibernação? Eu realmente preciso de 128 GB de swap para o meu nó de computação de 64 GB? Normalmente, eu aloco não mais de 1 GB para troca, a menos que haja um motivo altamente específico.
David Mackintosh
2
Ele deixa mais espaço para armazenar em cache o disco rígido lento como tudo na RAM extremamente rápida. (Além disso, alguns esquemas de hibernação salvar uma cópia da RAM no espaço de permuta)
Arafangion
6
@ David, @ Jader: A figura swap = 2 * ram é uma castanha antiga que sobreviveu bem depois que a justificação original se tornou irrelevante - agora as pessoas tentam encontrar uma maneira de justificar essa figura, em vez de encontrar uma figura apropriada para seu sistema . Veja por que precisamos definir o espaço de troca duas vezes maior que a nossa memória física? .
Gilles
1
@Gilles, mantenho minha posição porque vi uma vez um artigo oficial sobre esse assunto que contradiz um monte de especialistas que não sei quão profundo é o conhecimento deles.
Jader Dias
4
Se você se lembra da referência, compartilhe.
Gilles
2

Eu acho que o "Gilles" já mencionou o fato de que, embora você tenha RAM mais do que suficiente, o swap pode ser útil durante certas "deficiências", além de salvar persistentemente alguns dados mesmo após os desligamentos - ou estou errado ao supor isso? ( desde que a RAM seja liberada após a reinicialização) Eu tenho 12 GB de RAM disponível no meu sistema e também já pensei sobre essa questão antes. Em um ponto, quando eu desabilitei todas as trocas e dependia apenas da minha RAM, tive experiências dolorosamente difíceis tentando depurar algum erro ou falha do sistema etc. após o desligamento do sistema. Desde então, reativei a partição de troca.

ILMostro_7
fonte