it-swarm.it

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

Utilizzando swap spazio anziché RAM può rallentare drasticamente un PC.

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

Dai un'occhiata alla mia uscita conky di seguito:

conky output

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

Output 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
132
Stefan

È normale che i sistemi Linux usino alcuni scambia anche se c'è ancora RAM gratis. Il kernel Linux si sposterà per scambiare pagine di memoria che sono usate molto di rado (es. , le istanze getty quando usi solo X11 e qualche altro demone inattivo).

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 swap e ~ 1 GB di RAM (senza contare i buffer e la cache fs), quindi Direi che i tuoi dati per l'utilizzo degli swap sembrano normali.

96
Riccardo Murri

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 a sinistra e 100 sta scambiando memoria al più presto.

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 (ad es. Sudo nano /etc/sysctl.conf) e modifica o aggiungi (se non presente) la riga:

vm.swappiness

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

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

96
Marcel Stimberg

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

  • Le prestazioni sono aumentate perché a volte RAM è meglio usato per la cache del disco piuttosto che per archiviare la memoria del programma. Quindi è meglio scambiare un programma che è stato inattivo per un po ', e invece tenere i file usati spesso in 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, ma sta avendo più RAM o usando meno RAM.

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, il cui mapping viene eseguito con la memoria fisica usando MMU (Memory Management Unit).

Ai processi viene allocata 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 è terminata. 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, in modo da forzare il kernel il kernel a sincronizzare i dati su disco per la scrittura che potresti aver fatto.

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 c'è abbastanza fisico RAM disponibile per mappare la memoria. Ora, il kernel guarderà prima nella cache, avrà alcune vecchie pagine di memoria che non vengono utilizzate. Svuota quelle pagine su una partizione separata (chiamata SWAP), liberare alcune pagine e mappare 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 un rallentamento è visto.

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 ( vmstat output )

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 c'è ancora una buona quantità di free RAM disponibile. Tuttavia, anche in questo caso è successo lo swap. Abbiamo controllato l'albero del processo a questo punto e non è emerso alcun processo 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

zone info

swap free low free

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.

15
Anugraha Sinha

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.

Hibernating

Ma lo swap può anche essere usato per ibernazione che può essere davvero utile quando hai un laptop o vuoi 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 di RAM per lo scambio. In questo modo il sistema può mettere tutto usato RAM nello swap e va in letargo.

carenze

Accertati che una volta scambiato un processo i dati possano essere letti 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 ad ogni avvio) e un initrd/initramfs per attivare il volume crittografato prima di riprendere.

5
Huygens

Da buntu Swap F.A.Q. a cui Marcel si è 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 scambio 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 RAM allocazione della memoria consentendo di scartare i dati già paginati.

3
Jader Dias

Molti programmi moderni sono basati su framework gonfiati che trascinano in una quantità di spazzatura che in realtà non è necessaria per eseguire il programma. Lo scambio di quelle pagine inutilizzate libera 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 512 MB RAM minimo solo per far funzionare il sito senza crash a causa dell'esaurimento della memoria. Se il mio VPS avesse un po 'di spazio di swap, probabilmente avrei potuto ottenere con un piano da 256 MB.

[*] La rimozione del codice GUI dal framework potrebbe non essere neppure auspicabile, 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 potreste manipolarle proprio come voi sarebbe sul 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
Warren Young

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? poiché RAM viene svuotato dopo il riavvio) Ho 12 GB di RAM disponibile sul mio sistema, e anche io ho già riflettuto su questa domanda prima. punto, quando ho disabilitato tutto lo swap e facevo affidamento solo sulla mia RAM, ho avuto esperienze dolorosamente difficili nel tentativo di eseguire il debug di un errore di sistema, un arresto anomalo, ecc. dopo gli arresti del sistema. Da allora ho riattivato la partizione di swap.

2
ILMostro_7