Come svuotare lo swap se c'è RAM libera?


315

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

Tuttavia, quando esco dall'ultima applicazione, i 2 GB di RAM vengono liberati, ma rimane lo stesso utilizzo dello spazio di swap.

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

Come posso dire a Ubuntu di smettere di usare questo swap e di tornare a usare la RAM?


La cosa più semplice riavvia il tuo dispositivo e risparmia tempo ad affrontare la RAM e la RAM libera risparmia la potenza del laptop e della temperatura della CPU
Mohamed Slama,

5
Grande presupposto che ripopolare tutte le cose sul tuo computer richiede meno tempo.
jQwierdy,

Ubuntu 16.04, almeno, può continuare a utilizzare lo swap molto tempo dopo che era necessario, rendendo così più lenti gli ordini di grandezza del sistema facendo affidamento sul file di scambio anche se non è più necessario. L'intervento manuale può quindi essere utile. Il riavvio non è sempre un'opzione.
matt

Risposte:


167

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

Per scoprire se qualcosa sta scambiando dentro / fuori puoi usare il vmstatcomando. Lascialo siagire qualche secondo per sistemarsi e guardare le colonne (swapin) e so(swapout). Se non succede nulla, non c'è motivo di preoccuparsi.

Ecco l'output di running vmstat 1, dove puoi vedere che la mia macchina non si 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 toppuoi vedere che ho allocato lo spazio di swap: -

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

32
"Nessun motivo di preoccuparsi", fino al punto in cui continuo a utilizzare alcune applicazioni che sono state scambiate. allora si scatena l'inferno.
törzsmókus,

207
Questo post non risponde alla domanda.
emchristiansen,

18
La premessa della domanda si basa su idee sbagliate. Questo post affronta le idee sbagliate.
popey,

30
Non vedo un'idea sbagliata, vedo un disaccordo sul significato di "usato". Vuoi dire "usato" per riferirti allo scambio attivo in / out, mentre la domanda originale sembra essere posta con "usato", il che significa che ci sono dati che sono stati scambiati, che potrebbe essere necessario in seguito ricambiare. validi motivi per voler svuotare lo swap dopo un evento che sostituisce molta altra memoria, essenzialmente anticipando lo swap attivo che l'utente sa che si verificherà in seguito (specialmente se è probabile che si verifichi il successivo "de-swap" mentre il il disco è sotto carico per altri motivi).
drfrogsplat,

39
Dopo aver eseguito un'applicazione ad alta intensità di memoria, le altre mie applicazioni non rispondono quando passo a esse, presumibilmente a causa di uno scambio. Un modo per dire al sistema di sbloccare quanti più dati possibili (seguito da una pausa caffè) sarebbe meglio che dover aspettare 20 secondi ogni volta che I Alt + Tab.
Mark K Cowan,

425

Il kernel Linux alla base di Ubuntu "scambia" automaticamente quelle pagine dal disco alla RAM secondo necessità, quindi in generale direi che lascia che accada naturalmente.

Tuttavia, se ritieni davvero di aver bisogno di forzarlo, (posso vedere uno scenario in cui vorresti sapere che il sistema risponderà in seguito), puoi disabilitare e riattivare momentaneamente lo swap

sudo swapoff -a
sudo swapon -a

O in alternativa come una riga singola

swapoff -a; swapon -a

Fai attenzione, poiché potresti rendere instabile il tuo sistema, specialmente se ha già poca RAM.


8
Questo ha funzionato, lo scambio è stato copiato su ram. Suppongo che devi solo assicurarti di avere almeno la quantità di swap utilizzata come RAM libera prima di eseguire swapoff, giusto?
jfoucher

12
Lo scambio non è stato copiato nella RAM. Era semplicemente disabilitato. È necessario assicurarsi che la scatola non si scambia prima di farlo. Se lo fai, allora il kernel vedrà scomparire la memoria e OOM-Killer probabilmente inizierà a uccidere le applicazioni in modo arbitrario. Non c'è motivo per cui dovresti "ripulire" lo swap in questo modo. (vedi il mio altro commento) :)
popey,

51
In realtà lo swap viene, sostanzialmente, copiato in ram, o più precisamente, le pagine vengono scambiate da disco a RAM prima che lo swap possa essere disabilitato.
SpamapS

14
Le pagine vengono copiate nella 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,

6
Questa dovrebbe essere la risposta corretta, in quanto è il modo di riportare le pagine scambiate su RAM e quindi svuotare la memoria di scambio
Alfonso Jiménez,

144

Puoi anche impostare il tuo valore di "swapiness" dal valore predefinito di 60, in questo modo lo swap non crescerà così grande all'inizio. Perché l'impostazione predefinita per la spedizione è impostata su 60 quando il valore consigliato è 10 mi sconcerta. Da Ubuntu SwapFAQ :

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

Modificando questo valore su 10 o addirittura 0, è possibile aggiungere un aumento di velocità significativo e percepibile a un sistema più vecchio con un azionamento lento. L'impostazione di questo valore su 0 non disattiva lo swap per il kernel Linux 3.4 e precedenti ma con 3.5+ lo fa quindi si vorrà usare un valore di 1 se si desidera mantenerlo sulla sua impostazione più bassa *.

Non vedo alcun motivo per non impostare questo su 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 scambio è 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 scambio usato è solo a 576 KB di 952 MB e tutti i sistemi funzionano senza problemi!

Da Ubuntu SwapFAQ :

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

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

Di seguito sono riportate le istruzioni di base per controllare lo swapiness, svuotare lo swap e modificarlo su 0:

Per verificare il valore di swapiness:

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 risorse di gnome-system-monitor, la tua memoria libera dovrebbe essere maggiore dello 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 permanentemente lo swappiness su 0:

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

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


1
Ho appena aggiornato la risposta per includere un modo permanente di impostare la swappiness. Non sono sicuro di come sia stato votato così tanto, suppongo che nessuno lo abbia provato.
Elijah Lynn,

1
Ancora una buona lettura sulla swappiness in questa risposta => askubuntu.com/a/103916/11929
Elijah Lynn

3
Non sono sicuro che questo fosse disponibile quando l'autore ha inizialmente pubblicato la risposta, ma un valore di swapiness di "60" è presente per le installazioni di server Ubuntu poiché quell'ambiente ha un diverso set di specifiche per le prestazioni. help.ubuntu.com/community/…
Frito,

1
Questa impostazione è molto efficace nel controllo delle dimensioni dello swap. Il mio sistema ha 16 G RAM e 16 G di scambio. A volte sono in esecuzione su macchine virtuali e alcune delle mie applicazioni vengono scambiate. Quando chiudo le macchine virtuali, l'utilizzo della RAM diminuisce, ma l'utilizzo dello scambio rimane lo stesso e il mio sistema è in ritardo quando si cambiano le applicazioni. Cambiare la swapiness ha migliorato le prestazioni per me.
Kapad,

1
Questa dovrebbe essere la risposta accettata davvero. Spiegazione approfondita del problema e della sua soluzione, nonché collegamenti e una soluzione per conservare la memoria di Swap, ma aiutano a tenerlo sotto controllo in primo luogo. Roba impressionante. Grazie. :)
Jack_Hu

53

Ho scoperto che lo svuotamento di swap può aiutare molto su sistemi con dischi lenti e RAM limitata. Naturalmente, come già accennato, il modo per farlo è quello di eseguire sudo swapoff -a; sudo swapon -a. Il problema qui è che se la RAM è insufficiente, farlo causerà tutti i tipi di problemi.

Ho scritto una sceneggiatura che chiamo toggle_swapche ha funzionato per me negli ultimi anni. Controlla abbastanza RAM libera prima di disabilitare effettivamente lo scambio. 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

Fantastico stavo cercando qualcosa del genere. Forse per essere un po 'più sicuro potresti presentare il numero e le percentuali e poi chiedere, solo per essere assolutamente sicuro.
Atherion,

2
Ho aggiornato il codice e ho creato un gist basato su gist.github.com/Jekis/6c8fe9dfb999fa76479058e2d769ee5c
Jekis

Questa è la conclusione che ho raggiunto dopo aver letto tutti i suggerimenti, come si dovrebbe in qualche modo assicurarsi che ci sia abbastanza RAM prima di uccidere lo swap. Grazie signore, sceneggiatura meravigliosa. Dovrebbe essere incluso in Ubuntu per impostazione predefinita (non scherzando, è davvero un must.)
Shiki,

Tranne il fatto che se si esegue qualcosa di nuovo mentre si disattiva lo scambio e prima che si riaccenda, non avrà memoria sufficiente.
barteks2x

Dipende da quanta memoria libera hai. Se c'è abbastanza memoria libera per contenere tutto in scambio E il nuovo processo, allora non c'è problema. Altrimenti allora hai ragione.
Scott Severance,

25

Dopo essermi distratto per un paio di giorni, sono giunto alla conclusione che il kernel dovrebbe essere lasciato ai suoi dispositivi. Sa cosa sta facendo ed è ottimizzato per offrirti la migliore esperienza.

A meno che tu non abbia una buona ragione per riavere quel disco, lo lascerei.


2
Avevo delle cose da scambiare, vmstat mi ha mostrato che stavano succedendo swapin e swapout, e Chrome era in ritardo, mentre la mia CPU era a malapena utilizzata. Buona ragione, no?
Xerus,

Ci sono sicuramente casi in cui alcuni scambi sul desktop lo rendono ritardato. (non mentre si scambia, ma anche dopo, quando c'è abbastanza RAM, per molto tempo dopo.) Quindi nella migliore delle ipotesi questa risposta è solo un'esperienza soggettiva che si verifica in alcuni casi.
Cray il

-1

Non influisce sulle prestazioni se lo spazio di swap è occupato. L'unica penalità prestazionale è che le cose vanno dentro / fuori dallo swap. Se nulla viene scambiato / scambiato, allora non devi preoccuparti di nulla.


10
Sì, ma se qualcosa è in corso scambiato esso non influisce sulle prestazioni, quindi questa domanda.
quant

Questa è una vera assurdità, di solito grandi scambi di fallback sono su HDD o generalmente su un dispositivo più lento della RAM - se lo spazio si esaurisce - le cose esistenti vengono scambiate - come ad esempio il browser Internet - e quindi lo stai praticamente usando dal dispositivo più lento. ..
jave.web
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.