Como esvaziar a troca se houver RAM grátis?

314

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

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

Por exemplo, agora, cerca de duas horas depois de fechar o VirtualBox, tenho 1,6 GB de RAM livre e ainda 770 MB em troca.

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

jfoucher
fonte
A coisa mais fácil reiniciar o dispositivo e economizar tempo de enfrentar a RAM e memória RAM livre economizar energia do laptop e cpu temperatura
Mohamed Slama
5
Grande suposição de que repovoar todas as coisas no seu computador leva menos tempo que isso.
jQwierdy
O Ubuntu 16.04, pelo menos, pode continuar usando o swap por muito tempo, depois disso, tornando as ordens de magnitude do sistema mais lentas, contando com o arquivo de swap, mesmo que não seja mais uma necessidade. A intervenção manual pode, portanto, ser útil. A reinicialização nem sempre é uma opção.
matt

Respostas:

167

Só porque o swap é alocado, não significa que ele esteja sendo 'usado'. Embora programas como o monitor do sistema e o topo mostrem parte do seu espaço de troca sendo alocado (no seu exemplo 770 MB), isso não significa que o sistema esteja ativamente trocando in / out.

Para descobrir se alguma coisa está sendo trocada, você pode usar o vmstatcomando Deixe-o em execução por alguns segundos para se acalmar e observar as sicolunas (swapin) e so(swapout). Se nada está acontecendo, não há razão para se preocupar.

Aqui está o resultado da execução vmstat 1, onde você pode ver 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

No entanto, aqui em topvocê pode ver, tenho espaço de troca alocado: -

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached
popey
fonte
32
“Não há razão para se preocupar”, até o momento em que continuo usando algum aplicativo que foi trocado. então todo o inferno se abre.
törzsmókus 13/05
207
Esta postagem não responde à pergunta.
emchristiansen
18
A premissa da pergunta é baseada em conceitos errôneos. Esta publicação aborda os equívocos.
22614 popey
30
Não vejo um equívoco, vejo um desacordo sobre o que "usado" significa. Você quer dizer "usado" para se referir à troca ativada / desativada, enquanto a pergunta original parece ser colocada com "usado", o que significa que existem dados que foram trocados, que podem precisar ser trocados mais tarde. razões válidas para querer liberar a troca após um evento que troque muitas outras memórias, essencialmente antecipando a troca ativa que o usuário sabe que ocorrerá mais tarde (especialmente se a provável "des troca" posterior ocorrer enquanto o disco está sob carga por outros motivos).
drfrogsplat
39
Depois de executar um aplicativo com uso intensivo de memória, meus outros aplicativos não respondem quando alterno para eles, provavelmente devido à troca. Uma maneira de dizer ao sistema para não trocar o máximo de dados possível (seguido de uma pausa para o café) seria melhor do que ter que esperar 20 anos toda vez que eu pressionava Alt + Tab.
Mark K Cowan
424

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

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

sudo swapoff -a
sudo swapon -a

OU alternativamente como uma única linha

swapoff -a; swapon -a

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

SpamapS
fonte
8
Isso fez o truque, a troca foi copiada para ram. Eu acho que você só precisa ter pelo menos a quantidade de swap usada como ram livre antes de executar o swapoff, certo?
jfoucher
12
A troca não foi copiada para a RAM. Foi apenas desativado. Você deve garantir que a caixa não seja trocada antes de fazer isso. Se você o fizer, o kernel verá a memória desaparecer e o OOM-Killer provavelmente começará a eliminar aplicativos arbitrariamente. Não há motivo para você precisar 'limpar' a troca dessa maneira. (ver meu outro comentário) :)
Popey
51
Na verdade, a troca é, basicamente, copiada para ram ou, mais precisamente, as páginas são trocadas novamente do disco para a RAM antes que a troca possa ser desativada.
SpamapS
14
As páginas são copiadas para a RAM apenas se ainda forem necessárias por algum processo. Às vezes, uma página trocada pertence a um processo que já foi finalizado, e o kernel não se importa em remover essas páginas da troca imediatamente.
BrunoJCM
6
Esta deve ser a resposta correta, pois é a maneira de obter as páginas trocadas de volta à RAM e, em seguida, esvaziar a memória swap
Alfonso Jiménez
144

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

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.

Alterando esse valor para 10 ou até 0, você pode adicionar um aumento de velocidade significativo e perceptível a um sistema antigo com uma unidade lenta. Definir esse valor como 0 não desativa a troca para o kernel Linux 3.4 e abaixo, mas com 3.5 ou superior, você deve usar o valor 1 se quiser mantê-lo na configuração mais baixa *.

Não vejo razão para não definir isso como 0, pois qualquer coisa que atinja o disco é mais lenta que a RAM. Eu tenho 8 núcleos virtuais, um SSD rápido e 8 GB de memória e meu swap está definido como 0. A partir desse momento, 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 de 952MB e todos os sistemas estão funcionando sem problemas!

No Ubuntu SwapFAQ :

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
  3. swappiness = 100 diz ao kernel para trocar agressivamente processos da memória física e movê-los para trocar o cache

Abaixo estão as instruções básicas para verificar a troca, esvaziar sua troca e alterar a troca para 0:

Para verificar o valor da troca:

cat /proc/sys/vm/swappiness

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

Isso esvaziará sua troca e transferirá toda a troca de volta para a memória. Primeiro, verifique se você tem memória suficiente disponível, visualizando a guia de recursos do gnome-system-monitor, sua memória livre deve ser maior que a troca usada. Esse 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 a swappiness para 0:

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

* Com a versão 3.5+ do kernel, a configuração do swappiness para 0 desativa-o completamente e uma configuração de 1 é recomendada se você desejar o algoritmo de swappiness mais baixo. fonte: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/

Elijah Lynn
fonte
1
Acabei de atualizar a resposta para incluir uma maneira permanente de definir swappiness. Não tenho certeza de como foi tão votado, acho que ninguém o testou.
Elijah Lynn
1
Mais uma boa leitura sobre a troca nesta resposta => askubuntu.com/a/103916/11929
Elijah Lynn
3
Não tenho certeza se isso estava disponível quando o autor postou a resposta originalmente, mas um valor de swappiness "60" está em vigor para instalações do servidor ubuntu, pois esse ambiente tem um conjunto diferente de especificações de desempenho. help.ubuntu.com/community/…
Frito
1
Essa configuração é muito eficaz no controle do tamanho da troca. Meu sistema possui 16G de RAM e 16G de swap. Às vezes, eu estou executando em VMs e alguns dos meus aplicativos são trocados. Quando fecho as VMs, o uso da RAM diminui, mas o uso de troca permanece o mesmo e meu sistema fica lento ao alterar aplicativos. Alterar a troca melhorou o desempenho para mim.
kapad
1
Essa deve ser a resposta realmente aceita. Explicação completa do problema e sua solução, bem como links e uma solução para reter a memória Swap, mas ajude a mantê-la sob controle em primeiro lugar. Coisas impressionantes. Obrigado. :)
Jack_Hu 24/07
53

Descobri que a troca de esvaziamento pode ajudar muito em sistemas com discos lentos e RAM limitada. Obviamente, 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 toggle_swapque funcionou para mim nos últimos anos. Ele verifica se há RAM livre suficiente antes de realmente desativar 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
Scott Severance
fonte
Impressionante, eu estava procurando por algo assim. Talvez, para ser um pouco mais seguro, você possa apresentar o número e as porcentagens e depois perguntar, apenas para ter certeza absoluta.
Atherion 27/01
2
Eu tenho atualizar o código e criaram uma essência baseada gist.github.com/Jekis/6c8fe9dfb999fa76479058e2d769ee5c
Jekis
Esta é a conclusão que cheguei depois de ler todas as dicas, como se de alguma forma fosse necessário garantir que há RAM suficiente antes de matar o swap. Obrigado senhor, roteiro maravilhoso. Deve ser incluído no Ubuntu por padrão (não está brincando, ele realmente é um musthave.)
Shiki
Exceto que, se você executar alguma coisa nova ao desativar o swap, e antes de ligá-lo novamente - ele não terá memória suficiente.
precisa saber é o seguinte
Isso depende da quantidade de memória livre que você possui. Se houver memória livre suficiente para armazenar tudo em troca E o novo processo, não haverá problema. Se não, então você está certo.
9788505755758Código do produto
25

Depois de mexer com swappiness por alguns dias, cheguei à conclusão de que o kernel deve ser deixado por conta própria. Ele sabe o que está fazendo e é otimizado para oferecer a melhor experiência.

A menos que você tenha realmente um bom motivo para querer o disco de volta, eu o deixaria em paz.

Erigami
fonte
2
Eu tinha algumas coisas em troca, o vmstat me mostrou que a troca e a troca estavam acontecendo, e o Chrome estava atrasado, enquanto minha CPU mal estava sendo usada. Bom motivo, não?
Xerus
Definitivamente, existem casos em que determinadas trocas no desktop tornam-no defasado. (não durante a troca, mas também depois, quando houver RAM suficiente, por muito tempo depois.) Portanto, na melhor das hipóteses, essa resposta é apenas uma experiência subjetiva que acontece em alguns casos.
Cray
-1

Não afeta o desempenho se o seu espaço de troca estiver ocupado. A única penalidade de desempenho é que as coisas estão entrando / saindo de swap. Se nada estiver sendo trocado / trocado, não será necessário se preocupar com nada.

Rory
fonte
10
Sim, mas se algo está sendo trocado, isso afeta o desempenho, daí a questão.
quant
Isso é um absurdo real, geralmente grandes trocas de fallback são em HDDs ou geralmente em um dispositivo mais lento que a RAM - se o espaço acabar - as coisas existentes são trocadas - como, por exemplo, navegador de internet - e você está praticamente usando-as no dispositivo mais lento. ..
jave.web 13/08