Ho bisogno di spazio di scambio se ho una quantità di RAM più che sufficiente?


91

Da quanto ho capito, lo scopo di una partizione di swap in Linux è liberare alcune informazioni "non altrettanto frequentemente consultate" dalla RAM e spostarle in una partizione specifica sul disco rigido (al costo di rallentare la lettura o la scrittura da a), essenzialmente consentendo alle applicazioni attive più "memoria ad alta velocità".

Questo è ottimo per quando sei su un computer con una piccola quantità di RAM e non vuoi incorrere in problemi se finisci. Tuttavia, se il tuo sistema ha 16 GB o 32 GB di RAM e supponendo che tu non stia eseguendo un database MySQL per StackExchange o modificando un film integrale a 1080p in Linux, dovrebbe essere utilizzata una partizione di swap?


16
@mikeserv Sai, mi piacerebbe accettare quelle due lettere come risposta solo per effetto comico.
IQAndreas

3
@Janis - costa molto. E avresti potuto facilmente farlo senza scambiare anche sulla macchina da 1 GB se avessi implementato la gestione della memoria audio. Scambia le prestazioni dei costi: quando lo hai, il kernel lo utilizzerà inevitabilmente. Quindi su un disco da 1 TB o di qualsiasi dimensione creare una partizione di swap è un invito al kernel a mettere le pagine di memoria sul disco, anziché tenerle nella RAM o lasciarle completamente. Con 16 GB un utente tipico non si avvicinerà mai ad usarlo tutto - ho 24 GB di RAM con 2 GB usati e 10 GB memorizzati nella cache (perché ho scaricato un torrent /tmp) dopo 3 giorni di attività.
Mikeserv,

5
@mikeserv, ti sbagli, temo; Ho costantemente osservato le metriche del disco visualizzate. Finché c'è memoria libera lo swap non è stato usato, solo quando la memoria è stata riempita lo swap è iniziato. Penso che dipenda da come usi il tuo computer; un sistema desktop che si spegne ogni sera raramente incontrerebbe problemi di memoria, tuttavia il mio sistema ha funzionato per mesi. Sì, lo swap costa le prestazioni, ma se non è rimasto spazio RAM il sistema può continuare a funzionare. Qual è l'opzione che hai? Forse puoi approfondire l'argomento della gestione della memoria. Uso il mio sistema Linux come preconfigurato.
Janis,

40
@mikeserv come hai pubblicato un commento più corto di 15 caratteri?
user253751

11
@immibis ci sono 12 spazi di larghezza zero lì dentro
dave

Risposte:


98

Sì.

Dovresti assolutamente abilitare sempre lo swap, tranne se c'è una ragione molto convincente e proibitiva (come, nessun disco, o solo un disco di rete presente). Dovresti avere uno scambio nell'ordine delle dimensioni ridicole spesso raccomandate (come il doppio della quantità di RAM)? Bene no .

Il motivo è che lo swap non è utile solo quando le tue applicazioni consumano più memoria di quanta c'è la RAM fisica (in realtà, in tal caso, lo swap non è affatto molto utile perché influisce gravemente sulle prestazioni). Il principale incentivo per lo swap al giorno d'oggi non è trasformare magicamente 16GiB di RAM in 32 GiB, ma fare un uso più efficiente della RAM disponibile installata.

Su un computer moderno, la RAM non passa inutilizzata. La RAM inutilizzata è qualcosa che non si sarebbe potuto comprare e risparmiare. Pertanto, tutto ciò che si carica o tutto ciò che è altrimenti mappato in memoria, tutto ciò che potrebbe eventualmente essere riutilizzato da chiunque in qualsiasi momento dopo (limitato da vincoli di sicurezza) è nella cache. Molto presto dopo l'avvio della macchina, tutta la RAM fisica sarà stata utilizzata per qualcosa .

Ogni volta che si richiede una nuova pagina di memoria dal sistema operativo, il gestore della memoria deve prendere una decisione informata:

  1. Elimina una pagina dalla cache del buffer
  2. Elimina una pagina da una mappatura (effettivamente uguale al numero 1, sulla maggior parte dei sistemi)
  3. Spostare una pagina a cui non si è avuto accesso per molto tempo - preferibilmente mai - per scambiare (ciò potrebbe in effetti accadere anche in modo proattivo, non necessariamente all'ultimo momento)
  4. Uccidi il tuo processo o uccidi un processo casuale (OOM)
  5. Panico del kernel

Le opzioni n. 4 e n. 5 sono molto indesiderabili e accadranno solo se il sistema operativo non ha assolutamente altra scelta. Le opzioni n. 1 e n. 2 significano che butti via qualcosa che probabilmente ti servirà presto di nuovo. Ciò ha un impatto negativo sulle prestazioni.

L'opzione n. 3 significa che trasferisci qualcosa di cui (probabilmente) non ti servirà presto in un archivio lento. Va bene perché ora qualcosa che ti serve può usare la RAM veloce.

Rimuovendo l'opzione # 3, hai effettivamente limitato il sistema operativo a fare # 1 o # 2. Il ricaricamento di una pagina dal disco equivale a ricaricarlo da swap, ad eccezione del fatto che dover ricaricare da swap di solito è meno probabile (a causa di decisioni di paging appropriate).

In altre parole, disabilitando lo swap non si ottiene nulla, ma si limita il numero di opzioni utili del sistema operativo nel gestire una richiesta di memoria. Quale potrebbe non essere , ma molto probabilmente potrebbe essere uno svantaggio (e non sarà mai un vantaggio).

[MODIFICARE]

L'attento lettore della mmap manpage , in particolare la descrizione MAP_NORESERVE, noterà un'altra buona ragione per cui lo scambio è in qualche modo necessario anche su un sistema con "sufficiente" memoria fisica:

"Quando lo spazio di swap non è riservato, si potrebbe ottenere SIGSEGV al momento della scrittura se non è disponibile memoria fisica."

- Aspetta un momento, cosa significa?

Se si mappa un file, è possibile accedere direttamente al contenuto del file come se il file fosse in qualche modo, per magia, nello spazio degli indirizzi del programma. Per l'accesso in sola lettura, il sistema operativo non richiede in linea di principio più di una singola pagina di memoria fisica che può ripopolare con dati diversi ogni volta che si accede a una pagina virtuale diversa (per motivi di efficienza, ovviamente non è quello che si fa, ma in linea di principio è possibile accedere a terabyte di dati con un'unica pagina di memoria fisica). E se anche tuscrivere su un file mapping? In questo caso, il sistema operativo deve avere una pagina fisica - o spazio di scambio - pronta per ogni pagina scritta. Non c'è altro modo per mantenere i dati in giro fino a quando il processo di writeback delle pagine sporche ha fatto il suo lavoro (che può essere diversi secondi). Per questo motivo, il sistema operativo riserva (ma non necessariamente impegna mai) lo spazio di scambio, quindi nel caso in cui tu stia scrivendo su una mappatura mentre non ci sono pagine fisiche inutilizzate (è una condizione del tutto possibile e normale), tu ' sono garantito che funzionerà ancora.

E se non ci fosse swap? Significa che nessuno scambio può essere prenotato (duh!), E questo significa che non appena non sono rimaste pagine fisiche libere e stai scrivendo su una pagina, stai ricevendo una piacevole sorpresa sotto forma del processo di ricezione un errore di segmentazione e probabilmente ucciso.

[/MODIFICARE]

Tuttavia, la tradizionale raccomandazione di effettuare scambi di dimensioni doppie rispetto alla RAM è priva di senso. Sebbene lo spazio su disco sia economico, non ha senso assegnare così tanto swap. Sprecare qualcosa che costa poco è ancora dispendioso e non si vuole assolutamente scambiare continuamente impostazioni di diverse centinaia di megabyte (o più grandi).

Non esiste una dimensione di scambio "corretta" (ci sono tante dimensioni "corrette" quanti sono gli utenti e le opinioni). Di solito assegno un 512MiB fisso, indipendentemente dalle dimensioni della RAM, che funziona molto bene per me. Il ragionamento alla base di ciò è che 512MiB è qualcosa che puoi sempre permetterti al giorno d'oggi, anche su un piccolo disco. D'altra parte, l'aggiunta di diversi gigabyte di swap non è migliore. Non li userai, tranne se qualcosa sta andando storto.

Anche su un SSD, lo scambio è di ordini di grandezza più lenti della RAM (a causa della larghezza di banda e della latenza del bus), e mentre è molto accettabile spostare qualcosa da scambiare che probabilmente non sarà più necessario (cioè molto probabilmente non lo sarà scambiandolo di nuovo, quindi il tuo pool di pagine disponibili viene effettivamente ingrandito gratuitamente), se hai davvero bisogno di notevoli quantità di swap (ovvero, hai un'applicazione che utilizza ad esempio un set di dati da 50GiB), sei praticamente perso.

Una volta che il tuo computer inizia a scambiare pagine di gigabyte di pagine, tutto va a gattonare. Quindi, per la maggior parte delle persone (incluso me) questa non è un'opzione e avere così tanto scambio non ha quindi senso.


7
Completamente falso: potrebbe essere un vantaggio per il kernel non usare il disco, specialmente se OOM è stato configurato secondo le vostre specifiche. Se il killer OOM è configurato per gestire la pulizia, è vantaggioso farlo invece di sprecare spazio su disco e rallentare la macchina .
Mikeserv,

22
Qual è la differenza tra avere 8 GB di RAM e 8 GB di scambio e 16 GB di RAM e nessuno scambio? Se il tuo computer decide di aver bisogno di 16.001 GB di memoria, non inizierà a eliminare / uccidere le cose allo stesso modo (ma le prestazioni crateranno prima che inizi a verificarsi)?
Nick T

5
@NickT: lo swap non è per più RAM tanto quanto una bandiera rossa che qualcosa verrà presto ucciso. Mi piace avere una bandiera rossa prima di uccidere, piuttosto che far sparire "casualmente" un processo davanti ai miei occhi.
Mooing Duck

10
-1 questa risposta non ha senso. Perché diamine avere memoria più lenta (swap) avrebbe prestazioni migliori rispetto alla stessa quantità di memoria (RAM) più veloce ?? ad un certo punto devi riconoscere abbastanza RAM significa che non è necessario scambiare.
Mehrdad

14
@Mehrdad: ha certamente senso. La memoria più lenta (scambio) migliora le prestazioni in quanto "più lenta" non ha importanza per le cose a cui si accede raramente o mai. Swap aumenta efficacemente la quantità di memoria disponibile per i dati "caldi" spostando i dati "freddi". I demoni che eseguono qualcosa solo una volta all'ora o la memoria allocata da un modulo del kernel che è caricato di default ma mai usato ne sono un esempio. È possibile scambiare quelli , oppure è possibile invece eliminare le pagine dalla cache. Qual è il migliore?
Damon,

50

Non sarò d'accordo con alcune delle opinioni che vedo dichiarate qui. Continuerei a creare una partizione SWAP soprattutto in un ambiente di produzione. Lo faccio anche per le mie macchine domestiche e VM.

In questi giorni li sto dimensionando circa 1-1,5 volte di memoria. La memoria 2 volte era la regola empirica. Il disco di scambio è "economico" in quanto non è necessario eseguirne il backup o la protezione.

Se la memoria si esaurisce, lo spazio di swap ti dà un po 'di tempo e ammortizzazione per affrontare il problema.

Renditi conto che cose come / tmp possono risiedere nello spazio di scambio.

L'area di scambio può contenere un dump del kernel parziale in modo che possa essere ripristinato al successivo riavvio. Questo potrebbe essere utile per qualche futura emergenza di debug che sei chiamato a fare.


16
+1. Avere uno scambio significa la differenza tra prestazioni danneggiate con memoria insufficiente e un arresto anomalo.
Davidmh,

6
@mikeserv indipendentemente da come lo configuri, se il tuo programma tenta di allocare più memoria di quella disponibile, qualcosa andrà in crash o il sistema operativo inizierà a ucciderli.
Davidmh,

6
@Davidmh: con questo ragionamento il tuo file di scambio deve essere infinitamente grande, altrimenti i tuoi programmi continueranno a bloccarsi quando esauriscono il file di scambio.
Mehrdad,

6
@Mehrdad ma è anche più costoso. Dato che hai X GB di RAM, poiché è tutto ciò che puoi permetterti, è strettamente peggio che avere X GB di RAM e Y di scambio, per alcuni valori ragionevoli di Y (che dipenderà dal tuo utilizzo e dalle dimensioni di il tuo HD).
Davidmh,

9
"il tuo spazio di swap ti dà un po 'di tempo e ammortizzazione per affrontare il problema" - Significa anche che devo stare molto più a lungo di fronte a una macchina che non risponde fino a quando una perdita di memoria "si risolve" da sola.
Raffaello

23

Può essere:

Ho riflettuto molto su questo argomento e ho visto le opinioni atterrare su entrambi i lati della discussione più volte di quante ne possa contare. Il mio approccio era quello di sviluppare un modo per scoprirlo.

Inizia con una partizione di swap attiva di ciò che ritieni sia una dimensione sufficiente.

Quindi, aprire un terminale in un'area di lavoro ed emettere il comando free -hs 1che segnalerà l'utilizzo una volta al secondo.

Opzionalmente passare ad altre aree di lavoro.

Fai ogni cosa che potresti mai fare e poi ancora un po '. Esegui tutte le tue app comuni contemporaneamente, sfoglia più schede e prova disperatamente a dare al sistema un vero allenamento per te, questo potrebbe significare ricodificare una mezza dozzina di video mentre esegui un'operazione di compilazione e controlla la tua e-mail o altro. Diciamolo fatti, questo è tutto su come si utilizza il sistema.

Quando ritieni di avere il sistema sotto carico (o alto quanto è probabile che tu ottenga e quindi alcuni) guarda il terminale ed esamina i risultati. o meglio reindirizzare l'output su un file aggiungendo >output.txtal comando in modo da poter esaminare l'intera esecuzione. Se il tuo Swap usato non supera mai Mem free non hai bisogno di swap. Se lo fa, lo fai. free.png

Non ho bisogno di scambi. Forse lo fai. Perché non scoprirlo?

Per quanto riguarda il dimensionamento degli swap, le Regole empiriche sono generalmente sopravvalutate in quanto si tratta di una domanda basata sull'uso.


2
Quindi, stai dicendo che lo swap viene usato solo quando il tuo sistema lo richiede assolutamente? In tal caso, c'è mai una penalità nell'abilitare lo swap - per ogni evenienza? Altri commenti sembrano suggerire che anche la presenza di swap può essere dannosa per le prestazioni?
Mr White,

3
@ w3d No, non lo sto dicendo. Come puoi vedere dal mio output sopra, lo swap viene utilizzato anche se non richiesto. questo può essere regolato in qualche modo con il fattore di swapiness. Sto parlando della necessità di scambiare o meno.
Elder Geek

Puoi scriverlo per incrementare lo swap verso l'alto ogni volta che swappassa free?
JFA,

@JFA Non l'ho visto fatto. Personalmente ho delle difficoltà con il concetto di riservare una quantità indeterminata di spazio di swap per questo scopo. Teoricamente tutto è possibile. È la fase di implementazione che diventa interessante.
Elder Geek,

17

NOTA: questo è successo a me, in una situazione specifica e insolita. Se stai risolvendo un problema, questo potrebbe essere utile. Non intendo implicare che TUTTE le macchine DEVONO essere scambiate.

PUÒ ESSERE!

In passato ho riscontrato problemi con un "dispositivo" che ho creato, con Linux - in esecuzione su un dispositivo flash compatto, non volevo indossare il mio CF usando swap e c'era memoria sufficiente per l'applicazione.

La maggior parte di questi apparecchi funzionava bene, ma su una scatola particolarmente occupata ho riscontrato un problema:

FRAMMENTAZIONE DELLA MEMORIA

Senza spazio di swap, la memoria è diventata gradualmente sempre più frammentata, specialmente con processi a esecuzione prolungata (anche se avevo molta memoria libera, era tutto in bit molto piccoli). Ho inserito un po 'di spazio di swap e ho detto a Linux di non usarlo a meno che non fosse necessario; questo ha risolto completamente il problema.

Oltre a tutto il resto, lo spazio di scambio consente di spostare la memoria, deframmentandola. Se hai una memoria frammentata e hai bisogno di un singolo grosso pezzo, i frammenti verranno sostituiti; quando vengono sostituiti, vengono effettivamente deframmentati.

Dai un'occhiata a / proc / buddyinfo - il mio sembra così in questo momento:

Node 0, zone      DMA      9      5      3      4      2      3      2      2      3      3      1 
Node 0, zone    DMA32  33901   1149      0      0      0      0      0      0      0      0      1 
Node 0, zone   Normal   2414   1632    259     22      3      0      2      0      1      1      0 

I numeri rappresentano blocchi di diverse dimensioni; ogni dimensione è metà della dimensione del blocco successivo, dai blocchi 4mb a sinistra, a 4kb a destra (ovvero, 4mb, 2mb, 1mb e così via). Una macchina appena avviata dovrebbe avere tutti i blocchi a sinistra, pochissimi a destra (= non frammentato). Ricorda anche che la stessa quantità di memoria (ad esempio 4mb) verrà rappresentata come numeri diversi tra le colonne: 1 blocco nella colonna più a sinistra, 1024 nella colonna più a destra.

La memoria viene allocata dal pool che è il più a destra possibile; ad es. se il tuo programma richiede 12kb di memoria (in una volta sola), lo prenderà dalla colonna 16kb; il resto apparirà nella colonna 4kb. Se non ci sono blocchi da 16kb, ci vorranno dai blocchi da 32kb, risultando in un 16kb e un 4kb rimasti, e così via.

Se non ci sono blocchi di memoria abbastanza grandi, E HAI LO SPAZIO DI SCAMBIO, ad esempio se vuoi 16kb di memoria, troverà il blocco meno usato di 16kb (che potrebbe, ad esempio, contenere un blocco usato da 4kb, un blocco disponibile da 4kb, e altri 2 blocchi da 4kb usati), spostare le porzioni USATE solo per scambiare e allocare la memoria liberata alla nuova applicazione.

Nella scatola che si è schiantata, avevo centinaia di migliaia di blocchi da 4kb e 8kb e non molto altro.

Per quanto posso dire (andando dalle macchine in crash!) Il kernel si sposterà dalla memoria allo scambio e passerà alla memoria, ma non passerà mai dalla memoria alla memoria.


3
Il tuo caso sembra buono per l'allocazione / l'implementazione di hugepage. Eviterebbe i problemi di frammentazione (perché un hugepage di una certa dimensione, una volta assegnato, d'ora in poi verrà assegnato nuovamente per sempre solo in quella dimensione) .
Mikeserv,

2
Questa è la ragione migliore che abbia mai letto a favore dell'utilizzo di una partizione di swap. Ho provato una ricerca veloce e non ho trovato riferimenti a riguardo, mi chiedo perché questa funzionalità non sia più spesso documentata.
A 마 SE il

1
hugepage (non trasparenti) potrebbero non essere utilizzabili dalla tua app. In genere le app che richiedono tonnellate di memoria possono usarle; ad es. server di database, java jvm. Devono essere esplicitamente abilitati e diventano un pool di memoria separato che non può essere utilizzato per altri scopi. Questo può essere buono o può essere cattivo, a seconda delle circostanze. Inoltre, scopri le hugepage trasparenti. Questi tentano di spostare le cose in modo da utilizzare gli hugepage (per il loro miglioramento delle prestazioni) anche se le tue app non sanno come. Se la memoria è frammentata, le cose possono andare a sud, poiché lo spazzacamino ha altro da fare.
Dan Pritts,

1
Non ho dubbi sulla tua esperienza con il tuo dispositivo flash, non sono convinto che il caso d'uso singolo che hai presentato equivalga probabilmente alla necessità di scambio e non sono convinto che la frammentazione della memoria sia correlata allo scambio o meno. Solleva una domanda interessante che potrebbe essere facilmente testata, dimostrata o smentita.
Elder Geek,

1
Domanda di follow-up . Cosa intendi per "frammentazione della memoria"? Alla MMU non importa se le pagine fisiche utilizzate per pagine consecutive in alcuni spazi degli indirizzi virtuali sono consecutive o meno. Le pagine fisiche sono frammentate, ma questo non ha importanza (purché si parli di una normale memoria dell'applicazione su una macchina fisica a cluster singolo e non ad esempio pagine di memoria utilizzate da una periferica o un hypervisor). Quando un programma richiede 16kB, ottiene quattro pagine, che possono o meno essere vicine tra loro nella memoria fisica.
Gilles,

15

Una partizione di swap ha un valore significativo al di sopra e al di là della semplice funzione di RAM aggiuntiva quando si esaurisce.

Per prima cosa, Linux utilizza quanta più memoria possibile per memorizzare nella cache i file e le operazioni di I / O, se si dispone di un po 'di scambio si potrebbe scoprire che più memoria va nella cache di I / O e rendendola più veloce (minimizzando l'accesso al disco e riducendo anche l'usura degli SSD) al contrario alla conservazione dei dati che alcuni programmi hanno assegnato ma che sta usando solo una volta ogni 12 ore, il che può essere il caso di alcuni demoni.

Inoltre, Linux utilizza una strategia di allocazione della memoria ottimistica mediante la quale consentirà di allocare nominalmente le pagine anche se non è sicuro di avere memoria reale per riempirle. Questo è più efficiente che fare un controllo adeguato e mappare ogni allocazione e di solito non causa problemi. Tuttavia, l'euristica che il kernel utilizza per determinare se è ragionevole consentire un'allocazione include il livello di scambio disponibile sul sistema, quindi le allocazioni possono essere più veloci se il sistema ha un sacco di scambio, anche se non viene usato molto.

Questi fattori insieme mi portano a credere personalmente che è meglio avere qualche swap su quasi tutti i sistemi normali, tuttavia per le dimensioni di ram di grandi dimensioni ignoro la regola ram * 2 e limito semplicemente il mio swap a 4-8 GB (a seconda delle dimensioni del disco ).


9
Anche 4 GB sono troppo grandi per un desktop. Preferirei che il killer OOM si attivasse prima di aspettare che si riempia quel tanto scambio se qualcosa va storto. (Se mai mi fossi imbattuto in un caso in cui ne avessi bisogno di più, avrei potuto dd e mkswap un FILE di scambio prima di eseguire qualsiasi enorme lavoro che richiedesse più memoria virtuale rispetto alla mia macchina aveva RAM. Cioè, se uscire dal mio browser non si liberasse abbastanza ...)
Peter Cordes,

@PeterCordes Probabilmente dipende dal tipo di attività che stai svolgendo, lo capisco perfettamente. Personalmente, trovo di beneficiare di alti livelli di scambio poiché spesso eseguo compilazioni lunghe con bassa priorità in background mentre utilizzo la mia macchina, queste vengono quindi scambiate quando la memoria è altrimenti stretta (di solito quando la macchina è troppo occupata per fare qualsiasi compilazione Comunque). Tuttavia, sono d'accordo che si tratta di una cosa basata sul carico di lavoro molto personale, si dovrebbe sempre pensare al proprio uso prima di decidere.
Vality,

1
storia divertente: proprio oggi, sul mio laptop con 4 GB di RAM, 0,5 G di scambio (SSD), Firefox ha attivato OOM Killer (che ha scelto Firefox). Non avevo mai avuto successo prima. (Anche se stavo usando il mio laptop più del solito). Praticamente nient'altro era in esecuzione (solo gnome-terminal in xfce). Quindi penso di star bene, dal momento che Firefox dovrebbe sapere meglio che legare così tanta RAM. Ho visto qualcuno dire qualche tempo fa "esistono browser Web per sottoporre a stress test il sottosistema di memoria virtuale", o qualcosa del genere. Firefox non è in grado di liberare cache per schede che non vengono utilizzate da giorni, ecc.
Peter Cordes,

3
Un caso in cui Linux considera lo spazio di swap disponibile è quando un grande processo tenta di avviare un figlio: le chiamate di sistema fork () + exec () iniziano duplicando all'incirca l'allocazione del genitore - il kernel non può garantire che il nuovo figlio sarà più piccolo rispetto al genitore. Lo spazio di scambio in genere non viene utilizzato, ma a meno che non sia disponibile il fork () potrebbe non riuscire. Un esempio tipico su un client è un browser che avvia un plug-in o su un server quando un contenitore di applicazioni di grandi dimensioni richiama un programma di supporto. 1/2 o 1GiB di swap sono generalmente sufficienti per risolvere il problema. Google "java exec non può allocare memoria"
James

13

Non dovresti mai avere uno swap più grande della dimensione massima che potresti tollerare aspettando che il kernel si scambia / esca; in caso contrario, stai semplicemente creando una nuova modalità di errore per il tuo sistema (diventando irrimediabilmente impantanato nello scambio). Si noti che, nonostante le unità moderne siano in grado di trasferire nell'ordine di GB / sec, Linux è in genere in grado di spostare lo swap a tassi più lungo le linee di centinaia di kB, o al massimo alcuni MB, al secondo. Lo scambio così grande può rendere il sistema inutilizzabile per minuti, ore o persino giorni.

Se si dispone di memoria fisica sufficiente per quello che si sta facendo, la dimensione ideale per lo scambio è quella di abbinarla alla quantità di "dati spazzatura" che i processi stanno mantenendo ma che non utilizzano mai. Questo è probabilmente nell'intervallo da poche a poche centinaia di megabyte. Questa strategia consente a tutta la memoria fisica di essere utilizzata per memorizzare nella cache informazioni utili anziché come archivio permanente per dati che probabilmente non verranno mai più utilizzati.

Se non si dispone di memoria fisica sufficiente, è necessario valutare se è possibile tollerare un forte rallentamento da uno scambio pesante. In tal caso, avere fino a 1-2 GB di swap potrebbe avere senso, e forse fino a 4 GB se si dispone di unità estremamente veloci. Ma non solo questo peggiorerà le modalità di errore del sistema e dovresti prendere in considerazione l'acquisto di più RAM.


2
Penso che questa sia la risposta migliore. Se lo spazio di scambio è eccessivo, la macchina potrebbe non rispondere a causa di tutto lo scambio. Significa che non puoi uccidere il processo offensivo. Se riduci lo spazio di swap, il killer OOM farà automaticamente il tuo lavoro per te. Gli argomenti di altre risposte sulla memorizzazione nella cache del buffer di file non sono assolutamente convincenti. Dovresti avere lo swap in modo che il kernel possa spostare i buffer dei file in swap ... che si trova sul disco? Per favore.
Timmmm,

L'unico argomento contro lo spazio di swap che posso trovare è questo: "alcuni programmi perdono memoria". E? Se il killer OOM uccide cose importanti che non hai salvato, hai perso il lavoro. Ciò significa che questo argomento diventa completamente irrilevante, posso solo forzare l'arresto della mia macchina per avere esattamente lo stesso effetto pur avendo un elevato spazio di scambio per attività a bassa priorità che usano molta memoria e spesso vengono scambiate. Se la tua macchina si blocca in tale stato è colpa tua. L'unica volta che mi è successo è stato quando io stesso ho scritto un programma per riempire l'intera memoria di lavoro.
Sahsahae,

11

Solo se vuoi essere in grado di ibernare per scambiare (questa funzione è anche chiamata "sospendi su disco" e comporta il salvataggio dell'intero contenuto della RAM e lo spegnimento). In genere questo viene utilizzato solo su laptop e altri dispositivi mobili, quindi dipende.


6

Non esiste una risposta universale e chiara perché dipende da un'attività che stai per eseguire. Se stai per eseguire DB, HTTP, Virtualization o Cache Server non dovresti mai abilitare alcun tipo di scambio, indipendentemente dalla quantità di RAM che hai. Se disponi di un host desktop o per attività miste e hai almeno 16 GB di RAM veloce: dai un'occhiata qui: zRam


zRam è un'ottima scelta. L'ho usato insieme a piccoli sistemi di unità flash con buoni risultati.
Elder Geek,

1
@ElderGeek L'ho usato anche in un ambiente senza disco, ad esempio l'avvio di rete. Ottimo lavoro, ma ci sono alcuni avvertimenti: in primo luogo, non è necessario solo più montone, è necessario uno VELOCE. I moduli ram lenti ed economici, che probabilmente ti comporterebbero in un normale caso classico, possono causare problemi. È necessario prendere in considerazione anche il bus Front-Side della CPU: anche nel caso in cui sia possibile avere una frequenza della CPU più lenta ma una frequenza FSB più veloce migliorerà notevolmente le prestazioni. La seconda preoccupazione è una serie di partizioni di scambio zRam. Prova i numeri da 1 al numero di core della CPU. Non utilizzare su sistemi single-core!
Alexey Vesnin,

Buoni punti validi tutti. Dato che sono un fanatico delle prestazioni e ho sempre progettato e costruito i miei sistemi, non sono personalmente afflitto da tali preoccupazioni
Elder Geek,

@ElderGeek me :) :) piacere di conoscerti! Inoltre ho notato una cosa strana nel comportamento di zRam. Appare e scompare in diverse versioni e configurazioni del kernel, ma altamente riproducibile nei kernel HZ 100 e 1000. zRam funziona bene per 1,2,4 - ma non più partizioni. Anche su 8 e 16 core fisici su hardware di alto livello in attività quasi inattive. Quindi tienilo a mente giocando con le modifiche! Saluti dalla Russia!
Alexey Vesnin,

Non sono d'accordo con "se esegui un db, ... non dovresti mai abilitare alcun tipo di scambio, indipendentemente dalla montatura del ram che hai". Lo scambio è di solito preferibile all'omicida OOM che uccide i processi casuali. Sì, è necessario disporre di memoria sufficiente per le applicazioni in esecuzione e, sì, l'utilizzo di grandi quantità di scambio potrebbe rallentare il sistema. Ti invidio a vivere in un mondo ideale.
AMADANON Inc.,

5

Non c'è modo di sapere se è necessario lo spazio di swap o meno se l'unico parametro che conosciamo è la quantità di RAM installata.

In ogni caso, c'è un malinteso comune sul fatto che avere uno spazio di scambio influisca negativamente sulle prestazioni del sistema. Questo non è corretto Finché hai abbastanza RAM, avere un'area di swap qualunque sia la sua dimensione non pregiudica affatto le prestazioni. Ciò che influenza le prestazioni è la mancanza di RAM e l'utilizzo efficace dello spazio di scambio.

  • case 1: se non hai spazio di swap e ti capita di rimanere senza RAM, il kernel di Linux sceglierà uno o più processi che ritiene buoni candidati e li ucciderà.

  • case 2: Se hai uno spazio di swap e non hai RAM, il kernel sceglierà le pagine di memoria meno utilizzate e le metterà nell'area di swap per liberare la RAM. Questo rallenterà il sistema ma le tue applicazioni non saranno interessate diversamente.

Preferisco sempre il caso 2, poiché mi sento a disagio a perdere parti o tutto il mio lavoro perché il kernel pensa che valga la pena uccidere le mie applicazioni. Inoltre, con la dimensione corrente di un disco medio compresa nell'intervallo TB, riservare un po 'di percentuale per lo scambio non dovrebbe essere un problema.


6
Preferisco il caso 1, perché l'unica volta che ho esaurito la RAM è quando ho un programma in fuga. Il killer OOM è generalmente abbastanza bravo a identificare i fuggiaschi, e preferirei davvero farlo uccidere immediatamente piuttosto che dopo alcune ore di intenso scambio.
Marco

1
@Mark, questo è un punto valido. Cerco ancora di evitare di delegare a un algoritmo lo sparo prima, penso in un approccio successivo.
jlliagre,

2
case 2 è valido solo se hai qualcosa che ti avverte di questa situazione e hai abbastanza tempo per "fare qualcosa" manualmente prima che il sistema finisca lo swap. Ma potresti invece monitorare la percentuale di RAM utilizzata per gli stessi risultati.
Totor

1
In base al tuo ragionamento, è sufficiente monitorare l'utilizzo della RAM .
Totor

1
@Totor Preferisco non essere svegliato nel mezzo della notte dall'app di monitoraggio del mio laptop perché ho lanciato un batch che elabora un mucchio di file ed esaurisce la RAM. Preferisco che il lavoro sia fatto, anche se ci vogliono un paio d'ore in più a causa del sottodimensionamento della RAM rispetto all'interruzione dell'intera roba.
jlliagre,

3

La mia regola per applicare lo swap in qualsiasi sistema è avere la risposta per questo:

  • Qual è lo scopo del sistema?
  • Quanta memoria consumeranno le applicazioni?
  • È un sistema critico?
  • È necessario uno spazio temporaneo su disco per i trasferimenti di file?
  • Tasso di crescita previsto delle applicazioni?

Quando ricevo risposta per queste informazioni, dimensiono il sistema di conseguenza. Negli anni precedenti stavo facendo la regola empirica di Sun Microsystem. Fino a 16 GB di RAM in doppia per SWAP, da 16 GB in pari quantità. D'altra parte, se hai abbastanza RAM da risparmiare e le tue app non usano SWAP forzatamente, puoi ometterlo. Se hai bisogno è solo una questione di mettere un nuovo disco o lun e configurare lo SWAP. la regola di Sun si applicava principalmente perché su Solaris in caso di "panico del kernel" la memoria sarebbe stata completamente scaricata per scambiare ulteriori analisi.


1

Lo scambio sarà necessario se non hai abbastanza RAM per eseguire tutti i tuoi programmi.

Dici che non stai facendo nulla che richieda molta RAM. Quindi, hai abbastanza RAM.

Quindi, non è necessario lo spazio di scambio.

Ma , se pensi che a un certo punto, nonostante ciò che intendi nella tua domanda, i tuoi programmi useranno, dire più della metà (o due terzi) della tua RAM (regola empirica), quindi leggi l'altro "pro-swap "risposte. Non è necessario lo scambio, ma potrebbe migliorare le prestazioni del sistema.


L'uso dello swap può aiutare a evitare un incidente catastrofico ma non migliorerà mai la preformance, non più di quanto un paracadute acceleri un ferrari. ;-)
Elder Geek,

@ElderGeek Potrebbe essere un caso limite, ma lo swap può aiutare. Ci sono momenti in cui hai abbastanza RAM per tutto, ma i programmi inattivi potrebbero essere scambiati per fare un uso migliore della RAM (ad esempio qualche utile cache del disco). Lo vedevo molto alla fine degli anni '90. Lo vedo a volte ora quando ho <1 GB di RAM libera (inclusa la cache del disco), senza realmente bisogno di spazio di scambio.
jbo5112,

@ jbo5112 Non escluderò del tutto la possibilità se lo dici tu, la mia esperienza ha dimostrato finora finora. Questo non è troppo sorprendente in quanto è un caso di come il sistema viene utilizzato più di una regola rigida (che tutti sembrano cercare).
Elder Geek,

@ElderGeek Posso vederlo solo ora perché i miei dischi hanno un decennio e hanno un disperato bisogno di cache. Di solito c'è un ulteriore problema di swapiness impostato su un valore troppo alto per quasi tutti i casi, che fa sì che lo spazio di swap venga utilizzato in modo troppo aggressivo. Far cadere il valore da 60 a 10 sembra una raccomandazione comune. Puoi andare ancora più in basso, ma a un certo punto scaricherai troppa cache su disco, causando molti I / O extra durante lo scambio.
jbo5112

@ jbo5112 Buon punto. È sempre un atto di bilanciamento tra i diversi sottosistemi. Ricordo che in passato ho regolato thimgs come interleave del disco rigido e frequenza di aggiornamento della RAM per ottenere le massime prestazioni dai sistemi 80286 con le unità Seagate ST225 e ST238. Dobbiamo sempre affrontare le cose caso per caso per ottenere le massime prestazioni e affidabilità. Congratulazioni BTW! L'ultima volta che sono stato in grado di spremere un decennio da un disco è stata una Micropolis che conteneva un totale di 600 MB.
Elder Geek,

0

La breve risposta:

Sì, è sempre necessario lo scambio, proprio nel caso improbabile che un'applicazione non si preoccupi nemmeno di mappare la memoria, ma mappa direttamente la memoria virtuale.

Imposta il tuo file di scambio su:

  • RAM+round(sqrt(RAM)) se si utilizza l'ibernazione
  • round(sqrt(RAM)) se non lo fai

Impostalo swappinesssu 10 su un desktop, ma non su un server!

La lunga risposta:

Nel passato:

La regola empirica in uso negli ultimi 25 anni è stata un minimo di 1xRAM e massimo 2xRAM, quindi è quello che vedrai citato in ogni momento.

Quel minimo era arretrato nell'età della pietra quando ero un adolescente e i dinosauri vagavano ancora sulla Terra e perché la RAM era semplicemente troppo costosa e avevi assolutamente bisogno di quello spazio di scambio per poter realizzare qualsiasi cosa.

Il massimo è stato fissato in quel momento a causa dei rendimenti decrescenti: è troppo lento per scambiare tanta memoria poiché l'accesso all'HDD è un fattore 1000 più lento della RAM: buono in caso di emergenza, ma non proprio per l'uso quotidiano! Al momento, quando hai esaurito lo spazio di swap, era tempo di aggiungere più RAM! (che è ancora vero oggi).

Ora:

  1. Se non si utilizza l'ibernazione e la memoria è superiore a 1 GByte della nuova regola è round(sqrt(RAM))dove RAMè, ovviamente, la dimensione RAM in GB.

  2. Se usi l'ibernazione, devi essere in grado di scambiare l'intera quantità di RAM + RAM già scambiata su disco, quindi la formula diventa: RAM+round(sqrt(RAM))

  3. La regola dei rendimenti decrescenti vale ancora oggi per il massimo, ma a meno che non si verifichi il tuo utilizzo effettivo, prendere 2xRAM è solo uno spreco di spazio su disco , quindi non utilizzare il massimo A meno che non si esaurisca lo spazio di swap utilizzando le altre metodologie .

Tutti insieme offrono la seguente tabella: (ultime 3 colonne che indicano lo spazio di swap)

    RAM   No hibernation    With Hibernation    Maximum
    1GB              1GB                 2GB        2GB
    2GB              1GB                 3GB        4GB
    3GB              2GB                 5GB        6GB
    4GB              2GB                 6GB        8GB
    5GB              2GB                 7GB       10GB
    6GB              2GB                 8GB       12GB
    8GB              3GB                11GB       16GB
   12GB              3GB                15GB       24GB
   16GB              4GB                20GB       32GB
   24GB              5GB                29GB       48GB
   32GB              6GB                38GB       64GB
   64GB              8GB                72GB      128GB
  128GB             11GB               139GB      256GB
  256GB             16GB               272GB      512GB
  512GB             23GB               535GB        1TB
    1TB             32GB              1056GB        2TB

Quanto sopra è solo una regola empirica; non è la legge di gravità!
È possibile rompere questa regola (a differenza della legge di gravità), se il vostro particolare caso d'uso è diverso!

Consiglio del professionista: allocare sempre SWAP all'inizio di un HDD poiché le testine devono spostarsi meno all'interno del disco.
Sì: sugli SSD, non importa più dove si trova l'area di scambio in quanto usano il tunneling quantistico invece delle teste mobili e gli SSD moderni usano tutte le loro celle di memoria (anche lo spazio non allocato) per prevenire il degrado quantico.

Come verificare se l'utilizzo di swap è diverso dalla regola "generica":

Esegui solo:

for szFile in /proc/*/status ; do 
  awk '/VmSwap|Name/{printf $2 "\t" $3}END{ print "" }' $szFile 
done | sort --key 2 --numeric --reverse | more

che ti darà un elenco di tutti i programmi in esecuzione che vengono scambiati (con quello che utilizza più spazio di swap in alto)

Se stai usando più di qualche KB: ridimensiona a più del minimo, altrimenti non preoccuparti ...

Se sei su un server, smetti di leggere ora: sei pronto!


Se utilizzi un client desktop / laptop (non un server), vuoi che la tua GUI sia il più reattiva possibile e scambia solo quando è realmente necessario . Ubuntu è stato ottimizzato per scambiare in anticipo per l'uso del server, ma sul tuo client vuoi modificare quell'enorme immagine raw da 250 Mega-pixel in modo gimpche sia veloce , quindi l'impostazione swappinesssu 10 manterrà il kernel da scambiare troppo presto, assicurandoti che non lo faccia ' scambiare troppo tardi:

sudo nano /etc/sysctl.conf

e aggiungi:

# change "swappiness" from default 60 to 10 
# (theoretically only swap when RAM usage reaches around 80 or 90 percent)
vm.swappiness = 10

alla fine del file, salva il file ( Ctrl+ XY+ Enterin nano) ed esegui un:

sysctl --system

per ricaricare il parametro o solo per il gusto dei vecchi tempi, usa l'approccio Window $ e riavvia ... :-)


-1

Risposta di compromesso: dipende dal significato di "dovrebbe".

Hai bisogno di una partizione di swap nel senso che accadrà qualcosa di brutto se non ne hai una nelle condizioni operative che descrivi? No.

È saggio avere una partizione di swap nel caso in cui si generasse accidentalmente un esercito di maiali della memoria in modo da avere la possibilità di ucciderli prima che il killer OOM entri in azione? Sì.

Se la tua RAM fisica "supera" di molto l'utilizzo della memoria dati di tutti i programmi che eseguirai simultaneamente in ogni momento, allora non ci sono vantaggi in termini di prestazioni con lo scambio. Se supera, ma non "notevolmente", potrebbero esserci vantaggi in termini di prestazioni se il sistema operativo è in grado di sostituire la memoria utilizzata raramente per conservare nella memoria i dati di accesso più frequente.

In breve, è bello avere 16 GB di RAM. Ma, se hai anche un disco da 1 TB, non puoi riservare 16 GB di esso da scambiare? È solo l'1,5% del disco.

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.