Perché lo swap viene utilizzato anche se ho molta RAM libera?


208

Ho pensato che l'essenza di swap fosse quella di fungere da rete di sicurezza per l'archiviazione temporanea quando la RAM era piena, ma la mia partizione di swap viene costantemente utilizzata anche se a volte ho fino a 3 GB di RAM libera. È normale?


3
Si prega di condividere il contenuto o l'uscita dei seguenti comandi / file per aiutare meglio a trovare una soluzione il problema ( istruzioni in questa risposta ) : free -m,top -b 1
ish

Domani aggiornerò la domanda con i pastebins di questi comandi. Sono le 12 in questo momento :(
Mysterio

Dovrei modificare il titolo per aggiungere "... ma sono troppo assonnato per occuparmene adesso, quindi anche voi fate un pisolino": P
ish

Risposte:


188

Puoi provare a modificare il valore di "swappiness":

Dalle domande frequenti sullo scambio di Ubuntu :

Cos'è lo swappiness e come posso cambiarlo?

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. Per Kernel versione 3.5 e successive disabilita la swapiness.

  3. swappiness = 100 indica al kernel di scambiare in modo aggressivo i processi dalla memoria fisica e spostarli nella cache di scambio

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. Nota: le installazioni di server Ubuntu hanno requisiti di prestazione diversi rispetto ai sistemi desktop e il valore predefinito di 60 è probabilmente più adatto.

Per verificare il valore di swapiness

cat /proc/sys/vm/swappiness

Per modificare il valore di swapiness È possibile apportare una modifica temporanea (persa al riavvio) con un valore di swapiness di 10

sudo sysctl vm.swappiness=10

Per rendere permanente una modifica , modifica il file di configurazione con il tuo editor preferito:

gksudo gedit /etc/sysctl.conf

Cerca vm.swappiness e modifica il suo valore come desiderato. Se vm.swappiness non esiste, aggiungilo alla fine del file in questo modo:

vm.swappiness=10

Salva il file e riavvia.

Inoltre puoi dare un'occhiata: https://askubuntu.com/a/103916/54187


1
Speculazione inattiva: questo potrebbe effettivamente essere utile per le prestazioni: le pagine a cui non è stato effettuato l'accesso da un po 'di tempo possono essere copiate nello spazio di scambio, il che consente al sistema operativo di sfrattarle rapidamente se ha bisogno di memoria, ma i contenuti della pagina rimangono in memoria .
Simon Richter,

7
@SimonRichter Sì, questa è l'idea. Lo scambio di 60 è probabilmente troppo aggressivo sui sistemi moderni, poiché ciò significa che stai iniziando a scambiare quando hai ancora diversi concerti di memoria libera.
Brendan Long,

1
Esegui sudo sysctl --load=/etc/sysctl.confdopo aver modificato il file per applicare le modifiche
deFreitas

92

Ci sono alcuni aspetti diversi alla tua domanda.

Innanzitutto, qual è la tua definizione di "libero". In realtà non è così semplice come sembra in Linux (o in qualsiasi sistema operativo moderno).

Come Linux utilizza la RAM (molto semplificato)

Ogni applicazione può usare parte della tua memoria. Linux utilizza tutta la memoria altrimenti non occupata (tranne gli ultimi Mb) come "cache". Ciò include la cache delle pagine, le cache degli inode, ecc. Questa è una buona cosa: aiuta a velocizzare le cose. Sia la scrittura su disco che la lettura da disco possono essere velocizzate immensamente dalla cache.

Idealmente, hai abbastanza memoria per tutte le tue applicazioni e hai ancora diverse centinaia di Mb per la cache. In questa situazione, fintanto che le applicazioni non aumentano l'utilizzo della memoria e il sistema non sta lottando per ottenere spazio sufficiente per la cache, non è necessario alcuno scambio.

Una volta che le applicazioni richiedono più RAM, vanno semplicemente in parte dello spazio utilizzato dalla cache, riducendo la cache. La de-allocazione della cache è economica e abbastanza semplice da essere semplicemente eseguita in tempo reale: tutto ciò che si trova nella cache è solo una seconda copia di qualcosa che è già sul disco, quindi può essere semplicemente allocato all'istante o è qualcosa che vorremmo hanno dovuto irrigare su disco entro i prossimi pochi secondi in ogni caso .

Questa non è una situazione specifica di Linux: tutti i sistemi operativi moderni funzionano in questo modo. I diversi sistemi operativi potrebbero semplicemente riportare RAM libera in modo diverso: alcuni includono la cache come parte di ciò che considerano "libero" e altri no.

Quando si parla di RAM libera, è molto più significativo includere la cache, perché praticamente è gratuita: è disponibile se qualsiasi applicazione lo richiede. Su Linux, il freecomando riporta entrambi i modi: la prima riga include cache nella colonna RAM utilizzata e la seconda riga include cache (e buffer) nella colonna libera.

Come Linux usa lo swap (ancora più semplificato)

Dopo aver esaurito la memoria sufficiente per non disporre di memoria sufficiente per una cache funzionante, Linux potrebbe decidere di riassegnare parte della memoria dell'applicazione non utilizzata dalla RAM allo scambio.

Non lo fa secondo un taglio definito. Non è come raggiungere una certa percentuale di allocazione, quindi Linux inizia a scambiare. Ha un algoritmo piuttosto "fuzzy". Tiene conto di molte cose, che possono essere meglio descritte da "quanta pressione c'è per l'allocazione della memoria". Se c'è molta "pressione" per allocare nuova memoria, aumenterà le possibilità che alcuni vengano scambiati per fare più spazio. Se c'è meno "pressione", diminuirà queste possibilità.

Il tuo sistema ha un'impostazione di "swappiness" che ti aiuta a modificare il modo in cui viene calcolata questa "pressione". Normalmente non è consigliabile modificarlo affatto, e non consiglierei di modificarlo. Lo scambio è nel complesso una cosa molto positiva, anche se ci sono alcuni casi limite in cui danneggia le prestazioni, se si considerano le prestazioni complessive del sistema è un vantaggio netto per una vasta gamma di attività. Se riduci lo swappiness, lasci che la quantità di memoria cache si riduca un po 'più di quanto farebbe altrimenti, anche quando potrebbe essere davvero utile. Se questo è un compromesso abbastanza buono per qualsiasi problema tu abbia con lo scambio dipende da te. Dovresti solo sapere cosa stai facendo, tutto qui.

Esiste una situazione ben nota in cui lo swap danneggia davvero le prestazioni percepite su un sistema desktop, ed è in che velocità le applicazioni possono rispondere di nuovo all'input dell'utente dopo essere state lasciate inattive per lungo tempo e avere processi in background pesanti in IO (come un backup notturno) eseguito. Questa è una lentezza molto visibile, ma non abbastanza per giustificare la disattivazione dello swap tutti insieme e molto difficile da prevenire in qualsiasi sistema operativo. Disattiva lo scambio e questa lentezza iniziale dopo la scansione di backup / virus potrebbe non verificarsi, ma il sistema potrebbe funzionare un po 'più lentamente per tutto il giorno. Anche questa non è una situazione limitata a Linux.

Quando si sceglie ciò che deve essere scambiato su disco, il sistema tenta di selezionare la memoria che non viene effettivamente utilizzata, da leggere o da cui scrivere. Ha un algoritmo piuttosto semplice per calcolare questo che sceglie bene la maggior parte delle volte.

Se hai un sistema in cui hai una grande quantità di RAM (al momento della stesura, 8 GB è una quantità enorme per una tipica distribuzione Linux), molto raramente ti imbatterai in una situazione in cui è necessario lo swap. Puoi anche provare a disattivare lo swap. Non consiglio mai di farlo, ma solo perché non sai mai quando più RAM potrebbe salvarti da un crash dell'applicazione. Ma se sai che non ne avrai bisogno, puoi farlo.

Ma come può lo swap accelerare il mio sistema? Lo scambio non rallenta le cose?

L'atto di trasferire i dati dalla RAM allo swap è un'operazione lenta, ma viene presa solo quando il kernel è abbastanza sicuro che il vantaggio complessivo supererà questo. Ad esempio, se la memoria della tua applicazione è salita al punto da non avere quasi più cache e il tuo I / O è molto inefficiente per questo motivo, puoi effettivamente ottenere molta più velocità dal tuo sistema liberando un po 'di memoria, anche dopo la spesa iniziale di scambio di dati per liberarli.

È anche l'ultima risorsa se le tue applicazioni richiedono effettivamente più memoria di quella che hai in realtà. In questo caso, lo scambio è necessario per prevenire una situazione di memoria insufficiente che spesso provoca l'arresto anomalo di un'applicazione o la morte forzata.

Lo scambio è associato solo a momenti in cui il sistema funziona in modo scadente perché si verifica in momenti in cui si sta esaurendo la RAM utilizzabile, il che rallenterebbe il sistema (o lo renderebbe instabile) anche se non si fosse effettuato lo scambio. Quindi, per semplificare le cose, lo scambio avviene perché il tuo sistema si sta impantanando, piuttosto che il contrario.

Una volta scambiati i dati, quando vengono di nuovo pubblicati?

Il trasferimento dei dati al di fuori dello scambio (almeno per i dischi rigidi tradizionali) richiede tanto tempo quanto il loro inserimento. Quindi comprensibilmente, il tuo kernel sarà altrettanto riluttante a rimuovere i dati dallo swap, specialmente se non viene effettivamente utilizzato (cioè letto o scritto). Se hai dati in swap e non vengono utilizzati, in realtà è una buona cosa che rimanga in swap, poiché lascia più memoria per altre cose che vengono utilizzate, potenzialmente velocizzando il tuo sistema.


5
+1 per una spiegazione dettagliata. Mi piace anche mantenere lo scambio 2GiB sui miei computer. Se qualcosa va male - perdite di memoria, ecc., Puoi vedere lo swap che sale e cercare il problema prima che si verifichi la memoria insufficiente. È una rete di sicurezza e uno strumento per le prestazioni.
Joe

1
Sul mio netbook, che ha solo 2 GB di RAM, conservo 4 GB di swap. Questo perché uso il netbook per molto di più a quello previsto e i miei programmi richiedono spesso più di 2 GB di memoria. Dato che Linux si comporta molto male in situazioni di memoria insufficiente, preferisco avere una grande rete di sicurezza. E ho un sacco di spazio su disco.
Scott Severance,

Se i tuoi programmi richiedono frequentemente più di 2 GB di memoria, prenderei in considerazione l'aggiunta di più RAM (è ultra-economica!) Perché esaurire la RAM danneggerebbe le prestazioni. Per il beneficio di altri lettori: assicurati che non stai solo guardando la memoria cache che dovrebbe contenere la RAM disponibile - vedi altri riferimenti a free -m.
thomasrutter,

2
@neon_overload: dovrei solo notare che, secondo HP, la RAM massima del mio netbook è di 1 GB. Adesso ci sono 2 GB e le fonti Internet suggeriscono che 2 GB è il massimo effettivo. Quindi la necessità di questo tipo di soluzioni alternative.
Scott Severance,

@thomasrutter: come cambia la tua risposta per server di grandi dimensioni, uno dei miei ha 1 TB (sì un terabyte completo) di RAM e sta ancora usando swap; quale impostazione di swapiness e quale dimensione di partizione di swap consiglieresti?
chrisinmtown,

24

L'impostazione del valore di swapiness non funziona in tutte le situazioni. Se funziona per te, fantastico. In caso contrario, ho scritto una sceneggiatura per cancellare periodicamente lo scambio disattivandolo e riaccendendolo.

Il cambio di swap è un po 'rischioso se non stai attento. Se non hai abbastanza RAM libera per contenere tutto nella RAM più tutto nello swap, provare a disabilitare lo swap farà sì che il tuo sistema non risponda. Il mio script controlla prima se c'è abbastanza RAM libera (il che richiede un po 'di tempo, poiché la quantità effettiva di RAM libera è diversa da quella che freesegnala come libera), quindi attiva o disattiva lo scambio solo in tal caso. Ma, se sei un po 'a corto di RAM, non avviare un altro processo importante mentre lo script è in esecuzione. Ecco qui:

#!/bin/bash

# Make sure that all text is parsed in the same language
export LC_MESSAGES=en_US.UTF-8
export LC_COLLATE=en_US.UTF-8
export LANG=en_US.utf8
export LANGUAGE=en_US:en
export LC_CTYPE=en_US.UTF-8

# Calculate how much memory and swap is free
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)"

# Do the work
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
    echo "Freeing swap..."
    swapoff -a
    swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi

È necessario eseguire questo script come root (ad esempio, con sudo). Questo script non lascerà il tuo sistema non rispondente; se hai RAM insufficiente, si rifiuterà di attivare o disattivare lo scambio. Ho usato questo script senza problemi per quasi cinque anni ormai.


+1 per lo script. Potresti voler modernizzarlo un po 'cambiando MB in MiB nelle uscite. Ho scritto una sceneggiatura simile senza tutti i (buoni) test di sicurezza che includi. Sul mio vecchio quaderno in cui lo scambio veniva utilizzato pesantemente, ci sarebbe voluto un po 'di tempo per correre - un minuto o due, ma non ha fatto nulla di male. Di tanto in tanto falliva perché non c'era abbastanza memoria libera per l'esecuzione, ma ciò non ha causato ulteriori problemi. Ho dovuto riavviare per chiarire le cose quando è successo. Ha avuto a che fare con quella che sembrava una perdita di memoria in Trasmissione (poiché riparata, credo) e con solo ram da 2GiB.
Joe

6
Se qualcosa è stato spostato in swap e rimane in swap, di solito è una buona cosa - significa che i dati non vengono effettivamente utilizzati, e libera parte della tua RAM per altre cose, determinando un potenziale aumento della velocità. Cosa ti ha portato a credere che questi dati non dovrebbero essere scambiati e dovrebbero invece occupare RAM più preziosa? Di solito il kernel è abbastanza bravo a sapere cosa non viene utilizzato e che può tranquillamente rimanere in scambio per liberare RAM.
thomasrutter,

@neon: tieni presente che le mie macchine hanno rispettivamente 2 GB e 3 GB di RAM, il che è abbastanza piccolo in questi giorni. Le prove sono in corso. Ad esempio, visualizzare menu o cambiare programma può essere lento a causa dello scambio, così come gli effetti Composal viso. Questa lentezza è curata alternando lo swap, dimostrando così che almeno in alcune situazioni gli algoritmi di ottimizzazione del kernel non sono ottimali. Non posso discutere con ripetute esperienze.
Scott Severance,

Uff !! Questo è appena aumentato allo 0% dello swap .... Non ho avuto molto tempo per esaminare questa domanda completa e la sua risposta, ma l'ho favorito per leggerlo quando ho del tempo libero.
AzkerM,

Perché non dovresti semplicemente impostare lo swappiness su un valore basso? Sembrerebbe che stia facendo la stessa cosa della tua sceneggiatura, ma in modo molto più controllato.
Jhfrontz,

4

Generalmente lo swap rimane inutilizzato sui sistemi attuali. Nella mia esperienza, i processi in esecuzione da molto tempo senza operazioni intensive vengono spostati da Linux.
Fa rallentare alcuni programmi interessati.
Se hai un sacco di RAM libero, puoi disattivare lo swap eseguendo il comando:
swapoff -av(avrai bisogno dei sudodiritti per esso.)
Se non ti piace lo swap, puoi accenderlo, usando il comando simmetrico:
swapon -av( di nuovo sudorichiesto).


12
Girando di swap fuori del tutto è eccessivo in quanto swapiness = 0 fa la stessa cosa, ma più sicuro (se si fa finire con troppa roba in memoria, si getterà qualcosa in swap).
Brendan Long,

@BrendanLong Fair point .. Grazie per avermi insegnato. :)
drake01

3

Una volta che lo swap è stato utilizzato per un programma, tende a rimanere mappato per la durata del programma. Molti programmi hanno codice (e dati) che viene usato raramente. Una volta che la memoria viene scambiata, è improbabile che venga scambiata.

Un modo per forzare queste pagine in memoria è disattivare il dispositivo di scambio. Se ne hai due, puoi disattivarne uno, riaccenderlo, quindi disattivare il secondo. Se lo scambio è davvero necessario, si sposterà tra i dispositivi. Potresti semplicemente spegnere il dispositivo (o il file) di scambio, ma se hai davvero bisogno di spazio di scambio possono accadere cose drastiche.

Oltre alle normali cose in memoria, tempfs usa lo spazio di swap e cambierà come il resto della memoria. Se esegui qualcosa che richiede molto disco temporaneo, potrebbe forzare lo scambio di pagine. Una volta creati, i file temporanei non possono più essere utilizzati dopo un paio di minuti e sono buoni candidati per essere spostati sul dispositivo di scambio.

In un pizzico puoi usare un file come dispositivo di scambio. Ciò è utile se è necessario temporaneamente spazio di scambio aggiuntivo.


2

Ho modificato la sceneggiatura di Scott Severance in modo che corrisponda alle versioni più recenti di free che includono già un campo di memoria totale disponibile.

#!/bin/bash

free_mem="$(free | grep 'Mem:' | awk '{print $7}')"
used_swap="$(free | grep 'Swap:' | awk '{print $3}')"

echo -e "Free memory:\t$free_mem kB ($((free_mem / 1024)) MiB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MiB)"
if [[ $used_swap -eq 0 ]]; then
    echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $free_mem ]]; then
    echo "Freeing swap..."
    sudo swapoff -a
    sudo swapon -a
else
    echo "Not enough free memory. Exiting."
    exit 1
fi
Licensed under cc by-sa 3.0 with attribution required.