Perché lo swap viene usato anche se ho un sacco di RAM libera?

182

Ho pensato che l'intera essenza dello swap fosse quella di agire come una rete temporanea di storage storage quando la RAM era piena ma la mia partizione di swap viene costantemente utilizzata anche se a volte ho una RAM libera fino a 3 GB. È normale?

    
posta Mysterio 30.06.2012 - 00:16
fonte

6 risposte

160

Potresti provare a cambiare il tuo valore "swappiness":

Dalle Domande frequenti sugli swap di Ubuntu :

  

Cos'è lo swappiness e come lo cambio?

     

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.   

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

     

Per verificare il valore di swappiness

     

cat /proc/sys/vm/swappiness

     

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

     

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 cambia 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.

Puoi anche controllare: link

    
risposta data jpetersen 30.06.2012 - 01:10
fonte
83

Ci sono alcuni aspetti diversi nella 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 usa la RAM (molto semplificata)

Ogni applicazione può utilizzare parte della memoria. Linux usa tutta la memoria altrimenti non occupata (tranne gli ultimi Mb) come "cache". Ciò include la cache della pagina, le cache inode, ecc. Questa è una buona cosa: aiuta a velocizzare le cose. Sia la scrittura su disco che la lettura dal disco possono essere velocizzati enormemente dalla cache.

Idealmente, hai abbastanza memoria per tutte le tue applicazioni e hai ancora diverse centinaia di Mb per la cache. In questa situazione, finché le tue applicazioni non aumentano l'uso della memoria e il sistema non fatica a ottenere abbastanza spazio per la cache, non è necessario alcuno scambio.

Una volta che le applicazioni richiedono più RAM, viene semplicemente utilizzata una parte dello spazio utilizzato dalla cache, riducendo la cache. La deduplicazione della cache è economica e abbastanza facile da essere eseguita in tempo reale - tutto ciò che si trova nella cache è solo una seconda copia di qualcosa che è già presente sul disco, quindi può essere immediatamente deallocato, o è qualcosa che vorremmo ho dovuto scaricare su disco entro qualche secondo comunque .

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

Quando parli di RAM libera, è molto più significativo per includere cache, perché è praticamente gratuito - è disponibile se qualsiasi applicazione lo richiede. Su Linux, il comando free lo segnala in entrambe le direzioni: la prima riga include la cache nella colonna RAM utilizzata e la seconda riga include cache (e buffer) nella colonna libera.

Come Linux usa lo swap (ancora più semplificato)

Una volta esaurita la memoria sufficiente da non lasciare spazio sufficiente per una cache con funzionamento regolare, Linux potrebbe decidere di riassegnare alcune memoria delle applicazioni inutilizzate dalla RAM allo scambio.

Non lo fa secondo un preciso limite. Non è che raggiungi una certa percentuale di allocazione, quindi Linux inizia a scambiare. Ha un algoritmo piuttosto "fuzzy". Ci vuole un sacco di cose in considerazione, che possono essere meglio descritte da "quanta pressione c'è per l'allocazione della memoria". Se c'è molta "pressione" per allocare nuova memoria, aumenterà le probabilità che alcuni vengano scambiati per guadagnare più spazio. Se c'è meno "pressione" allora diminuirà queste possibilità.

Il tuo sistema ha un'impostazione "swappiness" che ti aiuta a modificare il modo in cui viene calcolata questa "pressione". Normalmente non è consigliabile modificarlo del tutto e non lo consiglierei di alterarlo. Lo swapping è nel complesso una cosa molto buona, anche se ci sono alcuni casi limite in cui danneggia le prestazioni, se si considerano le prestazioni generali del sistema è un vantaggio netto per una vasta gamma di attività. Se riduci lo swappiness, lasci che la quantità di memoria cache si riduca di un po 'di più rispetto a quella che avrebbe 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, questo è tutto.

Esiste una situazione ben nota in cui lo swap danneggia davvero le prestazioni percepite su un sistema desktop, ed è in quanto rapidamente le applicazioni possono rispondere di nuovo all'input dell'utente dopo essere rimasto inattivo per un lungo periodo e avere processi di background pesanti in IO ( come un backup notturno). Questa è una lentezza molto visibile, ma non abbastanza da giustificare la disattivazione di tutto lo scambio e molto difficile da prevenire in qualsiasi sistema operativo. Disattivare lo scambio e questa lentezza iniziale dopo la scansione del backup / virus potrebbe non avvenire, ma il sistema potrebbe rallentare un po 'più a lungo tutto il giorno. Questa non è una situazione limitata a Linux,

Quando si sceglie ciò che deve essere scambiato su disco, il sistema prova a selezionare la memoria che non viene effettivamente utilizzata, da leggere o scrivere da. Ha un algoritmo piuttosto semplice per calcolare ciò che sceglie bene la maggior parte del tempo.

Se si dispone di un sistema in cui si dispone di un'enorme quantità di RAM (al momento della scrittura, 8 GB è una quantità enorme per una tipica distribuzione Linux), raramente si imbatterà in una situazione in cui è necessario lo swap. Potresti persino provare a disattivare lo swap. Non consiglio mai di farlo, ma solo perché non si sa mai quando più RAM potrebbe salvarti da un arresto anomalo dell'applicazione. Ma se sai che non ne avrai bisogno, puoi puoi farlo.

Ma come può swap accelerare il mio sistema? Non scambia le cose lente?

L'atto di trasferire dati dalla RAM allo swap è un'operazione lenta, ma è necessaria solo quando il kernel è abbastanza sicuro che il vantaggio complessivo sarà superiore a questo. Ad esempio, se la memoria dell'applicazione è aumentata al punto che non è rimasta quasi nessuna cache e l'I / O è molto inefficiente a causa di ciò, è possibile ottenere molta più velocità dal sistema liberando memoria, persino dopo le spese iniziali di scambio dei dati per liberarlo.

È anche l'ultima risorsa se le tue applicazioni richiedono effettivamente più memoria di quanto tu non abbia effettivamente. In questo caso, lo swapping è necessario per prevenire una situazione di esaurimento della memoria che spesso provoca l'arresto anomalo di un'applicazione o la necessità di uccidere forzatamente.

Lo swapping è solo associato alle volte in cui il tuo sistema sta funzionando male perché accade nei momenti in cui stai esaurendo la RAM utilizzabile, il che rallenterebbe il sistema (o renderà instabile) anche se non hai scambiato. Quindi, per semplificare le cose, lo scambio avviene perché il tuo sistema sta diventando impantanato, piuttosto che il contrario.

Una volta che i dati sono in scambio, quando esce di nuovo?

Il trasferimento dei dati da swap è (almeno per i tradizionali dischi rigidi) altrettanto dispendioso in termini di tempo che è richiesto. Quindi, comprensibilmente, il tuo kernel sarà altrettanto riluttante a rimuovere i dati dallo swap, specialmente se non viene effettivamente utilizzato (cioè letto o scritto su). Se si dispone di dati in swap e non viene utilizzato, in realtà è una buona cosa che rimanga in swap, poiché lascia più memoria per altre cose che sono in uso, aumentando potenzialmente il sistema.

    
risposta data thomasrutter 04.07.2012 - 05:50
fonte
21

L'impostazione del valore di swappiness non funziona in ogni situazione. Se funziona per te, fantastico. In caso contrario, ho scritto uno script per cancellare periodicamente lo scambio spegnendolo e riaccendendolo.

Attivare lo scambio è un po 'rischioso se non stai attento. Se non hai abbastanza RAM libera per tenere tutto nella RAM più tutto in swap, provare a disabilitare lo swap farà sì che il tuo sistema non risponda. Il mio script controlla prima se c'è abbastanza RAM libera (che richiede un po 'di lavoro, dato che la quantità effettiva di RAM libera è diversa da quella che free riporta come libera), quindi commuta lo scambio solo se è così. Ma, se hai un po 'di RAM, non avviare un altro processo importante mentre lo script è in esecuzione. Eccolo:

#!/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 }')"
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)"

# 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 es. con sudo ). Questo script non lascerà il tuo sistema insensibile; se hai una RAM insufficiente, si rifiuterà di attivare lo scambio. Ho usato questo script senza problemi per quasi cinque anni.

    
risposta data Scott Severance 04.07.2012 - 04:38
fonte
4

Generalmente lo swap rimane inutilizzato nei sistemi odierni. Nella mia esperienza, i processi che sono in esecuzione per un lungo periodo senza operazioni intensive sono spostati per passare da Linux.
Rende lenti alcuni programmi interessati.
Se hai molti ram liberi, puoi disattivare lo swap eseguendo il comando:
swapoff -av (avrai bisogno di sudo di diritti per esso).
Se non ti piace lo swap disattivato, puoi accenderlo utilizzando il comando simmetrico:
swapon -av (ancora sudo richiesto).

    
risposta data drake01 30.06.2012 - 00:24
fonte
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 è stata scambiata, è improbabile che venga scambiata.

Un modo per forzare queste pagine in memoria è disattivare il dispositivo di swap. Se ne hai due, puoi disattivarne uno, riaccenderlo, quindi spegnere il secondo. Se lo scambio è davvero necessario, si sposterà tra i dispositivi. Potresti semplicemente spegnere il dispositivo di swap (o file), 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 si sostituirà come il resto della memoria. Se si esegue qualcosa che richiede un sacco di hard disk, potrebbe forzare lo scambio delle pagine. Una volta creati, i file temporanei potrebbero non essere più utilizzati dopo un paio di minuti e sono buoni candidati da spostare nel dispositivo di scambio.

In un pizzico puoi usare un file come dispositivo di scambio. Questo è utile se hai bisogno di uno spazio di swap aggiuntivo temporaneamente.

    
risposta data BillThor 30.06.2012 - 06:02
fonte
2

Ho modificato lo script di Scott Severance per abbinare le versioni più recenti di free che includono già un campo di memoria disponibile totale.

#!/bin/bash

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

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
    
risposta data derberlinersmurf 03.10.2017 - 15:37
fonte

Leggi altre domande sui tag