it-swarm.it

Come svuotare lo swap se c'è RAM libera?

Quando apro un'app intensiva 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 uso dello spazio di swap.

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

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

312
jfoucher

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 comando vmstat. Lascialo in esecuzione per alcuni secondi per sistemarsi e guardare le colonne si (swapin) e so (swapout). Se non succede nulla, non c'è motivo di preoccuparsi.

Ecco l'output di eseguire 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 in top puoi 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
168
popey

Il kernel Linux alla base di Ubuntu "scambia" automaticamente quelle pagine dal disco a 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.

418
SpamapS

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 di 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 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 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 dalla memoria in modo troppo aggressivo.

  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 svuota lo swap e trasferisce 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 riga 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/

144
Elijah Lynn

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 è 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_swap che ha funzionato per me negli ultimi anni. Controlla abbastanza RAM abbastanza prima di disabilitare 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
53
Scott Severance

Dopo essermi dilungato con swappiness 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.

26
Erigami

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.

0
Rory