Como esvaziar swap se houver RAM livre?

240

Quando eu abro um aplicativo de uso intensivo de memória RAM (conjunto do VirtualBox com 2 GB de RAM), geralmente é usado algum espaço de troca, dependendo do que eu tenho aberto no momento.

No entanto, quando eu saio do último aplicativo, os 2GB de RAM são liberados, mas o mesmo uso do espaço de swap permanece.

Por exemplo, agora, cerca de duas horas depois de ter fechado o VirtualBox, eu tenho 1,6 GB de RAM livre e ainda 770 MB de swap.

Como posso dizer ao Ubuntu para parar de usar essa troca e voltar a usar a RAM?

    
por jfoucher 06.08.2010 / 08:43

6 respostas

142

Só porque swap é alocado, não significa que ele está sendo 'usado'. Embora programas como monitor de sistema e top mostrem que parte do seu espaço de swap está sendo alocado (no seu exemplo 770MB), isso não significa que o sistema está ativamente trocando de entrada / saída.

Para descobrir se algo está sendo alternado, você pode usar o comando vmstat . Deixe alguns segundos para acalmar e observe as colunas si (swapin) e so (swapout). Se nada está acontecendo, então não há razão para se preocupar.

Aqui está a saída da execução de vmstat 1 , onde você pode ver que minha máquina não está trocando nada.

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  0  78588 230788   9596  72196    0    0     0     0  543  652 12  6 78  0
 0  0  78588 230780   9596  72196    0    0     0     0  531  410  1  0 99  0
 0  0  78588 230796   9596  72196    0    0     0     0  300  335  1  1 97  0
 1  0  78588 230788   9608  72224    0    0    40     0  737  762  4  4 84  8
 5  0  78588 230788   9608  72224    0    0     0     0  415  385  9  3 84  0
 0  0  78588 230540   9616  72224    0    0     0    44  611  556 55  5 31  0
 0  0  78588 230532   9616  72224    0    0     0     0  574  662  1  6 89  0

Ainda aqui em top você pode ver que eu tenho espaço de swap alocado: -

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached
    
por popey 06.08.2010 / 12:04
324

O kernel Linux subjacente ao Ubuntu irá automaticamente "trocar" essas páginas do disco para a RAM conforme necessário, então, em geral, eu diria apenas deixar acontecer naturalmente.

No entanto, se você realmente acha que precisa forçá-lo, (eu posso ver um cenário onde você gostaria de saber que o sistema responderá mais tarde), você pode momentaneamente desabilitar e reativar o swap

sudo swapoff -a
sudo swapon -a

OU alternativamente como um único comando

swapoff -a && swapon -a

Tenha cuidado ao fazer isso, pois você pode tornar seu sistema instável, especialmente se ele já estiver com pouca memória RAM.

    
por SpamapS 06.08.2010 / 08:47
113

Você também pode definir seu valor "swappiness" do padrão de 60, desta forma a troca não crescerá tão grande para começar. Por que o padrão de frete é definido para 60 quando o valor recomendado é 10 me deixa perplexo. Do Ubuntu SwapFAQ :

  

A configuração padrão no Ubuntu é swappiness = 60. Reduzir o valor padrão de swappiness provavelmente melhorará o desempenho geral de uma instalação de desktop típica do Ubuntu. Um valor de swappiness = 10 é recomendado , mas fique à vontade para experimentar.

Ao alterar esse valor para 10 ou até 0, você pode adicionar um aumento de velocidade significativo e perceptível a um sistema mais antigo com uma unidade lenta. Configurar este valor para 0 não desativa a troca para o kernel Linux 3.4 e inferior, mas com 3.5+ isso significa que você desejará usar um valor de 1 se quiser mantê-lo na configuração mais baixa *.

Não vejo razão para não definir isso como 0, já que qualquer disco rígido é mais lento que a RAM. Eu tenho 8 núcleos virtuais, um rápido SSD & amp; 8 GB de memória e meu swap está configurado para 0. A partir deste momento eu tenho 3 máquinas virtuais rodando, meu uso de memória é 7.1 de 7.7 GB, meu swap usado é de apenas 576KB de 952MB e todos os sistemas estão rodando sem problemas!

Do Ubuntu SwapFAQ :

  

O parâmetro swappiness controla a tendência do kernel de mover os processos da memória física 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 os aplicativos, caso os processos sejam muito agressivamente removidos da memória.

     
    O
  1. swappiness pode ter um valor entre 0 e 100
  2.   
  3. swappiness = 0 diz ao kernel para evitar a troca de processos da memória física pelo maior tempo possível
  4.   
  5. swappiness = 100 diz ao kernel para trocar agressivamente os processos da memória física e movê-los para o cache de troca
  6.   

Abaixo estão as instruções básicas para verificar a permutabilidade, esvaziando seu swap e alterando o swappiness para 0:

Para verificar o valor do swappiness:

cat /proc/sys/vm/swappiness

Para definir temporariamente a troca para 0 ( como sugerido pelo SpamapS :

Isto irá esvaziar sua troca e transferir toda a troca de volta para a memória. Primeiro, certifique-se de ter memória suficiente disponível, visualizando a aba de recursos do gnome-system-monitor, sua memória livre deve ser maior do que o seu swap usado. Este processo pode demorar um pouco, use o gnome-system-monitor para monitorar e verificar o progresso.

sudo swapoff --all

Para definir o novo valor como 0:

sudo sysctl vm.swappiness=0 

Para ativar a troca novamente:

sudo swapon --all

Para definir permanentemente o swappiness como 0:

  1. sudoedit /etc/sysctl.conf
  2. Adicione esta linha vm.swappiness = 0
  3. sudo shutdown -r now # restart system

* Com a versão do kernel 3.5+, a configuração de swappiness para 0 é totalmente desativada e uma configuração de 1 é recomendada se você quiser o menor algoritmo de swappiness. fonte: link

    
por Elijah Lynn 11.06.2012 / 16:10
44

Eu descobri que o swap de esvaziamento pode ajudar muito em sistemas com discos lentos e RAM limitada. Naturalmente, como já mencionado, a maneira de fazer isso é executar sudo swapoff -a; sudo swapon -a . O problema aqui é que, se houver RAM insuficiente, isso causará todos os tipos de problemas.

Eu escrevi um script que chamo de toggle_swap e que funcionou para mim nos últimos anos. Ele verifica se há RAM livre suficiente antes de desabilitar a troca. Aqui está:

#!/bin/bash

free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print }')"
buffers="$(echo "$mem_data" | awk '{print }')"
cache="$(echo "$mem_data" | awk '{print }')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print }')"

echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
    
por Scott Severance 25.12.2011 / 17:35
23

Depois de curtir swappiness por alguns dias, cheguei à conclusão de que o kernel deveria ser deixado para seus próprios dispositivos. Ele sabe o que está fazendo e está otimizado para oferecer a melhor experiência.

A menos que você tenha uma boa razão para querer esse disco de volta, eu deixaria.

    
por Erigami 06.08.2010 / 18:34
1

Não afeta o desempenho se o espaço de troca estiver ocupado. A única penalidade de desempenho é que o material está entrando / saindo do swap. Se nada estiver sendo trocado / trocado, você não precisa se preocupar com nada.

    
por Rory 11.08.2010 / 21:35