Perché la maggior parte delle persone raccomanda di ridurre lo swappiness a 10-20?


65

Ho visto in diversi siti che raccomandano di ridurre lo swappiness a 10-20 per prestazioni migliori.

È un mito o no? È una regola generale? Ho un laptop con 4 GB di RAM e SSD da 128 GB, quale valore mi consigliate per la mia swappiness?

Grazie.


5
I siti che elenchi non spiegano perché stanno raccomandando di cambiare l'impostazione predefinita. Le risposte qui sono molto migliori, per questa scelta difficile su un problema complicato.
nealmcb,

Risposte:


88

Perché la maggior parte crede che swapping = cattivo e che se non si riduce lo swappiness, il sistema cambierà quando davvero non è necessario. Nessuno di questi è veramente vero. Le persone associano lo scambio a momenti in cui il loro sistema viene impantanato, tuttavia, è principalmente scambiato perché il sistema viene impantanato, non viceversa. Quando il sistema si scambia, avrà già preso in considerazione il costo delle prestazioni nella sua decisione di scambiare, e deciso che non farlo avrebbe una penalità complessiva maggiore nelle prestazioni del sistema o nella stabilità.

Nel complesso, le impostazioni predefinite si traducono in buone prestazioni generali e stabilità. Consiglierei di lasciarlo al valore predefinito. Esistono ulteriori strade per Linux per migliorare la sua gestione della memoria per risolvere alcuni casi limite, ma in generale il controllo della swapiness non è una buona soluzione: regolalo in una direzione e potresti risolvere un problema e crearne altri. Se possibile, semplicemente installando più RAM fisica (e lasciando da sola la swappiness) si eclissano tutti gli altri rimedi.

Come Linux usa la RAM

Qualsiasi RAM che non viene utilizzata dalle applicazioni può essere utilizzata come "cache". La cache è importante per un sistema veloce e fluido, che accelera sia le letture che le scritture su disco.

Se le tue applicazioni aumentano il loro utilizzo della memoria fino al punto in cui utilizzano quasi tutta la RAM, la cache si ridurrà e, di conseguenza, le operazioni su disco rallenteranno di conseguenza. Oggigiorno non è sufficiente avere solo decine di megabyte o meno per la cache.

Se le applicazioni aumentano ulteriormente l'utilizzo della memoria, supponendo che non si disponga di spazio di scambio, non solo non si avrà spazio per la cache, ma si esaurirà la memoria e il sistema dovrà interrompere i processi in esecuzione. Uccidere i processi è peggio di un rallentamento in quanto ti dà un sistema instabile e imprevedibile.

Come Linux usa lo swap

Per combattere entrambi questi problemi, il sistema può riassegnare parte della memoria dell'applicazione utilizzata raramente allo spazio di scambio sul disco, liberando RAM. La RAM aggiuntiva può impedire la morte dei processi a causa dell'esaurimento della memoria e può recuperare un po 'di cache in modo che le operazioni del disco possano funzionare in modo più fluido.

Questa riassegnazione non viene eseguita secondo un limite definito. Non raggiungi una certa percentuale di allocazione dopo la quale Linux inizia a scambiare. Ha un algoritmo "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". Spesso viene erroneamente rappresentato come una "percentuale di RAM" ma non lo è, è solo un valore utilizzato come parte della formula. I valori tra 40 e 60 sono i valori sani raccomandati, 60 al giorno d'oggi default.

Permettere al tuo sistema di cambiare quando è necessario è nel complesso una cosa molto buona, anche se hai molta RAM. Permettere al tuo sistema di cambiare se necessario ti dà la tranquillità che se ti imbatti in una situazione di memoria insufficiente anche temporaneamente (durante l'esecuzione di un breve processo che utilizza molta memoria), il tuo sistema ha una seconda possibilità di mantenere tutto in esecuzione. Se si arriva al punto di disabilitare completamente lo scambio, si rischia di interrompere i processi a causa della mancata allocazione della memoria.

Cosa succede quando il sistema viene impantanato e scambiato pesantemente?

Lo scambio è un'operazione lenta e costosa, quindi il sistema lo evita a meno che non calcoli che il compromesso delle prestazioni della cache lo compenserà nel complesso, o se è necessario per evitare i processi di uccisione.

Molte volte le persone guarderanno il loro sistema che sta schiacciando pesantemente il disco e usando molto spazio di swap e incolpando lo swap per esso. Questo è l'approccio sbagliato da adottare. Se lo scambio raggiunge mai questo estremo, significa che lo scambio è il tentativo del sistema di gestire i problemi di memoria insufficiente, non la causa del problema, e che senza lo scambio del processo in esecuzione morirà casualmente.

E i sistemi desktop? Non richiedono un approccio diverso?

Gli utenti di un sistema desktop si aspettano davvero che il sistema "si senta reattivo" in risposta ad azioni avviate dall'utente come l'apertura di un'applicazione, che è il tipo di azione che a volte può innescare uno scambio a causa dell'aumento della memoria richiesta.

Un modo in cui alcune persone cercano di modificarlo è quello di ridurre il parametro swappiness che può aumentare la tolleranza del sistema alle applicazioni che utilizzano memoria e che occupano poco spazio nella cache.

Tuttavia, questo sta spostando solo i pali della porta. La prima applicazione ora può essere caricata senza un'operazione di scambio, ma lascerà meno spazio per la successiva applicazione che si carica. Lo stesso scambio può avvenire in un secondo momento, alla successiva successiva apertura di un'applicazione. Nel frattempo, le prestazioni del sistema sono complessivamente inferiori a causa della ridotta dimensione della cache. Pertanto, qualsiasi beneficio derivante dall'impostazione di swapiness ridotta può essere difficile da misurare, riducendo il ritardo di swap in alcune occasioni ma causando altre prestazioni lente in altre occasioni. Ridurre un po 'lo swappiness può essere giustificato se si sa cosa si sta facendo, ma ridurlo a un minimo del 10% può lasciare il sistema tollerante a dimensioni di cache molto basse e lasciare il sistema più responsabile a dover scambiare a breve termine.

La disabilitazione totale dello swap dovrebbe essere evitata poiché si perde la protezione aggiuntiva contro condizioni di memoria insufficiente che possono causare l'arresto anomalo dei processi o la loro morte.

Il rimedio di gran lunga più efficace è installare più RAM se te lo puoi permettere.

Lo swap può essere disabilitato su un sistema che ha molta RAM comunque?

Se hai molta più RAM di quella che probabilmente ti servirà per le applicazioni, raramente avrai bisogno di scambiare. La disabilitazione dello swap probabilmente non farà la differenza la maggior parte delle volte. Ma se hai molta RAM, lasciare lo swap abilitato non avrà alcuna penalità perché il sistema non si scambia quando non è necessario.

Le uniche situazioni in cui farebbe la differenza sarebbero nell'improbabile situazione in cui il sistema si sta esaurendo la memoria e di conseguenza il sistema cache viene ostacolato, ed è in questo tipo di situazione che vorresti scambiare di più. Quindi puoi tranquillamente lasciare lo scambio sulle sue normali impostazioni per una maggiore tranquillità senza che abbia un effetto negativo quando hai molta memoria.

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 derivante dal mantenere una dimensione della cache ragionevole supererà questo.

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

Ogni parte della memoria tornerà fuori dallo scambio non appena viene utilizzata - letta o scritta. Tuttavia, in genere la memoria che viene scambiata è memoria a cui non si accede da molto tempo e che non si prevede sarà presto necessario.

Il trasferimento dei dati dallo swap richiede tanto tempo quanto il loro inserimento. Il tuo kernel non rimuoverà i dati da esso se non è necessario. Mentre i dati sono in scambio e non vengono utilizzati, lascia più memoria per altre cose che vengono utilizzate e più cache di sistema.

Ci sono casi in cui la riduzione della swappiness è appropriata?

Sì. Se si esegue un server dedicato a una particolare applicazione server che non beneficia della cache di sistema. Alcuni server di database come Oracle Server, MySQL / MariaDB raccomandano in alcuni casi di ridurre la swapiness da 1 a 10 poiché questi motori di database utilizzano la propria cache.

Nota che questo è vero solo se il tuo sistema è dedicato a quell'attività, e nel caso di MySQL / MariaDB solo se stai usando InnoDB o XtraDB, e non MyISAM o Aria, ecc.


Grazie per la tua descrizione approfondita. Penso che nel mio caso (4 GB di RAM e 128 GB di SSD duro) e con il mio utilizzo (sviluppo Java EE e diversi sistemi operativi in ​​scatola virtuale) swappiness = 20 sia adatto. Cosa ne pensi?
Saeed Zarinfam,

Penso che il valore predefinito di 60 sarebbe il migliore, secondo me.
thomasrutter,

4
@BlancaHiggins hai letto il post che hai commentato? Il tuo commento non sembra descrivere ciò che effettivamente fa la swappiness.
thomasrutter,

1
Questa è una risposta eccellente Grazie mille per una spiegazione così grande.
Dan Barron il

2
Parte delle informazioni contenute in SwapFaq è fuorviante secondo me: l'impostazione su 100 cambierà in modo "aggressivo". Penso che sia più preciso affermare che si tratta di un'impostazione molto cauta e proattiva, scambiando al primo segno che la memoria o cache disponibile sta diventando anche un po 'bassa. Considerando che impostazioni basse come 10 sono più rischiose, impostazioni da brivido, evitando di fare qualsiasi scambio fino a quando la memoria disponibile è molto bassa e la cache è praticamente completamente sparita, lasciando il sistema senza molto spazio di manovra.
thomasrutter,

14

Su un normale desktop, sono disponibili 4-5 attività attive che consumano il 50-60% della memoria. Se si imposta lo swappiness su 60, circa 1 / 4-1 / 3 delle pagine dell'attività ATTIVO verrà sostituito. Ciò significa che, per ogni cambio di attività, per ogni nuova scheda che hai aperto, per ogni esecuzione di JS, ci sarà un processo di scambio.

La soluzione è impostare lo swappiness su 10. In base a osservazioni pratiche, questo fa sì che il sistema rinunci alla cache del disco (che gioca poco o nessun ruolo sul desktop, poiché la cache di lettura / scrittura non viene praticamente utilizzata affatto. A meno che non copiate costantemente GRANDI file) invece di inserire qualcosa in scambio. In pratica, ciò significa che il sistema rifiuterà di scambiare pagine, tagliando invece io cache, a meno che non colpisca la memoria utilizzata al 90%. E questo a sua volta significa un'esperienza desktop fluida, senza scambio, veloce.

Sul file server, tuttavia, impostarei lo swappiness su 60 o anche di più, poiché il server non ha enormi attività in primo piano attive che devono essere mantenute nella memoria nel suo insieme, ma piuttosto molti processi più piccoli che funzionano o dormono, e non cambiando davvero il loro stato immediatamente. Al contrario, il server spesso serve (perdona) gli stessi dati ai client, rendendo le cache del disco di io molto più valutabili. Quindi sul server, è molto meglio scambiare i processi in sospensione, liberando spazio di memoria per le richieste della cache del disco.

Sui desktop, tuttavia, questa impostazione esatta porta a scambiare blocchi di memoria di applicazioni REAL, che modificano o accedono costantemente a questi dati.

Stranamente, i browser spesso riservano grossi blocchi di memoria, che modificano costantemente. Quando tali blocchi vengono scambiati, ci vuole un po 'di tempo se vengono richiesti di nuovo - e allo stesso tempo, il browser procede ad aggiornare le sue cache. Il che causa enormi latenze. In pratica, starai seduto 2 minuti in attesa che venga caricata la singola pagina Web in una nuova scheda.

Il desktop non si preoccupa davvero del disco io, perché raramente legge e scrive nella cache ripetendo grandi porzioni di dati. Tagliare su disco io per prevenire il più possibile lo scambio è molto più vantaggioso per il desktop, piuttosto che avere il 30% di memoria riservata per la cache del disco con il 30% di RAM (pieno di blocchi appartenenti ad applicazioni utilizzate attivamente) scambiato.

Basta avviare htop, aprire un browser, GIMP, LibreOffice - caricare pochi documenti lì e quindi navigare per diverse ore. È davvero così facile.


3
+1 per la descrizione delle differenze tra server e desktop. La cache del disco del server potrebbe essere eseguita su un campo del disco.
Dee,

Se questo è il caso, perché entrambe le versioni desktop e server di Ubuntu sono impostate su uno swapiness di 60? Se ciò che affermi è vero, avrebbe più senso che alla versione desktop venga fornito un valore predefinito di 20 o addirittura 10, ma non lo è.
JAB

1
Riferimento per l'implicazione che lo swappiness è una percentuale diretta di RAM che viene scambiata? Non penso che funzioni così.
Xen2050,

1
Non Lo swappiness non è correlato a una percentuale di RAM. È una manopola che modifica un algoritmo fuzzy per essere più o meno suscettibile di scambiare in una determinata situazione di problema. Penso anche che la descrizione dei carichi di lavoro server vs desktop in questa risposta faccia una serie di ipotesi che non sempre valgono.
thomasrutter,

9

Se esegui un server Java sul tuo sistema Linux, dovresti davvero considerare di ridurre di molto lo swappiness dal valore predefinito di 60. Quindi 20 è davvero un buon inizio. Lo scambio è un killer per un processo di raccolta dei rifiuti perché le raccolte ogni volta devono toccare gran parte della memoria del processo. Il sistema operativo non ha i mezzi per rilevare tali processi e ottenere le cose giuste per loro. È consigliabile evitare lo scambio il più possibile di server applicativi produttivi.


È vero che se si dedica un server a un carico di lavoro specializzato che si sa non trarrà vantaggio dalla cache di sistema (come un server di database), potrebbe essere sensato ridurre lo swappiness. Non penso che la raccolta dei rifiuti sia un caso abbastanza specializzato. Se la memoria viene toccata frequentemente non verrà scambiata, verrà mantenuta nella RAM fisica. L'unica volta che questo non è il caso è se hai una grave situazione di memoria insufficiente - e lo scambio non è responsabile.
thomasrutter,

4

Suggerirei di fare alcuni esperimenti mentre il monitor di sistema è aperto per vedere esattamente quanto è sotto carico la tua macchina, sto anche correndo con 4 GB di memoria e un SSD da 128 GB, quindi ho cambiato il valore di swapiness a 10 che non solo migliorava le prestazioni mentre era sotto carico ma come bonus aumenterà anche la durata del disco SSD in quanto subirà meno scritture.

Per un semplice video tutorial su come eseguire questa operazione con una spiegazione completa, vedere il video di YouTube di seguito

http://youtu.be/i6WihsFKJ7Q


1
Ottimo video che hai realizzato, ma il video in realtà non risponde direttamente alla domanda, è più che altro un cambio di swappiness.
Jmunsch,

+1 per il suggerimento sulla vita dell'SSD, per l'SSD è meglio se il sistema è il più possibile di sola lettura, il resto dovrebbe rimanere in memoria e oggi la memoria di solito non è un grosso problema sugli attuali PC desktop.
Dee,

3

Voglio aggiungere una prospettiva da un ingegnere di Big Data Performance per fornire ad altri un maggiore background sulla tecnologia 2017.

La mia esperienza personale è che mentre in genere ho disabilitato lo scambio per garantire che i miei sistemi funzionino alla massima velocità, sulla mia workstation per un problema specifico, ho scoperto che lo scambio di 1 e 10 porta al congelamento (per sempre) e alle lunghe pause. Lo swappiness di 80 per questa particolare applicazione porta a prestazioni molto migliori e pause più brevi rispetto al valore predefinito (60). Si noti che avevo 8 GB di RAM e 4x 256 GB di swap supportato da 1 HDD. Normalmente dichiarerei statistiche precise viste nei miei benchmark e nelle specifiche hardware complete, ma non ne ho ancora fatto uno ed è un desktop di fascia bassa recente che non è importante qui.

Nella mia ex azienda, il motivo per cui non abbiamo abilitato lo swappiness sui server Spark con nodi da [500GB a 4TB] x [10-100] è che abbiamo visto scarse prestazioni come segno per ridisegnare la pipeline di dati e le strutture di dati in modo più efficiente maniera. Inoltre, non volevamo eseguire il benchmark degli HDD / SSD. Inoltre, scambiando quella quantità di RAM occorrerebbero 10-30 dischi per nodo con scritture parallele per ridurre al minimo i tempi di accesso al disco.

Oggi, 20 anni fa e 20 anni in futuro, rimarrà il caso che alcuni problemi siano troppo grandi per la RAM. Con tempo e denaro infiniti, possiamo acquistare / noleggiare più hardware o riprogettare qualsiasi processo per portare le prestazioni a un livello desiderabile. Lo scambio è solo un trucco per permetterci di ignorare il vero problema (non abbiamo abbastanza RAM e non vogliamo spendere più soldi).

Per coloro che pensano che una maggiore swappiness sia un cattivo consiglio, ecco una piccola prospettiva. In passato, gli HD avevano solo pochi KB di cache, se presenti. L'interfaccia era IDE / Parallel ATA. Il bus della CPU era anche molto più lento insieme alla RAM e molte altre cose. In breve, i sistemi erano molto lenti (rispetto ad oggi) in ogni modo. Un paio di anni fa, gli HDD utilizzavano SATA3. Oggi usano il protocollo NVMe, che presenta significativi miglioramenti della latenza. Gli HD hanno molti MB di cache. E la parte più interessante è quando si utilizza un SSD moderno (resistenza di lettura / scrittura molto più stabile e perf) con NVMe o PCIe come memoria di scambio. È il miglior compromesso tra costo e prestazioni. Non provarlo con SSD economici o vecchi.

Swap + SSD! Con l'archiviazione volatile ad alte prestazioni, consiglio vivamente di sperimentare un alto valore di swapiness. Dipende principalmente dai modelli di accesso alla memoria (accesso casuale a tutta la memoria e accesso raramente alla maggior parte), utilizzo della memoria, se la larghezza di banda del disco è già satura e costo effettivo del thrashing.


1

Potrebbe essere che gran parte del comportamento di scambio percepito all'avvio o all'apertura dei programmi sia la lettura di file di configurazione ecc. Da Linux. Quindi forse è meglio guardare usando il programma di monitoraggio del sistema prima di presumere che l'accesso al disco rigido sia dovuto allo scambio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.