Perché usare lo scambio quando c'è più spazio sufficiente nella RAM?


125

L'uso dello spazio di scambio anziché della RAM può rallentare drasticamente un PC.

Quindi perché, quando ho più di RAM sufficiente disponibile, il mio sistema Linux (Arch) usa lo swap?

Dai un'occhiata alla mia uscita conky di seguito:

uscita vivace

Inoltre, potrebbe essere questa la causa dei problemi di velocità e reattività del sistema che sto riscontrando?

Uscita di free -m:

$ free -m
             total       used       free     shared    buffers     cached
Mem:          1257       1004        252          0         51        778
-/+ buffers/cache:        174       1082
Swap:          502        144        357

5
Sono abbastanza sicuro che le dinamiche di questo problema siano cambiate in modo significativo con gli SSD che diventano la norma. Mentre il tuo SSD consumer tradizionale è ancora molto più lento della RAM, ora è una questione di ciò che è più economico: RAM $ / GB o SSD $ / GB. L'SSD mentre è più lento è molto più economico e nella maggior parte dei casi abbastanza veloce, quindi anche lo scambio non dovrebbe disturbare in modo significativo l'esperienza dell'utente come una volta con i media rotazionali.
lkraav,

7
A volte, se hai usato lo swap in passato a causa della RAM completa, puoi avere una situazione in cui i dati precedentemente scambiati rimangono lì perché al momento non sono dati utili.
Totor

1
Come ha detto Totor. A volte il sistema esplode qualcosa (per qualsiasi motivo). Se successivamente quella pagina viene spostata di nuovo in memoria per un'operazione di lettura, la copia nello spazio di scambio non viene eliminata. Se la stessa pagina viene successivamente paginata di nuovo, senza essere cambiata, può farlo senza scrivere di nuovo sul disco. La copia che è lì è già aggiornata. In altre parole, una pagina può occupare spazio sia nello swap che nella memoria principale.
izak,

Risposte:


93

È normale che i sistemi Linux usino un po 'di swap anche se c'è ancora RAM libera. Il kernel di Linux si sposterà per scambiare pagine di memoria molto raramente utilizzate (ad esempio, le gettyistanze in cui si utilizza solo X11 e altri demoni inattivi).

L'utilizzo dello spazio di swap diventa un problema solo quando non c'è abbastanza RAM disponibile e il kernel è costretto a spostare continuamente le pagine di memoria per scambiare e tornare alla RAM, solo per mantenere le applicazioni in esecuzione. In questo caso, le applicazioni di monitoraggio del sistema mostrerebbero molta attività di I / O del disco.

Per fare un confronto, il mio sistema Ubuntu 10.04, con due utenti connessi con sessioni X11 che eseguono entrambi il desktop GNOME, utilizza ~ 600 MB di scambio e ~ 1 GB di RAM (senza contare i buffer e la cache fs), quindi direi che i tuoi dati per lo scambio l'uso sembra normale.


39
Sostituendo i programmi inattivi, hai più memoria per la memorizzazione nella cache dei file. E questo accelera le cose.
jmanning2k,

91

Questo comportamento può essere configurato impostando il valore di:

/proc/sys/vm/swappiness

Il valore predefinito è 60. Impostarlo su 0 significa non usare mai lo scambio quando c'è ancora RAM rimasta e 100 sostituisce la memoria il prima possibile.

Per modificare temporaneamente il valore (perso al riavvio):

sudo sysctl vm.swappiness=10

Per modificare il valore in modo permanente, modifica il file:

/etc/sysctl.conf

come root (es. sudo nano /etc/sysctl.conf) e modifica o aggiungi (se non c'è) la riga:

vm.swappiness

al valore desiderato. Se questo file non esiste (ad es. In Arch Linux), prova /etc/sysctl.d/99-sysctl.confinvece.

Si è discusso se lo scambio con memoria libera disponibile sia positivo o negativo, ma l' aiuto di Ubuntu in effetti consiglia un valore di 10 per i sistemi desktop . Vedi anche questo tutorial su Digital Ocean per CentOS .


27
Si noti che la riduzione swappiness non non necessariamente un aumento di prestazioni o di risposta. Ho visto rapporti di crescente swappiness che si traducono in prestazioni migliori. Non credere a ciò che leggi che non include benchmark e controlla che i benchmark utilizzino un carico di lavoro simile al tuo.
Gilles,

Questo persiste durante il riavvio? Ho pensato / proc è stato rigenerato ad ogni avvio.
HandyGandy,

@HandyGandy: ho aggiunto informazioni alla risposta su come modificarle in modo permanente.
Marcel Stimberg,

@HandyGandy: per essere pedanti, / proc non viene rigenerato ad ogni avvio, ma proc è un file system virtuale, quindi viene "generato" solo quando si accede ad essi. Non esiste affatto sul disco.
Lie Ryan,

swappinessil valore non ha alcun effetto sul mio sistema. Anche impostandolo su 0, continuerà a spostare le pagine cruciali e utilizzate di frequente (ad esempio l'indice del mio IDE) per scambiare quando c'è ancora RAM libera da 2 GB.
chefarov,

46

Linux inizia a scambiarsi prima che la RAM sia piena. Questo viene fatto per migliorare le prestazioni e la reattività:

  • Le prestazioni sono aumentate perché a volte la RAM viene utilizzata meglio per la cache del disco che per archiviare la memoria del programma. Quindi è meglio scambiare un programma che è rimasto inattivo per un po ', e invece mantenere i file utilizzati di frequente nella cache.

  • La reattività è migliorata scambiando le pagine quando il sistema è inattivo, piuttosto che quando la memoria è piena e alcuni programmi sono in esecuzione e richiedono più RAM per completare un'attività.

Lo scambio rallenta il sistema, ovviamente - ma l'alternativa allo scambio non è lo scambio, è avere più RAM o usare meno RAM.


Quindi, in un certo senso, lo swap è una misura nel caso ? Quello e l' ibernazione ?
Tshepang,

@Tshepang: avere abbastanza swap per adattarsi alla tua memoria virtuale non è "nel caso", è necessario (altrimenti i tuoi programmi andranno in crash a causa della mancanza di memoria).
Gilles,

1
@Tschepang: il killer OOM è il motivo per cui si sono schiantati. (Tecnicamente potresti fare a meno di un killer OOM e non essere in grado di allocare nulla, ma ciò avrebbe buone probabilità di bloccare il sistema; il killer OOM rende un po 'più probabile che l'amministratore sia in grado di accedere e affinché continuino i processi importanti.)
Gilles,

1
Capisco il tuo punto "scambiare pagine quando il sistema è inattivo, piuttosto che quando la memoria è piena", ma il ragazzo sta a malapena usando il 15% della sua RAM. Lungi dall'essere quasi pieno, no? Anche se uno scambio precedente causato dalla piena RAM potrebbe aver lasciato questa situazione ...
Totor

1
"Linux inizia a scambiarsi prima che la RAM si riempia" quando? esattamente
Yousha Aleayoub,

12

Questo è un vecchio post, tuttavia, mi prenderei comunque la libertà di esprimere i miei pensieri qui.

Partendo dal basso, Linux prima dividerebbe la memoria in pagine (di solito 4K per pagina sul sistema x86_64). Successivamente, viene creata la memoria virtuale, la cui mappatura viene eseguita con la memoria fisica utilizzando MMU (Memory Management Unit).

I processi sono allocati in memoria dall'area di memoria virtuale, quindi tieni presente che quando vedi / proc / meminfo, vedrai VMalloc * come i dettagli della memoria virtuale.

Diciamo che hai un processo che richiede memoria (diciamo 300 MB - un browser web). Il processo verrebbe allocato a 300 MB dalla memoria virtuale, tuttavia non è necessario che sia mappato in memoria (che è mappato alla memoria fisica). Esiste il concetto di "Copia su scrittura" per la gestione della memoria, in base al quale, se i processi in realtà utilizzano la memoria allocata dalla memoria virtuale (ovvero fa qualche scrittura sulla memoria), solo allora viene mappato sulla memoria fisica. Questo aiuta il kernel a funzionare correttamente in un ambiente multi-processo in modo efficiente.

Cosa sono i cache?

Molta memoria utilizzata dai processi è condivisa. Supponiamo che la libreria glibc sia utilizzata da quasi tutti i processi. Qual è il punto di conservare più copie di glibc in memoria, quando ogni processo può accedere alla stessa posizione di memoria e svolgere il lavoro. Tali risorse utilizzate di frequente vengono conservate nella cache in modo che, quando richiesto dai processi, possano essere referenziate nella stessa posizione di memoria. Questo aiuta ad accelerare i processi, poiché la lettura ripetuta di glibc (ecc.) Dal disco richiederebbe molto tempo.

Quanto sopra era per le librerie condivise per dire, simile vale anche per la lettura dei file. Se leggi un file di grandi dimensioni (diciamo 100-200 MB) per la prima volta, ci vorrebbe molto tempo. Tuttavia, quando si tenta di ripetere la stessa lettura, sarebbe più veloce. I dati sono stati memorizzati nella cache e la rilettura non è stata eseguita per tutti i blocchi.

Che cos'è il buffer?

Per quanto riguarda il buffer, quando un processo esegue il file I / O, si basa sul buffer del kernel per scrivere i dati sul disco. I processi, richiede al kernel di fare il lavoro. Quindi, per conto del processo, il kernel scrive i dati nel suo "buffer" e dice al processo che la scrittura è stata eseguita. In modo asincrono, il kernel continuerà a sincronizzare questi dati nel buffer su disco. In questo modo, i processi si affidano al kernel per scegliere il momento giusto per sincronizzare i dati su disco e i processi potrebbero continuare a lavorare in anticipo. Ricorda, questo è I / O generale che stanno facendo i normali processi. Tuttavia, i processi specializzati, che devono confermare che l'I / O viene effettivamente eseguito sul disco, possono utilizzare altri meccanismi per eseguire l'I / O sul disco. Alcune delle utility opensource sono libaio. Inoltre, ci sono modi per chiamare la sincronizzazione esplicita con gli FD aperti nel contesto dei processi,

Che cosa sono gli errori di pagina allora?

Considera un esempio, quando avvii un processo (ad esempio un browser Web), il cui binario è di circa 300 MB. Tuttavia, i 300 MB completi del file binario del browser Web non iniziano a funzionare immediatamente. Il processo continua a spostarsi da funzioni a funzioni nel suo codice. Come detto in precedenza, la memoria virtuale sarebbe consumata a 300 MB, tuttavia non tutta la memoria è mappata sulla memoria fisica (la memoria residente RSS sarebbe inferiore, vedere l'output superiore). Quando l'esecuzione del codice raggiunge un punto, per il quale la memoria non è effettivamente mappata fisicamente, si verificherebbe un errore di pagina. Il kernel mapperebbe questa memoria su fisica, associando la pagina di memoria al tuo processo. Tale errore di pagina viene chiamato "Errori di pagina minori". Allo stesso modo, quando un processo sta eseguendo I / O su file, vengono generati errori principali della pagina.

Quando e perché avviene lo Swap Out?

Situazione 1:

In linea con i dettagli sopra, consideriamo uno scenario in cui la buona quantità di memoria viene mappata in memoria. E ora si avvia un processo, che richiede memoria. Come discusso in precedenza, il kernel dovrà eseguire alcune mappature della memoria. Tuttavia, non è disponibile RAM fisica sufficiente per mappare la memoria. Ora, il kernel esaminerà prima nella cache, avrà alcune vecchie pagine di memoria che non vengono utilizzate. Svuota quelle pagine su una partizione separata (chiamata SWAP), libera alcune pagine e mappa le pagine liberate sulla nuova richiesta in arrivo. Poiché la scrittura su disco è molto più lenta della RAM a stato solido, questo processo richiede molto tempo e quindi si osserva un rallentamento.

Situazione 2:

Diciamo che vedi molta memoria libera disponibile nel sistema. Anche allora vedi che stanno avvenendo molti swap-out. Potrebbe esserci un probabile problema di frammentazione della memoria. Si consideri un processo che richiede dal kernel 50 MB di memoria contigua. (tenere a mente contiguo). Ovviamente, il kernel avrebbe assegnato le pagine in modo casuale a processi diversi e ne avrebbe liberato alcuni. Tuttavia, quando richiediamo memoria contigua, dovrà cercare un pezzo che soddisfi la domanda dei processi. Se non è in grado di ottenere tale memoria, dovrà fare uno scambio di alcune vecchie pagine di memoria e quindi allocare quelle contigue. Anche in questi casi si verificherebbe lo swap out. Avviando Kernel versione 2.6 e successive, tali problemi di frammentazione si sono notevolmente ridotti. Tuttavia, se il sistema è in esecuzione da molto tempo, tali problemi potrebbero ancora presentarsi.

Vedi questo esempio ( output vmstat )

2016-10-29 03:55:32 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
2016-10-29 03:55:32  r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
2016-10-30 03:56:04 19 23 2914752 4692144 3344908 12162628 1660    1  8803 12701 4336 37487 14  7 40 38  0
2016-10-30 03:56:34  3 20 2889296 4977580 3345316 12026752 2109    2  8445 14665 4656 36294 12  7 46 34  0
2016-10-30 03:57:04  1 11 3418868 4939716 3347804 11536356  586 4744  2547  9535 3086 24450  6  3 59 33  0  <<<-----
2016-10-30 03:57:34  3 19 3456252 5449884 3348400 11489728 3291 13371  6407 17957 2997 22556  6  4 66 24  0
2016-10-30 03:58:04  7  6 4194500 5663580 3349552 10857424 2407 12240  3824 14560 2295 18237  4  2 65 29  0
2016-10-30 03:58:34  2 16 4203036 5986864 3348908 10838492 4601 16639  7219 18808 2575 21563  6  4 60 31  0
2016-10-30 03:59:04  3 14 4205652 6059196 3348760 10821448 6624 1597  9431  4357 1750 20471  6  2 60 31  0
2016-10-30 03:59:34  2 24 4206968 6053160 3348876 10777216 5221 2067 10106  7377 1731 19161  3  3 62 32  0
2016-10-30 04:00:04  0 13 4205172 6005084 3348932 10785896 6236 1609 10330  6264 1739 20348  4  2 67 26  0
2016-10-30 04:00:34  4 11 4206420 5996396 3348976 10770220 6554 1253 10382  4896 1964 42981 10  5 58 27  0
2016-10-30 04:01:04  6  4 4177176 5878852 3348988 10825840 8682  765 10126  2716 1731 32949  8  4 69 19  0

@ 30-10-2016 03:57:04, vediamo che è ancora disponibile una buona quantità di RAM libera. Tuttavia, anche allora lo scambio è avvenuto. Abbiamo controllato l'albero dei processi a questo punto e non abbiamo visto alcun processo in arrivo che richiederebbe una quantità così elevata di memoria (più della memoria libera). L'ovvio sospetto era la situazione 2 sopra descritta. Abbiamo controllato i registri buddyinfo e zoneinfo sopra (Usa echo m> / proc / sysrq-trigger per controllare questi, l'output va in syslogs).

Per un nostro normale sistema, il confronto delle informazioni sulla zona fa questo. E i grafici per cache / free / low mem sono anche menzionati di seguito

informazioni sulla zona

scambia gratis basso gratis

Guardando le informazioni, è chiaro che c'è una frammentazione della memoria nel nodo 0 e nel nodo 1 normale (Nodo è una macchina basata su NUMA, quindi più nodi (vedi numactl per controllare le informazioni per il tuo sistema)).

La frammentazione della memoria è anche un motivo per cui l'utilizzo dello scambio può aumentare anche quando è presente memoria libera.


2
Dovresti chiarire se nella tua "situazione 2", il processo impegnativo sta allocando la memoria fisica, il che è un caso insolito. La maggior parte dei processi riguarda solo la memoria virtuale in cui la frammentazione è quasi irrilevante. Potresti anche voler spiegare meglio come asserisci che c'è una frammentazione della memoria dai numeri e dal grafico visualizzati poiché non è ovvio a prima vista. Oh, a proposito, in realtà stai parlando di memoria contigua , speriamo non memoria contagiosa ;-)
jlliagre

@jlliagre: grazie per gli input. Sto modificando l'errore "contiguo".
Anugraha Sinha

5

Avere più memoria disponibile

Come tutti hanno detto, lo scambio sì ti aiuterà a sbarazzarti della memoria inutilizzata, quindi può aiutarti ad avere più memoria disponibile.

letargico

Ma lo swap può anche essere utilizzato per l' ibernazione, che può essere davvero utile quando si dispone di un laptop o si desidera risparmiare energia e mettere il computer e lavorare in letargo prima di lasciare il lavoro. Quindi puoi iniziare più velocemente la mattina dopo.

Avere una funzione di ibernazione è uno dei motivi principali che vediamo ancora oggi consigliare di avere almeno la dimensione della RAM per lo scambio. In questo modo il sistema può mettere tutta la RAM utilizzata nello swap e andare in letargo.

Carenze

Accertati che una volta scambiato un dato di processo possa essere letto nello scambio anche dopo l'arresto, a meno che lo scambio non sia stato crittografato (ovviamente).

L'uso dello scambio crittografato con l'ibernazione non funziona immediatamente con tutte le distribuzioni. È necessario utilizzare una chiave di crittografia costante (alcune configurazioni generano casualmente la chiave di crittografia dello spazio di scambio a ogni avvio) e un initrd / initramfs per attivare il volume crittografato prima di riprendere.


3

Molti programmi moderni sono basati su framework gonfiati che trascinano in una quantità di spazzatura che non è effettivamente necessaria per eseguire il programma. Lo scambio di quelle pagine inutilizzate libera la RAM per cache e programmi che possono effettivamente utilizzare la RAM.

Parlo per esperienza personale dolorosa qui.

L'anno scorso ho spostato uno dei miei siti Web in un nuovo promettente framework per server Web costruito su Firefox. Può sembrare strano costruire un sistema lato server sopra un programma focalizzato sul client come Firefox, ma ha avuto alcuni enormi vantaggi. Firefox è molto potente, offre alcuni servizi interni davvero impressionanti e riduce la discrepanza di impedenza tra server e client per avere entrambe piattaforme simili.

Ma c'è un aspetto negativo: Firefox è grande. Veramente grande. Questo era un tipo di progetto versione 1.x, quindi non si erano occupati di cose come rimuovere il supporto della GUI. [*] Il mio sito non ne aveva bisogno, ma perché la tecnologia VPS utilizzata dal mio provider di hosting non lo faceva Per consentire lo spazio di swap, quel codice GUI e tutte le altre parti di Firefox non ho usato la RAM reale. Ho finito per aver bisogno di almeno 512 MB di RAM solo per eseguire il sito senza che si arrestasse in modo anomalo a causa dell'esaurimento della memoria. Se il mio VPS avesse un po 'di spazio di swap, probabilmente avrei potuto cavarmela con un piano da 256 MB.

[*] La rimozione del codice GUI dal framework potrebbe non essere neppure desiderabile, poiché uno dei vantaggi di questa piattaforma era lo scraping web ad alta fedeltà, poiché il framework lato server poteva scaricare pagine Web da un altro sito e puoi manipolarle proprio come faresti dal lato client. Pensa ai mashup. Molte di queste cose si spezzerebbero se non si potesse "renderizzare" la pagina Web in un contesto grafico.

A proposito, questo framework web è praticamente morto ora, quindi non ha senso nominarlo e disonorarlo. Meglio prendere a cuore la lezione più ampia: sì, lo scambio è ancora utile anche se hai concerti di RAM libera.


3

Dalle domande frequenti su Ubuntu Swap a cui Marcel ha collegato

Come minimo di base, si consiglia vivamente che lo spazio di swap sia uguale alla quantità di memoria fisica (RAM). Inoltre, si consiglia che lo spazio di swap sia il doppio della quantità di memoria fisica (RAM) a seconda della quantità di disco rigido

Penso che dovresti aumentare lo spazio di swap nel tuo sistema. Lo swap accelera l'allocazione della memoria RAM consentendo di scartare i dati già paginati.


6
Lo trovo ancora incredibile. Perché dovrei avere bisogno di 8 GB di swap per il mio sistema da 4 GB, mai in letargo? Ho davvero bisogno di 128 GB di swap per il mio nodo di calcolo da 64 GB? Di solito non allocco più di 1 GB per lo scambio a meno che non ci sia un motivo altamente specifico.
David Mackintosh,

2
Lascia più spazio per la memorizzazione nella cache dell'HDD slow-as-all-heck nella RAM velocissima. (Inoltre, alcuni schemi di ibernazione salvano una copia della RAM nello spazio di swap)
Arafangion,

6
@David, @Jader: la figura di scambio = 2 * ram è una vecchia castagna che è sopravvissuta ben dopo che la giustificazione originale è diventata irrilevante - ora le persone cercano di trovare un modo per giustificare questa cifra, invece di trovare una figura appropriata per il loro sistema . Vedi perché dobbiamo impostare uno spazio di scambio due volte più grande della nostra memoria fisica? .
Gilles,

1
@Gilles Mi attengo alla mia posizione perché una volta ho visto un documento autorevole su questo argomento che contraddice un gruppo di esperti che non so quanto sia profonda la loro conoscenza.
Jader Dias,

4
Se ricordi il riferimento, condividi.
Gilles,

2

Penso che "Gilles" abbia già menzionato il fatto che, sebbene possiate avere RAM più che sufficiente, lo swap può essere utile durante determinate "carenze", nonché il salvataggio persistente di alcuni dati anche dopo gli arresti - o sbaglio nel ritenerlo? da quando la RAM viene scaricata dopo il riavvio) Ho 12 GB di RAM disponibili sul mio sistema e anch'io ho già riflettuto su questa domanda in precedenza. A un certo punto, quando avevo disabilitato tutto lo swap e facevo affidamento solo sulla mia RAM, ho avuto esperienze dolorosamente difficili nel tentativo di eseguire il debug di alcuni errori di sistema, crash, ecc. Dopo l'arresto del sistema. Da allora, ho riattivato la partizione di swap.

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.