Lo swap è un anacronismo?


43

Ho usato unix per un bel po 'e negli ultimi due anni ho sentito che lo scambio è un anacronismo, ma sarei curioso di sapere cosa pensano gli altri.

Il mio argomento è grosso modo questo (supponendo che non vi siano ulimit globali o twiddling delle impostazioni OOM):

There is little value in swap because if you need to swap out to disk, 
odds are it's going to be a vicious cycle where an app will continue 
to eat not only real memory, but swap as well until it gets OOM 
reaped (_if_ it gets OOM reaped). 

If you have swap enabled, it will only prolong this death march to 
the detriment of other processes - and in the worst case where the
process is not OOM reaped in a timely manner, grind the system to
a halt.

Without swap, it will probably get OOM reaped sooner (if at all)

Per qualsiasi servizio ottimizzato per le prestazioni, penso che comprendere i limiti superiori dell'utilizzo delle risorse sarebbe la chiave per ottimizzarlo in primo luogo, nel qual caso sai quanto ti serve.

Non riesco a immaginare molte situazioni (alcune, ma non molte) in cui sospenderesti un processo in corso e potrebbe scambiarsi per fare spazio ad altre cose, ma perderesti comunque le prese se lo facessi, quindi forzando un core-dump tramite gcc o copia manuale della memoria sarebbe funzionalmente equivalente.

Sicuramente non vorrei scambiare su un sistema incorporato (anche se potrebbe avere un ram disponibile più piccolo), se esaurisci il ram preferirei che il mio processo muoia piuttosto che strappare una memoria flash di milioni di scritture per settore guidare per un fine settimana livellando l'usura dei settori fino al nocciolo.

Qualche barba unix là fuori ha qualche motivo convincente per mantenere lo scambio?

AGGIORNAMENTO risposte & analisi:

  • CONFERMATO? - fork () richiede la stessa quantità di memoria per il processo figlio del genitore

    Modern fork () è copy-on-write per bambini su POSIX (in generale), ma in particolare Linux e FreeBSD , e suppongo OSX per estrapolazione. Considero questa parte del bagaglio anacronistico che lo scambio porta con sé.

    Curiosamente, questo articolo di Solaris afferma che anche se Solaris usa Copy-on-Write con fork (), si dovrebbe avere almeno 2x (!) La dimensione del processo genitore nella memoria virtuale libera per il fork () da non fare a pezzi nella Medio. Mentre l'elemento di Solaris un po ' sballa l'argomento che di swap è un anacronismo - Credo che i sistemi operativi sufficienti implementano correttamente mucca in un modo che è più importante per sfatare il mito che a segnare come ulteriore giustificazione per swap. Da. Affrontiamolo. A questo punto le persone che usano effettivamente Solaris sono probabilmente solo ragazzi Oracle. Senza offesa Solaris!

  • CONFERMATO - I file tmpfs / ramfs possono andare a scambiarsi come una comodità quando si riempie tmpfs / ramfs

    Non usare tmpfs / ramfs senza limiti! Definisci sempre in modo esplicito la quantità di ram che vuoi usare da tmpfs / ramfs.

  • PIACEVOLE - Avere un piccolo scambio 'per ogni evenienza'

    Uno dei miei vecchi capi era solito dire: "non sai cosa non sai" - in sostanza, non puoi prendere una decisione sulla base di informazioni che non hai ancora. Questo è un argomento plausibile per scambiarmi, tuttavia - sospetto che i tipi di cose che faresti per rilevare se la tua applicazione si sta scambiando o meno sarebbero più pesanti del verificare se malloc () ha successo o cogliere l'eccezione da un nuovo () non riuscito.

    Questo può essere utile nei casi in cui stai eseguendo un desktop e hai un sacco di cose casuali in corso, ma anche ancora - se qualcosa va storto preferirei che OOM fosse raccolto piuttosto che tuffarsi nell'inferno di scambio. Sono solo io.

  • ARRESTATO! - Su Solaris , lo scambio è importante per un paio di motivi

    tmpfs - stati La quantità di spazio libero disponibile per tmpfs dipende dalla quantità di spazio di swap non allocato nel sistema. La dimensione di un file system tmpfs aumenta per adattarsi ai file scritti su di esso, ma ci sono alcuni compromessi intrinseci per gli utenti pesanti di tmpfs. Tmpfs condivide le risorse con i segmenti di dati e stack dei programmi in esecuzione. L'esecuzione di programmi molto grandi può essere influenzata se i file system tmpfs sono vicini alla dimensione massima consentita. Tmpfs è libero di allocare tutto tranne 4 MB di spazio di swap del sistema.

    Fatti e miti di Solaris sullo swap - stati La memoria virtuale oggi consiste nella somma totale della RAM fisica e dello spazio di swap su disco. Solaris NON richiede alcuna configurazione dello spazio di swap. Se si sceglie questa opzione, una volta che la RAM è piena, non sarà possibile avviare nuovi processi. .

    Non sono sicuro che ciò significhi che la massima mappa virtuale che puoi creare è ram + swap , o se potresti ancora fare qualcosa come mmap () un file più grande di ram e fare affidamento sull'inizializzazione pigra di mmap (). in questi giorni probabilmente può funzionare bene Solaris senza swap, sembra che sia meno amichevole rispetto ad altri sistemi operativi POSIXy.

  • ARRESTATO! I più diffusi strumenti di ibernazione Linux sembrano basarsi sullo scambio

    Per impostazione predefinita, TuxOnIce sembra fare affidamento sullo scambio per l'ibernazione, sebbene esistano altri backend. Tuttavia, se non stai eseguendo una scatola che deve essere in letargo, rimarrei comunque dietro l'affermazione che "lo scambio è anacronistico su Linux"


Non ho molta barba un * x (alcuni capelli ancora;), ma i miei 2 centesimi sarebbero che avere un "po '" di scambio darebbe al tuo sistema un po' di robustezza. Come invece di direttamente OOM, andresti a scambiare invece se un po 'oltre il tuo sistema limita. Certo, se davvero oltre i limiti del tuo sistema, il tuo sistema alla fine si bloccherà / si fermerà / nuke-stesso / qualunque cosa diavolo puoi immaginare. Quindi dare un po 'di corda con cui giocare;)
Ouki,

1
La cosa su fork () è infatti vera se imposti il ​​tuo sistema in modo che non sovraccarichi mai la RAM (questo non è il valore predefinito). Ora, perché non avresti più bisogno di questa impostazione, non ne ho idea. Non è utile per l'elaborazione in tempo reale.
Giosuè,

@Jushua: il sovraccarico di memoria potrebbe non essere il valore predefinito o addirittura possibile a seconda del sistema operativo.
jlliagre,

Ho un server NAS con 8 GB di RAM, funzionerà fino a 2 VM. Non ho effettuato lo scambio. Se inizia a scambiarsi pesantemente, allora è già morto. Quindi supporta perfettamente il tuo argomento. D'altra parte, sto ancora usando il mio desktop arrugginito con un limite di 1 GB di RAM e lì ho uno scambio per gestire la memoria sparsa. Rende la cosa un po 'più lenta ma mi aiuta ad aprire contemporaneamente Firefox e altre applicazioni.
Huygens,

Trovo che il killer OOM si inneschi troppo tardi, solo dopo che tutte le cache sono state svuotate e il sistema è diventato lento. Per mantenere il mio sistema scattante, uso earlyoom o nohang per fare lo stesso lavoro ma prima! Può essere usato con o senza swap.
joeytwiddle

Risposte:


28

Non confondere (il) scambio (come area disco) e (to) scambio (come metodo per spostare pagine di memoria dalla RAM al disco e reciprocamente).

Lo scambio eccessivo è qualcosa da evitare per motivi di prestazioni ma avere un'area di scambio non è necessariamente un problema.

Su sistemi, come Linux, che sovraccaricano la memoria, ovvero che consentono ai processi di allocare più memoria di quella disponibile, esaurire la RAM con uno swap non sufficiente per gestire la situazione attiverà il killer OOM. Devi fidarti dell'algoritmo usato per selezionare il processo "giusto" da uccidere, e accettare uno o più dei tuoi processi da uccidere senza avere la possibilità di chiudere correttamente. Ecco una famosa analogia che spiega perché il killer OOM potrebbe non essere affatto una buona idea.

Su sistemi come Solaris, che non sovraccaricano la memoria, ovvero che assicurano che una prenotazione della memoria sia sempre supportata dalla memoria virtuale, sia nella RAM che sul disco, disporre di un'area di scambio sufficiente è assolutamente necessario, altrimenti una parte potenzialmente significativa della RAM sarà sprecato.


1
Sei sicuro che il punto su Solaris sia ancora vero? blogs.oracle.com/jimlaurent/entry/solaris_faq_myths_and_facts afferma: la memoria virtuale oggi è costituita dalla somma totale della RAM fisica e dello spazio di swap su disco. Solaris NON richiede alcuna configurazione dello spazio di swap. Se si sceglie questa opzione, una volta che la RAM è piena, non sarà possibile avviare nuovi processi. Penso di vedere qual è il tuo punto: se volessi mmap qualcosa di più grande di un ram fisico senza lo swap non potresti? (Indipendentemente dal fatto che mmap è un inizializzatore pigro).
synthesizerpatel,

5
Sì, sono sicuro che il mio punto su Solaris è ancora vero. Anche se la citazione di Jim Laurent è vera, cioè Solaris non richiede lo scambio, non avere lo scambio significa che tutta la prenotazione della memoria (cioè malloc) deve essere supportata dalla RAM, anche se parte della memoria allocata non viene utilizzata. Questo non è correlato a mmap o tmpfs di grandi dimensioni, sebbene tmpfs sia anche un motivo per cui potresti voler scambiare con Solaris (e Linux anche per quella materia).
jlliagre,

1
Aggiornamento per Linux: l'overcomiting può essere disattivato, l'algoritmo OOM può essere modificato, puoi persino avere il tuo gestore OOM con cgroups.
peterph

1
@peterph Disattivare il commit eccessivo su Linux rende lo swap ancora meno un anacronismo. Se non si esegue l'overcommit, è necessario assicurarsi di disporre di un'area di swap sufficientemente ampia da supportare tutte le prenotazioni.
jlliagre,

1
La memoria virtuale riservata da un fork dipende dalla dimensione del programma che lo esegue. Supponiamo che tu abbia una VM Java che utilizza 2 GB di memoria fork, richiederà temporaneamente 2 GB in più. Se ciò accade mentre hai meno 2 GB disponibili o contemporaneamente più volte, uno o più fork falliranno. Questa è una situazione comune con i sistemi operativi non troppo impegnativi, e anche con Linux quando il commit eccessivo è disabilitato. Può essere facilmente risolto avendo un'area di swap abbastanza grande che IMHO è una soluzione abbastanza migliore del sovraccarico di memoria.
jlliagre,

3

Conosco un motivo per mantenere lo scambio. Ho un'app che occupa tutta la memoria che posso permettermi di configurare per il mio sistema. Utilizza Hadoop, che in una parte dell'elaborazione esegue un fork ed exec per eseguire un singolo comando unix (penso "uname" o "utente" o qualcosa per cui non sono riusciti a trovare un equivalente Java). Sembra che Java non esegua un vfork con copia sulla scrittura semantica come farebbe un'applicazione nativa. Se avvio la mia app utilizzando 4 GB di RAM, quando si biforca, il fork utilizza altri 4 GB di RAM, ma poi lo rilascia rapidamente. Se non avessi 4 GB di swap per quel Hadoop in cui scambiare, dovrei pagare per 8 GB di RAM solo per avere 4 GB per la mia app.


Questo è un ottimo punto, ma non un riflesso del fork moderno () - Su Linux e FreeBSD (e, apparentemente OSX?) Fork () è implementato attraverso l'uso di pagine copy-on-write. Copy-on-write (o COW) è una tecnica per ritardare o impedire del tutto la copia dei dati. Anziché duplicare lo spazio degli indirizzi del processo, il genitore e il figlio possono condividere una singola copia. I dati, tuttavia, sono contrassegnati in modo tale che se vengono scritti, viene creato un duplicato e ogni processo riceve una copia univoca. Citazioni: forums.freebsd.org/showthread.php?t=26355 e manpage Linux per fork ()
synthesizerpatel

Sebbene sia vero, ci sono alcune pagine che non possono essere contrassegnate come COW. Ad esempio, le pagine utilizzate per lo stack del kernel del nuovo processo figlio e le pagine utilizzate per le strutture di dati interne (the files_struct, the struct signals, the task_structe altre). Inoltre, molte pagine eseguibili non sono codice dipendente dalla posizione (PIC) e quindi le pagine di codice eseguibile che sono state modificate dal caricatore dinamico ( ld-linux.so) devono avere uno spazio di scambio riservato a loro anche se non viene scritto nulla per scambiare immediatamente lo spazio. Ecco perché amo Linux; puoi disattivare lo scambio e il sistema funziona ancora. :)
Azhrei,

3

Non posso aggiungere tecnicamente alla discussione, ma posso fare alcuni esempi. Il mio vecchio notebook (2 GB di RAM kunbuntu lucido) in genere funziona con swap a 0. Quando eseguo la trasmissione (client bittorrent) con un numero di torrent che possono utilizzare collettivamente 100 connessioni, il mio swap può aumentare. Peggio ancora quando ho un XP vm che utilizza 1 GB di memoria reale.

Ho visto altri commentare che anche i processi ad alta intensità di memoria come il rendering grafico possono immergersi nello scambio. Se lo fai solo occasionalmente, non è un problema.

Per quanto riguarda i problemi di OOM, lo swap può effettivamente essere un vero toccasana perché ti fa guadagnare tempo tra l'identificazione del problema e le cose che vanno a sud. Molte cose usano quasi tutta la mia memoria, quindi non ci faccio caso, ma quando lo swap inizia a correre, lo noto e inizio a cercare il problema, prima che mi morda.


Bene sì, i sistemi legacy non possono fare molto senza lo swap abilitato. Ho ancora un vecchio subnotebook con 256 MB di RAM, dove è necessario sostituire lo swap per avviare praticamente qualsiasi programma. Credo che la domanda sia rivolta ai sistemi moderni.
Dmitry Grigoryev,

3

Esiste un'applicazione molto bella per lo spazio di swap: estensione della RAM inserendo lo spazio di swap sul dispositivo di archiviazione che utilizza la RAM, per superare i limiti della RAM di sistema installabile

Dai un'occhiata a questo gadget http://techreport.com/articles.x/16255 Fondamentalmente un'interfaccia da S-ATA a DDR2-RAM. Puoi riempire fino a 64 GB di RAM in quelli. Posizionando lo spazio di swap su uno di questi si ottiene un po 'di RAM aggiuntiva significativa. Ovviamente non è veloce come la normale RAM di sistema. Ma in un certo senso trasforma la RAM di sistema in una sorta di livello cache aggiuntivo.


1
Considerando il suo prezzo ($ 549) non sarebbe più efficiente investire $ 100 in una scheda madre che supporta 64 GB di RAM ?
Dmitry Grigoryev,

1
@DmitryGrigoryev: Certo. Ma a volte si è costretti a utilizzare quel particolare tipo di hardware (perché per motivi tosse sistema medico certificazione tosse ), ma anche avere a che fare con ridicolmente grandi serie di dati prodotti in pochissimo tempo (si pensi tomografi, datarates> 3GiB / s).
datenwolf,

In tal caso, non dovresti certificare l'unità RAM come dispositivo medico? ;) Sì, ho capito.
Dmitry Grigoryev,

1
@DmitryGrigoryev: In effetti devi farlo. Tuttavia, certificare un tale dispositivo disco S-ATA RAM è molto, molto più semplice che certificare un'intera scheda madre. Quando si acquistano i computer utilizzati nelle apparecchiature mediche, di solito si acquistano quanti più componenti possibili certificati. Per le parti in cui non è disponibile nulla con una certificazione prontamente disponibile, eseguire i test e la certificazione necessari. Soprattutto quando si lavora nella ricerca, dove l'accento è posto sulla sicurezza del paziente e i dati non vengono utilizzati per la pianificazione del trattamento, questa è la soluzione più economica e rapida. BT; DT.
datenwolf,

3

Ho eseguito Linux e Windows senza scambio (file di paging, nella nomenclatura di Windows), su notebook / desktop con almeno 4 Gb. Ci sono alcune occasioni in cui si verifica l'esaurimento della memoria, mi occupo solo di loro. Sento che il sistema è più scattante in questo modo, a cui tengo di più. Nessun requisito speciale per il mio carico di lavoro però.

Cose che ho imparato:

  • Windows "perde" la memoria con il tempo, in circa 20-30 giorni di uptime arrivo a un punto in cui preferisco semplicemente riavviare. Non so perché questo accada. Immagino che potrebbe trattarsi di una perdita in alcuni driver o dell'antivirus. Quando si dispone di un file di paging, credo che possa mettere questa memoria trapelata nel file di paging, quindi sarebbe più difficile notare questo problema su un normale sistema Windows.
  • Firefox gestisce meglio con poca memoria rispetto a Chrome. Firefox ti avverte e continua a funzionare, Chrome si arresta in modo anomalo.

2

Penso che i tuoi argomenti siano abbastanza validi per un server , dove le prestazioni sono importanti e sapere quale app agirà dopo potrebbe non essere prevedibile.

Tuttavia, per un desktop trovo utile lo scambio quando spingo e schiocco le attività.

Ad esempio, se sto lavorando su un'attività utilizzando l'app Ae poi scopro che devo usare l'app Bper qualcosa (un'attività secondaria o un'interruzione), è mentalmente più facile per me lasciare che lo Ascambio su disco mentre lavoro in Bquello di chiudere Ae poi ricordare di riavviarlo in seguito.

Ciò è particolarmente vero se Acontiene uno stato non salvato che non verrebbe ripristinato al riavvio.

Se è più veloce spingere e tirare Averso / da swap, o chiudere e riavviarlo, dipende dall'app. (Alcuni riescono ad avere un avvio lento ma una piccola dimensione residenziale.)

Tuttavia, sarei d'accordo sul fatto che una soluzione migliore per migliorare la produttività sarebbe installare qualche RAM aggiuntiva.


Aggiornamento: dopo aver scritto questa risposta, ho posseduto un laptop con molta RAM e un disco rigido lento. In tal caso il mio consiglio si è invertito! Ecco un riassunto di pro e contro .
joeytwiddle

1

Sul mio sistema, / tmp si rovescia per scambiare se inghiotte troppa RAM.

Questo è molto più veloce rispetto all'utilizzo di un vero filesystem per / tmp.


È piuttosto pericoloso - se ho bisogno di ramfs, specifico in fstab (o opzioni) per impostare esplicitamente la dimensione. È altrettanto probabile che un programma possa diventare pazzo di scimmia con l'allocazione di memoria in quanto inizia a creare file in / tmp. Lo scambio sarebbe un brutto posto per la visualizzazione dei file ramfs (specialmente se ti affidi a ramfs per la velocità)
synthesizerpatel

2
Supero frequentemente le dimensioni della RAM. tmpfs supportato da swap è significativamente più veloce di ext2 anche durante lo spargimento.
Giosuè,

Utile da sapere - e probabilmente sarà un futuro oggetto di ricerca da guardare - sarei ancora preoccupato per un'applicazione che riempie il mio ram da proxy di tmpfs / ramfs in / tmp. Questo mi dà i giochini heebie!
synthesizerpatel,

Quindi impostare il limite = dimensione dello scambio.
Giosuè,

Per inciso, questa è la differenza tra ramfs e tmpfs. tmpfs può riversarsi per scambiare mentre ramfs non può.
Giosuè

1

Ci sono molte ragioni quando si usa lo swap.

Di solito, quando il sistema non ha abbastanza memoria fisica, il kernel può scambiare alcune applicazioni (in effetti - alcune parti della memoria che non vengono utilizzate).

Successivamente, quando queste applicazioni dovrebbero fare qualcosa (ad esempio, alcuni dati arrivano su un socket o alcuni fuochi del timer) - il kernel metterà alcune altre applicazioni da scambiare.

Un altro esempio di utilizzo dello swap è la sospensione su disco.

Per quanto riguarda i dispositivi integrati, tutti possono essere suddivisi in (almeno) due grandi gruppi:

  1. eseguono Linux / Windows o simili non RTOS (Real Time OS); o
  2. gestiscono un RTOS.

Naturalmente, ci sono dispositivi che eseguono solo un po 'di codice (una sorta di microcontrollori) ecc. Non li descriverei perché tali dispositivi non hanno alcun sistema operativo, quindi discutere di scambio non ha senso per tali dispositivi.

Il primo gruppo di dispositivi integrati (che eseguono alcuni sistemi operativi) può utilizzare (e di solito usano) lo scambio. E in generale, tali dispositivi utilizzano lo swap allo stesso modo di desktop e server.

Il secondo gruppo di dispositivi (che esegue RTOS) non utilizza affatto lo scambio, poiché RTOS ha limiti di tempo per rispondere all'evento e

  • la lettura dallo scambio può richiedere del tempo imprevedibile
  • i dispositivi hanno un numero predefinito (al momento della compilazione) di compiti che non è necessario scambiare

A proposito, ci sono molte descrizioni di come Linux usa lo swap, uno di questi è http://distilledb.com/blog/archives/date/2009/02/22/swap-files-in-linux.page
uso di Windows un approccio simile.


Inoltre, è necessario lo scambio per l'ibernazione (sospensione su disco) a meno che non si stia utilizzando qualcosa come TuxOnIce.
Renan,

1

Mi sembra che sia il letargo che il sonno ibrido abbiano bisogno di spazio di swap su Linux .

Non ho mai usato lo spazio / la partizione di swap su Linux fino a quando non mi sono trovata di fronte alla necessità di utilizzare la sospensione ibrida - poiché la sospensione a livello di batteria critica non era disponibile sul mio sistema, in quanto gestita da Upower, che sceglie solo tra Shut-Down, Hibernate e Hybrid -dormire. (altro qui )


0

Alcuni buoni usi che ho visto sono processi che utilizzano molta memoria, ma non critici per le prestazioni. Un caso era un antico Firefox che aveva una cattiva perdita di memoria. Riempirebbe la RAM e si riverserebbe per scambiarsi senza alcun effetto negativo. Un altro che abbiamo avuto è stato il nostro server DNS ricorsivo (quelli creano rapidamente un'enorme cache che viene utilizzata raramente).

L'altra spiegazione che ho visto sullo swap è stata in qualche modo analoga: "Ti viene detto di configurare sempre SWAP = 2 * RAM. Questa è una totale assurdità, non esiste alcuna relazione tra RAM e swap. Lo scambio è di accomodare i picchi nell'uso della memoria , è necessario aggiungere memoria sufficiente affinché la maggior parte delle volte il carico si adatti alla RAM. Se il carico è stabile, non è necessario lo scambio. Se il carico è altamente variabile, è necessario uno scambio sufficiente per i picchi e disporre in modo che swap viene utilizzato abbastanza raramente per non influire in modo significativo sulle prestazioni in generale. Riassumendo, poiché non hai idea di quali siano i picchi di carico e poiché il disco è molto più economico della RAM, configura SWAP = 2 * RAM. "

Alcune vecchie versioni di Solaris non potevano affatto usare lo swap a meno che non ci fosse almeno lo swap della RAM (ricordo che ha allocato spazio di swap fisso per uscire dalla RAM o qualcosa del genere), quindi 2 * RAM era davvero intorno al minimo ragionevole valore. Ma è stato eoni fa, quando la nostra grande macchina aveva 64 MiB RAM e un disco da 1 GiB ...

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.