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

251

Quando apro un'app intensa di RAM (VirtualBox impostato su 2 GB di RAM), in genere viene utilizzato uno 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 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 ripristinare l'utilizzo della RAM?

    
posta jfoucher 06.08.2010 - 08:43

6 risposte

146

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

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

Ecco l'output di vmstat 1 in esecuzione, in cui 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

Tuttavia qui in top puoi vedere che ho lo spazio di swap allocato: -

Mem:    475236k total,   245076k used,   230160k free,     9720k buffers
Swap:   491512k total,    78588k used,   412924k free,    72476k cached
    
risposta data popey 06.08.2010 - 12:04
341

Il kernel Linux che sta alla base di Ubuntu si "scambierà" automaticamente quelle pagine da disco a RAM se necessario, 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 scambio

sudo swapoff -a
sudo swapon -a

O in alternativa come singolo comando

swapoff -a && swapon -a

Fai attenzione a fare questo, perché potresti rendere instabile il tuo sistema, specialmente se è già basso sulla RAM.

    
risposta data SpamapS 06.08.2010 - 08:47
119

Puoi anche impostare il valore "swappiness" dal valore predefinito di 60, in questo modo lo swap non diventerà così grande da cominciare. 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. Un valore di swappiness = 10 è raccomandato , 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 vecchio sistema 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 valore a 0 poiché tutto ciò che colpisce il disco è più lento della RAM. Ho 8 core virtuali, un veloce SSD e amp; 8 GB di memoria e il mio swap sono impostati su 0. A partire da questo momento ho 3 macchine virtuali in esecuzione, l'utilizzo della memoria è 7,1 di 7,7 GB, il mio swap usato è solo 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 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.   
  3. swappiness = 0 dice al kernel di evitare lo scambio di processi dalla memoria fisica il più a lungo possibile
  4.   
  5. swappiness = 100 dice al kernel di scambiare in modo aggressivo i processi fuori dalla memoria fisica e spostarli nella cache di swap
  6.   

Di seguito sono riportate le istruzioni di base per il controllo dello swappiness, lo svuotamento dello swap e la modifica 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 l'avanzamento.

sudo swapoff --all

Per impostare il nuovo valore su 0:

sudo sysctl vm.swappiness=0 

Per riattivare lo scambio:

sudo swapon --all

Per impostare in modo permanente lo swappiness su 0:

  1. sudoedit /etc/sysctl.conf
  2. Aggiungi questa riga vm.swappiness = 0
  3. sudo shutdown -r now # restart system

* Con la versione 3.5+ del kernel lo swappiness su 0 lo spegne completamente e si consiglia l'impostazione 1 se si desidera l'algoritmo swappiness più basso. fonte: link

    
risposta data Elijah Lynn 11.06.2012 - 16:10
46

Ho scoperto che lo svuotamento dello swap può essere di grande aiuto su sistemi con dischi lenti e RAM limitata. Naturalmente, come già detto, il modo per farlo è eseguire 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 uno script che chiamo toggle_swap che ha funzionato per me negli ultimi anni. Controlla la RAM libera sufficiente prima di disabilitare effettivamente lo swap. Eccolo:

#!/bin/bash

free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print }')"
buffers="$(echo "$mem_data" | awk '{print }')"
cache="$(echo "$mem_data" | awk '{print }')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print }')"

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
    
risposta data Scott Severance 25.12.2011 - 17:35
23

Dopo aver passato un po 'di tempo 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.

    
risposta data Erigami 06.08.2010 - 18:34
1

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.

    
risposta data Rory 11.08.2010 - 21:35

Leggi altre domande sui tag