Questão 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 encerro o último aplicativo, os 2 GB 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 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?


256
2017-08-06 06:43


origem


A coisa mais fácil reinicie seu dispositivo e economizar tempo de coping para ram e ram livre economizar energia do laptop e temperatura da CPU - Mohamed Slama
Grande suposição de que o preenchimento de todas as coisas em seu computador leva menos tempo do que isso. - jQwierdy


Respostas:


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 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 alguma coisa está trocando dentro / fora você pode usar o vmstat comando. Deixe-o funcionando por alguns segundos para se acalmar e assistir ao si (swapin) e so (troca) colunas. Se nada está acontecendo, então não há razão para se preocupar.

Aqui está a saída da corrida 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

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

146
2017-08-06 10:04



"Não há motivo para se preocupar", até o ponto em que continuo a usar algum aplicativo que foi trocado. então todo o inferno se solta. - törzsmókus
Esta postagem não responde à pergunta. - emchristiansen
A premissa da questão é baseada em equívocos. Este post aborda os equívocos. - popey
Eu não vejo um equívoco, vejo um desacordo sobre o que "usado" significa. Você está querendo dizer "usado" para se referir a troca ativa de entrada / saída, enquanto a pergunta original parece ser colocada com "usado" significando que há dados que foram trocados, que podem mais tarde precisar ser trocados de volta. razões válidas para querer liberar o swap após um evento que troca muito de outra memória, essencialmente antecipando a troca ativa que o usuário sabe que ocorrerá mais tarde (especialmente se a posterior 'de-troca' é provável que ocorra enquanto o disco está sob carga por outras razões). - drfrogsplat
Depois de executar um aplicativo intensivo de memória, meus outros aplicativos não são responsivos quando eu alterno para eles, presumivelmente devido à troca. Alguma maneira de dizer ao sistema para trocar o máximo de dados possível (seguido de uma pausa para o café) seria melhor do que ter que esperar 20s toda vez que eu pressionar Alt + Tab. - Mark K Cowan


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 sentir que precisa forçá-lo, (eu posso ver um cenário onde você gostaria de saber que o sistema será responsivo 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.


348
2017-08-06 06:47



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


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 sinta-se livre 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 o valor 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 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 perfeitamente!

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 a troca 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 o swap 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 algoritmo de swappiness mais baixo. fonte: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/


119
2018-06-11 14:10



Essa deve ser a resposta aceita. - quant
Acabei de atualizar a resposta para incluir uma maneira permanente de definir a permuta. Não sei como foi tão votado, acredito que ninguém tenha testado. - Elijah Lynn
Mais boa leitura sobre swappiness nesta resposta => askubuntu.com/a/103916/11929 - Elijah Lynn
Adicionada uma nota sobre o comportamento do swappiness = 0 mudando com o kernel Linux versão 3.5+. - Elijah Lynn
Eu não tenho certeza se isso estava disponível quando o autor originalmente postou a resposta, mas um valor de swappiness de "60" está em vigor para instalações do servidor ubuntu desde que o ambiente tem um conjunto diferente de especificações para o desempenho. help.ubuntu.com/community/… - Frito


Descobri que o swap de esvaziamento pode ajudar muito em sistemas com discos lentos e RAM limitada. Claro, 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 eu chamo toggle_swap 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 $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

46
2017-12-25 16:35



Isso foi muito útil, obrigado! - Luke Cousins
Ei, esta é a melhor solução. Obrigado! - Fabio A. Correa
Awesome 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, só para ter certeza absoluta. - Atherion
Eu atualizei o código e criei uma essência baseada gist.github.com/Jekis/6c8fe9dfb999fa76479058e2d769ee5c - Jekis
Esta é a conclusão a que cheguei depois de ler todas as dicas, como se de alguma forma deveria ter certeza de 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, é realmente um musthave). - Shiki


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


23
2017-08-06 16:34



Eu tinha algumas coisas em swap, vmstat me mostrou que swapin e swapout estavam acontecendo, e o Chrome estava atrasado, enquanto meu CPU mal era usado. Razão boa o suficiente, não? - Xerus


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.


1
2017-08-11 19:35



Sim mas se algo é sendo trocado faz afetar o desempenho, daí esta questão. - quant