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


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


183
2018-06-29 22:16


origine


Si prega di condividere il contenuto o l'output dei seguenti comandi / file per aiutarci meglio a risolvere il vostro problema (istruzioni in questa risposta): free -m, top -b 1 - ish
Aggiornerà la domanda con pastebins di quei comandi domani. Sono le 12 in questo momento :( - Mysterio
Dovrei modificare il titolo per aggiungere "... ma sono troppo assonnato per preoccuparmene, quindi anche voi fate un pisolino": P - ish


risposte:


Potresti provare a cambiare il tuo valore di "swappiness":

Dal 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. swappiness = 0 dice al kernel di evitare di scambiare i processi con la memoria fisica il più a lungo possibile

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

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 di 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 cambiare il valore di swappiness Una modifica temporanea (persa al riavvio) con un valore di swappiness di 10 può essere eseguita con

sudo sysctl vm.swappiness=10

Per rendere un cambiamento permanente, 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.

Inoltre puoi controllare: https://askubuntu.com/a/103916/54187


160
2018-06-29 23:10



Speculazione inattiva: questo potrebbe effettivamente essere utile per le prestazioni - le pagine che non sono state consultate in un istante possono essere copiate nello spazio di swap, che consente al sistema operativo di sfrattarle rapidamente se ha bisogno di memoria, ma i contenuti della pagina rimangono in memoria . - Simon Richter
@ SimonRichter Sì, questa è l'idea. Lo swappiness 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
Correre sudo sysctl --load=/etc/sysctl.conf dopo modificare il file per applicare le modifiche - deFreitas


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 (eccetto 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 velocizzate 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 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 svuotare il disco entro pochi secondi 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 gratuita, è molto più significativo includere cache, perché praticamente è gratuito - è disponibile se un'applicazione lo richiede. Su Linux, il free il comando 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 swap.

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, tutto qui.

Esiste una situazione ben nota in cui lo swap danneggia realmente 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) eseguito. 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, neanche.

Quando si sceglie ciò che deve essere scambiato su disco, il sistema tenta di prelevare 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 grande quantità 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, tu può fallo.

Ma in che modo lo swap può accelerare il mio sistema? Non scambia le cose lente?

L'operazione di trasferimento dei 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 in caso di richiesta effettiva delle tue applicazioni Di Più memoria di quanto tu abbia effettivamente. In questo caso, lo scambio è necessario per prevenire una situazione di esaurimento della memoria che spesso si traduce in un'applicazione che si blocca o deve essere forzatamente uccisa.

Lo scambio è solo associato con tempi in cui il tuo sistema sta funzionando male perché accade nei momenti in cui stai esaurendo la RAM utilizzabile, il che rallenterebbe il tuo sistema (o renderlo instabile) anche se non avevi lo swap. 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 è (per i tradizionali dischi rigidi, almeno) altrettanto dispendioso in termini di tempo che è necessario. 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 siamo in uso, velocizzando potenzialmente il tuo sistema.


83
2017-07-04 03:50



+1 per una spiegazione dettagliata. Mi piace anche mantenere lo scambio 2GiB sui miei computer. Se qualcosa va male - perdite di memoria, ecc., Allora puoi vedere lo swap in aumento e cercare il problema prima che si verifichi l'esaurimento della memoria. È una rete di sicurezza e uno strumento di performance. - Joe
Sul mio netbook, che ha solo 2 GB di RAM, mantengo 4 GB di swap. Questo perché utilizzo il netbook molto di più per il quale è stato concepito e i miei programmi richiedono spesso più di 2 GB di memoria. Poiché Linux si comporta molto male in situazioni di esaurimento della memoria, preferisco avere una grande rete di sicurezza. E ho un sacco di spazio su disco. - Scott Severance
Se i tuoi programmi richiedono spesso più di 2 GB di memoria, prenderei in considerazione la possibilità di aggiungere più RAM (è ultra-economico!) Perché una RAM estenuante danneggerà le prestazioni. Per il beneficio di altri lettori: fai in modo che non stai solo guardando la memoria cache che è ipotetico per accedere alla RAM disponibile - vedere altri riferimenti a free -m. - thomasrutter
@neon_overload: dovrei solo notare che, secondo HP, la RAM massima del mio netbook è 1GB. Ora ho 2 GB e le fonti Internet suggeriscono che 2 GB è il massimo effettivo. Quindi la necessità di questo genere di soluzioni alternative. - Scott Severance
@thomasrutter: come cambia la tua risposta per i server di grandi dimensioni, uno dei miei ha 1 TB (sì un terabyte intero) di ram e tuttavia sta ancora utilizzando lo swap; quale impostazione di swappiness e quale partizione di swap di dimensioni consiglieresti? - chrisinmtown


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.

Cambiare lo scambio è un po 'rischioso se non stai attento. Se non hai abbastanza RAM libera per tenere tutto nella RAM più tutto in swap, tentando di disabilitare lo swap, farà sì che il sistema non risponda. La mia sceneggiatura controlla innanzitutto se c'è abbastanza RAM libera (che richiede un po 'di lavoro, poiché la quantità effettiva di RAM libera è diversa da cosa free segnala come libero), quindi scambia solo lo scambio se è così. Ma, se hai un po '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 utente root (ad esempio, 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.


21
2017-07-04 02:38



+1 per lo script. Potresti voler modernizzarlo un po 'cambiando MB in MiB nelle uscite. Ho scritto uno script simile senza tutti i (buoni) test di sicurezza che includi. Sul mio vecchio taccuino in cui lo swap era usato pesantemente, ci sarebbe voluto un po 'di tempo per funzionare - un minuto o due, ma non mi fece male nulla. Una volta ogni tanto fallirebbe perché non c'era abbastanza memoria libera per l'esecuzione, ma ciò non causava 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 Transmission (dato fisso, credo) e con solo RAM 2GiB. - Joe
Se qualcosa è stato spostato in swap e rimane in swap, normalmente è una cosa buona - significa che i dati non vengono effettivamente utilizzati, e ha liberato parte della RAM per altre cose, con un conseguente aumento della velocità. Che cosa ti ha portato a credere che questi dati non dovrebbero essere scambiati e dovrebbero invece occupare una RAM più preziosa? Di solito il kernel è abbastanza bravo nel sapere cosa è inutilizzato e che può tranquillamente rimanere in swap per liberare RAM. - thomasrutter
@neon: Ricorda che le mie macchine hanno rispettivamente 2 GB e 3 GB di RAM, il che è piuttosto scarso in questi giorni. Le prove sono in performance. Ad esempio, l'apertura di menu o la commutazione di programmi può essere lenta a causa dello swapping, così come gli effetti visivi Compos. Questa lentezza viene risolta attivando lo scambio, dimostrando così che almeno in alcune situazioni gli algoritmi di ottimizzazione del kernel non sono ottimali. Non posso discutere con l'esperienza ripetuta. - Scott Severance
Uff !! Questo è appena aumentato fino allo 0% dello swap .... Non ho avuto molto tempo per esaminare questa domanda completa e la sua risposta, ma ho preferito leggerla quando ho del tempo libero. - AzkerM
Perché non dovresti impostare lo swappiness su un valore basso? Sembra che stia facendo la stessa cosa del tuo copione, ma in modo molto più controllato. - jhfrontz


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 un sacco di ram libero, puoi disattivare lo swap eseguendo il comando:
swapoff -av (avrai bisogno sudo diritti per questo.)
Se non ti piace lo scambio, puoi accenderlo, usando il comando simmetrico:
swapon -av (ancora sudo necessario).


4
2018-06-29 22:24



Disattivare completamente lo swap è eccessivo perché swapiness = 0 fa la stessa cosa, ma è più sicuro (se tu fare finire con troppe cose in memoria, getterà qualcosa in scambio). - Brendan Long
@BrendanLong Fair point .. Grazie per avermi insegnato. :) - drake01


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 è quello di spegnere 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 il 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 scambierà 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.


3
2018-06-30 04:02





Ho modificato la sceneggiatura 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 $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

2
2017-10-03 13:37