it-swarm-pt.tech

Como esvaziar swap se houver RAM livre?

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

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

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

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

304
jfoucher

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

Para descobrir se alguma coisa está trocando in/out, você pode usar o comando vmstat. Deixe-o rodando 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 de execução vmstat 1, onde você pode ver minha máquina não está trocando de todo.

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
163
popey

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

No entanto, se você realmente acha que precisa forçá-lo, (posso ver um cenário em que você gostaria de saber se o sistema responderá mais tarde), você poderá desabilitar e reativar momentaneamente a troca.

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.

401
SpamapS

Você também pode definir seu valor "swappiness" a partir 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 em sua 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 e 8 GB de memória e meu swap é definido como 0. A partir deste momento eu tenho 3 máquinas virtuais em execução, meu uso de memória é 7,1 de 7,7 GB, meu swap usado é de apenas 576 KB 952MB e todos os sistemas estão funcionando 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, 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
  3. swappiness = 100 diz ao kernel para trocar agressivamente os processos da memória física e movê-los para o cache de troca

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 temporariamente definir swap para 0 ( como sugerido pelo SpamapS ):

Isso 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, desliga-a completamente e uma configuração de 1 é recomendada se você quiser o algoritmo de swappiness mais baixo. fonte: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/

140
Elijah Lynn

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á todo tipo de problema.

Eu escrevi um script que chamo de toggle_swap que funcionou para mim nos últimos anos. Ele verifica se há suficiente RAM 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 $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)"
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
52
Scott Severance

Depois de mexer com 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.

26
Erigami

Não afeta o desempenho se o seu 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.

0
Rory