Por que o swap está sendo usado, mesmo que eu tenha bastante RAM livre?

208

Eu pensei que toda a essência do swap era atuar como uma rede de segurança de armazenamento temporário quando a RAM estava cheia, mas minha partição de swap está sendo constantemente usada, embora às vezes eu tenha até 3 GB de RAM livre. Isso é normal?

Mysterio
fonte
3
Por favor, compartilhe o conteúdo ou a saída dos seguintes comandos / arquivos para melhor nos ajudar a solucionar seu problema ( instruções desta resposta ) : free -m,top -b 1
ish
Atualizará a pergunta com pastas de pastas desses comandos amanhã. São 12 horas agora :(
Mysterio
Eu deveria editar o título para adicionar "... mas estou com muito sono para me importar agora, para que vocês tirem uma soneca também": P
ish

Respostas:

188

Você pode tentar alterar seu valor "swappiness":

Do FAQ de swap do Ubuntu :

O que é swappiness e como faço para alterá-lo?

O parâmetro swappiness controla a tendência do kernel de mover processos para fora da memória física e para o disco de troca. Como os discos são muito mais lentos que a RAM, isso pode levar a tempos de resposta mais lentos para o sistema e aplicativos, se os processos forem muito agressivamente removidos da memória.

  1. swappiness pode ter um valor entre 0 e 100

  2. swappiness = 0 informa ao kernel para evitar a troca de processos da memória física pelo maior tempo possível. Para o Kernel versão 3.5 e mais recente, ele desativa a troca.

  3. swappiness = 100 diz ao kernel para trocar agressivamente processos da memória física e movê-los para trocar o cache

A configuração padrão no Ubuntu é swappiness = 60. Reduzir o valor padrão da troca provavelmente melhorará o desempenho geral de uma instalação típica da área de trabalho do Ubuntu. Um valor de swappiness = 10 é recomendado, mas fique à vontade para experimentar. Nota: As instalações do servidor Ubuntu têm requisitos de desempenho diferentes para os sistemas de desktop, e o valor padrão de 60 é provavelmente mais adequado.

Para verificar o valor da troca

cat /proc/sys/vm/swappiness

Para alterar o valor da troca Uma alteração temporária (perdida na reinicialização) com um valor de troca 10 pode ser feita com

sudo sysctl vm.swappiness=10

Para tornar uma alteração permanente , edite o arquivo de configuração com seu editor favorito:

gksudo gedit /etc/sysctl.conf

Procure por vm.swappiness e altere seu valor conforme desejado. Se o vm.swappiness não existir, adicione-o ao final do arquivo da seguinte forma:

vm.swappiness=10

Salve o arquivo e reinicie.

Além disso, você pode conferir: https://askubuntu.com/a/103916/54187

jpetersen
fonte
1
Especulação inativa: isso pode realmente ser benéfico para o desempenho - as páginas que não são acessadas há algum tempo podem ser copiadas para trocar espaço, o que permite que o sistema operacional as despeje rapidamente se precisar de memória, mas o conteúdo da página permanece na memória .
Simon Richter
7
@SimonRichter Sim, essa é a ideia. A troca de 60 é provavelmente muito agressiva nos sistemas modernos, pois isso significa que você está começando a trocar quando ainda possui vários shows de memória livre.
Brendan Long
1
Execute sudo sysctl --load=/etc/sysctl.confdepois de editar o arquivo para aplicar as alterações
deFreitas
92

Existem alguns aspectos diferentes para sua pergunta.

Em primeiro lugar, qual é a sua definição de "livre". Na verdade, não é tão simples quanto parece no Linux (ou em qualquer sistema operacional moderno).

Como o Linux usa RAM (muito simplificado)

Cada aplicativo pode usar parte da sua memória. O Linux usa toda a memória desocupada (exceto os últimos Mb) como "cache". Isso inclui o cache da página, caches de inode, etc. Isso é uma coisa boa - ajuda a acelerar as coisas. Tanto a gravação no disco quanto a leitura do disco podem ser aceleradas imensamente pelo cache.

Idealmente, você tem memória suficiente para todos os seus aplicativos e ainda tem várias centenas de Mb restantes para cache. Nessa situação, desde que seus aplicativos não aumentem o uso de memória e o sistema não esteja lutando para obter espaço suficiente para o cache, não há necessidade de troca.

Depois que os aplicativos reivindicam mais RAM, eles simplesmente entram em parte do espaço usado pelo cache, diminuindo o cache. A desalocação do cache é barata e fácil o suficiente para ser feita em tempo real - tudo o que fica no cache é apenas uma segunda cópia de algo que já está no disco, para que possa ser desalocado instantaneamente ou é algo que gostaríamos teve que liberar para o disco nos próximos segundos de qualquer maneira .

Esta não é uma situação específica do Linux - todos os sistemas operacionais modernos funcionam dessa maneira. Os diferentes sistemas operacionais podem apenas relatar RAM livre de maneira diferente: alguns incluem o cache como parte do que consideram "livre" e outros podem não.

Quando você fala sobre RAM livre, é muito mais significativo incluir cache, porque é praticamente gratuito - está disponível caso algum aplicativo solicite. No Linux, o freecomando relata nos dois sentidos - a primeira linha inclui cache na coluna RAM usada e a segunda linha inclui cache (e buffers) na coluna livre.

Como o Linux usa swap (ainda mais simplificado)

Depois de usar a memória suficiente para que não haja um cache de bom funcionamento, o Linux pode decidir realocar uma memória de aplicativo não utilizada da RAM para trocar.

Isso não é feito de acordo com um limite definido. Não é como se você alcançasse uma certa porcentagem de alocação, então o Linux começa a trocar. Ele tem um algoritmo bastante "confuso". Isso leva em consideração muitas coisas, que podem ser melhor descritas por "quanta pressão existe para a alocação de memória". Se houver muita "pressão" para alocar nova memória, aumentará as chances de que algumas sejam trocadas para criar mais espaço. Se houver menos "pressão", isso diminuirá essas chances.

Seu sistema possui uma configuração de "troca" que ajuda a ajustar como essa "pressão" é calculada. Normalmente, não é recomendável alterar isso, e eu não recomendaria que você o alterasse. A troca é geralmente uma coisa muito boa - embora haja alguns casos extremos em que prejudica o desempenho, se você observar o desempenho geral do sistema, é um benefício líquido para uma ampla gama de tarefas. Se você reduzir o swappiness, deixe a quantidade de memória cache diminuir um pouco mais do que seria de outra forma, mesmo quando for realmente útil. Se isso é uma troca suficientemente boa para qualquer problema que você esteja tendo com a troca, é com você. Você deveria saber o que está fazendo, só isso.

Existe uma situação bem conhecida na qual a troca realmente prejudica o desempenho percebido em um sistema de desktop e é a rapidez com que os aplicativos podem responder à entrada do usuário novamente depois de ficarem ociosos por um longo tempo e com processos em segundo plano pesados ​​em E / S (como um backup noturno). Essa é uma lentidão muito visível, mas não o suficiente para justificar a desativação da troca e é muito difícil de impedir em qualquer sistema operacional. Desative a troca e essa lentidão inicial após a verificação de backup / vírus pode não ocorrer, mas o sistema pode ficar um pouco mais lento o dia todo. Essa também não é uma situação limitada ao Linux.

Ao escolher o que deve ser trocado no disco, o sistema tenta coletar memória que não está sendo realmente usada - leitura ou gravação. Ele tem um algoritmo bastante simples para calcular isso, que escolhe bem a maior parte do tempo.

Se você possui um sistema em que possui uma quantidade enorme de RAM (no momento da escrita, 8 GB é uma quantidade enorme para uma distribuição Linux típica), raramente encontrará uma situação em que a troca é necessária. Você pode até tentar desativar a troca. Eu nunca recomendo fazer isso, mas apenas porque você nunca sabe quando mais RAM pode salvá-lo de algumas falhas de aplicativos. Mas se você sabe que não vai precisar, pode fazê-lo.

Mas como a troca pode acelerar meu sistema? Não trocar as coisas devagar?

O ato de transferir dados da RAM para a troca é uma operação lenta, mas só é usada quando o kernel tem certeza de que o benefício geral superará isso. Por exemplo, se a memória do aplicativo aumentou a ponto de quase não haver cache e a sua E / S é muito ineficiente por causa disso, é possível obter muito mais velocidade do sistema liberando alguma memória, mesmo após a despesa inicial de trocar dados para liberá-los.

É também o último recurso caso seus aplicativos solicitem mais memória do que você realmente possui. Nesse caso, a troca é necessária para evitar uma situação de falta de memória que geralmente resulta em um aplicativo travando ou precisando ser forçado a matar.

A troca é associada apenas a momentos em que o sistema está com desempenho ruim porque ocorre quando a RAM utilizável está acabando, o que tornaria o sistema mais lento (ou instável), mesmo que não houvesse troca. Então, para simplificar as coisas, a troca acontece porque o sistema está ficando atolado, e não o contrário.

Depois que os dados são trocados, quando são lançados novamente?

A transferência de dados fora do swap é (pelo menos para os discos rígidos tradicionais), tão demorada quanto colocar lá. Então, é compreensível que o seu kernel seja tão relutante em remover dados do swap, especialmente se não estiver sendo realmente usado (por exemplo, lido ou gravado). Se você possui dados em swap e eles não estão sendo usados, é realmente bom que eles permaneçam em swap, pois deixa mais memória para outras coisas que estão sendo usadas, potencialmente acelerando o sistema.

thomasrutter
fonte
5
+1 para explicação detalhada. Também gosto de manter a troca 2GiB nos meus computadores. Se algo der errado - vazamentos de memória, etc., você poderá ver a troca subindo e procurar o problema antes que ocorra falta de memória. É uma rede de segurança e também uma ferramenta de desempenho.
314 Joe
1
No meu netbook, que possui apenas 2 GB de RAM, mantenho 4 GB de swap. Isso ocorre porque eu uso o netbook para muito mais do que ele foi planejado e meus programas frequentemente exigem mais de 2 GB de memória. Como o Linux se comporta muito mal em situações de falta de memória, eu prefiro ter uma grande rede de segurança. E eu tenho muito espaço em disco.
Scott Severance
Se seus programas frequentemente exigem mais de 2 GB de memória, eu consideraria jogar mais RAM lá (é muito barato!) Porque a exaustão da RAM prejudicará o desempenho. Para o benefício de outros leitores: verifique se você não está apenas olhando para a memória cache que supostamente monopoliza a RAM disponível - veja outras referências a free -m.
thomasrutter
2
@neon_overload: Devo apenas observar que, de acordo com a HP, a RAM máxima do meu netbook é de 1 GB. Eu tenho 2 GB lá agora, e fontes da Internet sugerem que 2 GB é o máximo real. Daí a necessidade desses tipos de soluções alternativas.
11789 Scott Scottance
@ thomasrutter: Como sua resposta muda para servidores grandes, um dos meus tem 1 TB (sim, um terabyte completo) de memória RAM e ainda usa swap; que configuração de troca e que tamanho de partição de troca você recomendaria?
Chrisinmtown 03/04
24

Definir o valor da swappiness não funciona em todas as situações. Se isso funciona para você, ótimo. Caso contrário, escrevi um script para limpar periodicamente a troca, desativando-a e ligando-a novamente.

Alternar troca é um pouco arriscado se você não for cuidadoso. Se você não tiver RAM livre suficiente para armazenar tudo na RAM mais tudo no swap, tentar desabilitar o swap fará com que o sistema não responda. Meu script primeiro verifica se há RAM livre suficiente (o que demora um pouco, pois a quantidade real de RAM livre é diferente da que é freerelatada como livre) e, em seguida, apenas alterna a troca se houver. Mas, se você estiver com pouca memória RAM, não inicie outro processo importante enquanto o script estiver em execução. Aqui está:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

Você deve executar este script como raiz (por exemplo, com sudo). Este script não deixará seu sistema sem resposta; se você tiver RAM insuficiente, ele se recusará a alternar a troca. Eu uso esse script sem problemas há quase cinco anos.

Scott Severance
fonte
+1 para o script. Você pode modernizá-lo um pouco, alterando MB para MiB nas saídas. Escrevi um script semelhante sem todos os (bons) testes de segurança que você inclui. No meu notebook antigo, onde o swap era muito usado, levaria algum tempo para ser executado - um ou dois minutos, mas não machucava nada. De vez em quando falhava porque não havia memória livre suficiente para ser executada, mas isso não causava problemas adicionais. Eu tive que reiniciar para esclarecer as coisas quando isso aconteceu. Tinha a ver com o que parecia um vazamento de memória na Transmission (desde fixo, acredito) e com apenas 2 GB de RAM.
314 Joe
6
Se algo foi movido para troca e permanece em troca, isso normalmente é uma coisa boa - significa que os dados não estão realmente sendo usados ​​e liberou parte da sua RAM para outras coisas, resultando em um aumento potencial na velocidade. O que o levou a acreditar que esses dados não deveriam ser trocados e, em vez disso, deveriam ocupar RAM mais valiosa? Geralmente, o kernel é muito bom em saber o que não é usado e que pode permanecer em segurança para trocar a RAM.
thomasrutter
@neon: Lembre-se de que minhas máquinas têm 2 GB e 3 GB de RAM, respectivamente, o que é pouco hoje em dia. A evidência está no desempenho. Por exemplo, abrir menus ou alternar programas pode ser lento devido à troca, assim como os efeitos visuais do Compos. Essa lentidão é curada alternando a troca, demonstrando que, pelo menos em algumas situações, os algoritmos de otimização do kernel são abaixo do ideal. Não posso discutir com experiências repetidas.
Scott Severance
Ufa !! Isso aumentou para 0% do swap .... Eu não tive muito tempo para analisar esta pergunta completa e sua resposta, mas eu a Favoritei para lê-la quando eu tiver algum tempo livre.
precisa saber é o seguinte
Por que você simplesmente não define o swappiness como um valor baixo? Isso parece estar fazendo a mesma coisa que o seu script, mas de uma maneira muito mais controlada.
Jhfrontz
4

Geralmente, a troca permanece sem uso nos sistemas atuais. Na minha experiência, os processos que estão sendo executados por um longo tempo sem operações intensivas são alterados para troca pelo linux.
Isso faz com que alguns programas afetados fiquem lentos.
Se você tiver muita RAM livre, poderá desativar o swap executando o comando:
swapoff -av(você precisará de sudodireitos para isso.)
Se não gostar do swap, poderá ativá-lo, usando o comando simétrico:
swapon -av( novamente sudonecessário).

drake01
fonte
12
Voltando troca por completo é um exagero desde swapiness = 0 faz a mesma coisa, mas mais seguro (se você fazer acabar com muita coisa na memória, ele vai jogar algo em troca).
Brendan Longo
@BrendanLong Fair point .. Obrigado por me ensinar. :)
drake01
3

Depois que o swap é usado para um programa, ele tende a permanecer mapeado durante toda a vida útil do programa. Muitos programas possuem código (e dados) que raramente é usado. Depois que a memória é trocada, é improvável que ela seja trocada.

Uma maneira de forçar essas páginas para a memória é desligar o dispositivo de troca. Se você tiver dois, pode desligar um, ligar novamente e depois desligar o segundo. Se a troca for realmente necessária, ela se moverá entre os dispositivos. Você pode simplesmente desligar o dispositivo de troca (ou arquivo), mas se realmente precisar de espaço para troca, coisas drásticas podem acontecer.

Além das coisas normais da memória, o tempfs usa espaço de troca e será trocado como o restante da memória. Se você executar algo que exija muito disco temporário, isso poderá forçar a troca de páginas. Depois de criados, os arquivos temporários não podem mais ser usados ​​após alguns minutos e são bons candidatos para serem movidos para o dispositivo de troca.

Em uma pitada, você pode usar um arquivo como um dispositivo de troca. Isso é útil se você precisar de espaço de troca extra temporariamente.

BillThor
fonte
2

Editei o script de Scott Severance para corresponder às versões mais recentes do free, que já incluem um campo total de memória disponível.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
derberlinersmurf
fonte