Domanda Come svuotare lo swap se c'è una RAM libera?


Quando apro un'app intensa di RAM (VirtualBox impostato su 2 GB di RAM), viene generalmente utilizzato uno spazio di scambio, a seconda di cos'altro ho aperto in quel momento.

Tuttavia, quando si esce da quest'ultima applicazione, i 2 GB di RAM vengono liberati, ma rimane lo stesso spazio di scambio.

Ad esempio, in questo momento, circa due ore dopo aver chiuso VirtualBox, ho 1.6 GB di RAM libera e ancora 770 MB in swap.

Come posso dire a Ubuntu di smettere di usare quello scambio e di tornare a usare la RAM?


255
2017-08-06 06:43


origine


La cosa più semplice riavvia il tuo dispositivo e risparmia tempo di coping su ram e free ram risparmia energia della temperatura del laptop e della CPU - Mohamed Slama
Un grosso presupposto che ripopolare tutte le cose sul tuo computer richiede meno tempo di quello. - jQwierdy


risposte:


Solo perché lo swap è allocato, non significa che sia "usato". Mentre programmi come monitor di sistema e top mostreranno parte dello spazio di swap che viene allocato (nell'esempio 770 MB), ciò non significa che il sistema stia attivamente scambiando / out.

Per scoprire se qualcosa sta cambiando in / out puoi usare il vmstat comando. Lascialo in esecuzione pochi secondi per sistemarsi e guardare il si (swapin) e so (swapout) colonne. Se non succede nulla, non c'è motivo di preoccuparsi.

Ecco l'output della corsa vmstat 1, dove puoi vedere che la mia macchina non sta affatto scambiando.

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

Eppure qui dentro top puoi vedere che ho assegnato lo spazio di swap: -

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached

146
2017-08-06 10:04



"Nessuna ragione per essere preoccupato", fino al punto in cui continuo a utilizzare alcune applicazioni che sono state scambiate. poi si scatena l'inferno. - törzsmókus
Questo post non risponde alla domanda. - emchristiansen
La premessa della domanda è basata su idee sbagliate. Questo post risolve i malintesi. - popey
Non vedo un equivoco, vedo un disaccordo su cosa significa "usato". Si intende "usato" per riferirsi allo swap attivo in / out, mentre la domanda originale sembra essere posta con "usato", il che significa che ci sono dati che sono stati scambiati, che possono essere successivamente sostituiti. motivi validi per voler svuotare lo swap dopo un evento che scambia un sacco di altra memoria, essenzialmente anticipando lo swap attivo che l'utente sa che si verificherà in seguito (specialmente se è probabile che il successivo "de-swapping" si verifichi mentre il il disco è sotto carico per altri motivi). - drfrogsplat
Dopo aver eseguito un'applicazione intensiva di memoria, le altre mie applicazioni non rispondono quando passo a loro, presumibilmente a causa di uno scambio. Un modo per dire al sistema di rimuovere il maggior numero possibile di dati (seguito da una pausa caffè) sarebbe meglio che dover aspettare 20 secondi ogni volta che Alt + Tab. - Mark K Cowan


Il kernel Linux che sta alla base di Ubuntu si "scambierà" automaticamente quelle pagine dal disco alla RAM secondo necessità, quindi in generale direi che è naturale.

Tuttavia, se ritieni davvero di doverlo forzare, (posso vedere uno scenario in cui vorresti sapere che il sistema sarà più reattivo in seguito) puoi momentaneamente disabilitare e riattivare lo swap

sudo swapoff -a
sudo swapon -a

O in alternativa come un singolo comando

swapoff -a && swapon -a

Fai attenzione, perché potresti rendere instabile il tuo sistema, specialmente se è già in RAM.


348
2017-08-06 06:47



Questo ha fatto il trucco, lo scambio è stato copiato in RAM. Immagino che devi solo assicurarti di avere almeno la quantità di swap usata come ram gratuita prima di eseguire swapoff, giusto? - jfoucher
Lo scambio non è stato copiato nella RAM. Era semplicemente disabilitato. Dovresti assicurarti che la scatola non si scambia prima di fare questo. Se lo fai, il kernel vedrà la memoria scomparire e l'OOM-Killer probabilmente inizierà a uccidere arbitrariamente le applicazioni. Non c'è motivo per cui tu debba "pulire" lo scambio come questo. (vedi il mio altro commento) :) - popey
In realtà lo swap è, in pratica, copiato su RAM, o più accuratamente, le pagine vengono ricollocate da disco a RAM prima che lo scambio possa essere disabilitato. - SpamapS
Le pagine vengono copiate in RAM solo se sono ancora necessarie per qualche processo. A volte una pagina scambiata appartiene a un processo che è già stato completato e al kernel non interessa rimuovere immediatamente queste pagine dallo scambio. - BrunoJCM
Questa dovrebbe essere la risposta corretta, in quanto è il modo di riportare le pagine scambiate nella RAM e quindi svuotare la memoria di scambio - Alfonso Jiménez


Puoi anche impostare il valore "swappiness" dal valore predefinito di 60, in questo modo lo swap non diventerà così grande da iniziare. Perché il valore predefinito di spedizione è impostato su 60 quando il valore consigliato è 10 perplesso. Da Ubuntu SwapFAQ:

L'impostazione predefinita in Ubuntu è swappiness = 60. La riduzione del valore predefinito di swappiness probabilmente migliorerà le prestazioni generali di una tipica installazione desktop di Ubuntu. Si consiglia un valore di swappiness = 10, ma sentiti libero di sperimentare.

Cambiando questo valore a 10 o anche a 0, è possibile aggiungere un aumento di velocità significativo e percepibile a un sistema precedente con un'unità lenta. L'impostazione di questo valore su 0 non disattiva lo swap per il kernel Linux 3.4 e successivi ma con 3.5+ fa si vorrà usare il valore 1 se si desidera mantenerlo sull'impostazione più bassa *.

Non vedo alcun motivo per non impostare questo a 0 poiché tutto ciò che colpisce il disco è più lento della RAM. Ho 8 core virtuali, un SSD veloce e 8 GB di memoria e il mio swap è impostato su 0. A partire da questo momento ho 3 macchine virtuali in esecuzione, il mio utilizzo della memoria è 7.1 di 7.7 GB, il mio swap usato è solo 576KB di 952 MB e tutti i sistemi funzionano senza intoppi!

Da Ubuntu SwapFAQ:

Il parametro swappiness controlla la tendenza del kernel a spostare i processi fuori dalla memoria fisica e sul disco di scambio. Poiché i dischi sono molto più lenti della RAM, questo può portare a tempi di risposta più lenti per il sistema e le applicazioni se i processi sono troppo aggressivamente spostati dalla memoria.

  1. lo swappiness può avere un valore compreso tra 0 e 100
  2. swappiness = 0 dice al kernel di evitare di scambiare i processi con la memoria fisica il più a lungo possibile
  3. swappiness = 100 dice al kernel di scambiare in modo aggressivo i processi fuori dalla memoria fisica e spostarli nella cache di swap

Di seguito sono riportate le istruzioni di base per il controllo dello swappiness, lo svuotamento dello swap e la sostituzione dello swappiness a 0:

Per verificare il valore di swappiness:

cat /proc/sys/vm/swappiness

Per impostare temporaneamente lo swap su 0 (come suggerito da SpamapS):

Questo svuoterà lo swap e trasferirà tutto lo swap in memoria. Per prima cosa assicurati di avere abbastanza memoria disponibile visualizzando la scheda delle risorse di gnome-system-monitor, la tua memoria libera dovrebbe essere maggiore del tuo swap usato. Questo processo potrebbe richiedere del tempo, utilizzare gnome-system-monitor per monitorare e verificare i progressi.

sudo swapoff --all

Per impostare il nuovo valore su 0:

sudo sysctl vm.swappiness=0 

Per riattivare lo swap:

sudo swapon --all

Per impostare in modo permanente lo swappiness su 0:

  1. sudoedit /etc/sysctl.conf 
  2. Aggiungi questa linea vm.swappiness = 0 
  3. sudo shutdown -r now # riavviare il sistema

* Con la versione 3.5+ del kernel, lo swappiness su 0 lo disattiva completamente e si consiglia l'impostazione 1 se si desidera l'algoritmo swappiness più basso. fonte: https://www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/


119
2018-06-11 14:10



Questa dovrebbe essere la risposta accettata. - quant
Ho appena aggiornato la risposta per includere un modo permanente per impostare lo swappiness. Non sono sicuro di come sia andato così tanto, credo che nessuno l'abbia provato. - Elijah Lynn
Più buona lettura sullo swappiness in questa risposta => askubuntu.com/a/103916/11929 - Elijah Lynn
Aggiunta una nota sul comportamento di swappiness = 0 che cambia con il kernel Linux versione 3.5+. - Elijah Lynn
Non sono sicuro che fosse disponibile quando l'autore ha pubblicato la risposta originariamente, ma un valore di swappiness di "60" è in vigore per installazioni di ubuntu server poiché quell'ambiente ha un diverso set di specifiche per le prestazioni. help.ubuntu.com/community/... - Frito


Ho scoperto che lo svuotamento dello swap può essere di grande aiuto su sistemi con dischi lenti e RAM limitata. Naturalmente, come già accennato, il modo per farlo è quello di correre sudo swapoff -a; sudo swapon -a. Il problema qui è che se c'è una RAM insufficiente, fare così causerà tutti i tipi di problemi.

Ho scritto una sceneggiatura che chiamo toggle_swap che ha funzionato per me negli ultimi anni. Controlla la RAM libera sufficiente prima di disabilitare effettivamente lo swap. Ecco qui:

#!/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



Questo è stato davvero utile, grazie! - Luke Cousins
Ehi, questa è la soluzione migliore. Grazie! - Fabio A. Correa
Fantastico stavo cercando qualcosa di simile. Forse per essere un po 'più sicuro potresti presentare il numero e le percentuali e poi chiedere, solo per essere assolutamente sicuro. - Atherion
Ho aggiornato il codice e ho creato un gist basato gist.github.com/Jekis/6c8fe9dfb999fa76479058e2d769ee5c - Jekis
Questa è la conclusione che ho raggiunto dopo aver letto tutti i suggerimenti, come si dovrebbe in qualche modo accertarsi che ci sia abbastanza RAM prima di uccidere lo swap. Grazie signore, sceneggiatura meravigliosa. Dovrebbe essere incluso in Ubuntu di default (non scherzando, è davvero un must). - Shiki


Dopo aver masticato con swappiness per un paio di giorni, sono giunto alla conclusione che il kernel dovrebbe essere lasciato ai propri dispositivi. Sa cosa sta facendo ed è ottimizzato per darti la migliore esperienza.

A meno che tu non abbia una buona ragione per volere indietro quel disco, lascerei perdere.


23
2017-08-06 16:34



Ho avuto alcune cose in swap, vmstat mi ha mostrato che swapin e swapout stavano succedendo, e Chrome era in ritardo, mentre la mia CPU era usata a malapena. Abbastanza buono, no? - Xerus


Non influisce sulle prestazioni se lo spazio di scambio è occupato. L'unica penalizzazione delle prestazioni è che le cose stanno andando dentro / fuori dallo swap. Se non viene scambiato / scambiato nulla, non devi preoccuparti di nulla.


1
2017-08-11 19:35



Sì, ma se qualcosa è essere scambiato fa influire sulle prestazioni, quindi questa domanda. - quant