Scambia le dimensioni della partizione su un computer RAM da 64 GB per lavori che richiedono molta memoria


36

Ho 64 GB di RAM e 240 GB di SSD sul mio computer, che userò per calcoli ad alta intensità di memoria (machine learning, data mining, ecc.). La maggior parte dei consigli che ho trovato su Internet sono circa 2-4-8 GB di computer RAM e raccomandano il doppio della dimensione della partizione di scambio RAM (quindi 128 GB).

È ragionevole creare una partizione di swap da 128 GB? quali vantaggi ottengo creando un'enorme partizione di swap?

Capisco correttamente che, nel caso in cui rimanga senza RAM fisica:

  1. Se non ho swap, visualizzo un errore "memoria insufficiente"
  2. Se ho lo swap, alcune delle pagine RAM verranno copiate nella partizione di swap e il programma continuerà a funzionare (anche se più lentamente).

Alcune persone dicono che è una cattiva idea effettuare lo scambio su SSD, poiché ha un numero limitato di cicli di lettura / scrittura. Quanto velocemente usando swap esaurirà i cicli di lettura / scrittura SSD (per quanto ne so, sono circa 50000 IOPS di scrittura)?

Sto usando Linux ( Ubuntu 14.04 (Trusty Tahr)).

Andare a impostare uno scambio da 16 GB per ora, poiché dovrebbe essere sicuramente sufficiente (ad esempio, RedHat suggerisce 4 GB) e 16 GB di spazio su disco non sono in realtà un grosso problema.


1
Invece di fare affidamento esplicitamente sullo scambio, se conosci le dimensioni del tuo set di lavoro in anticipo o sei disposto a fare un po 'più di gestione della memoria di basso livello, prendi in considerazione l'uso mmapper allocare le pagine del set di lavoro. Quindi la quantità di swap sarà esattamente la quantità necessaria per il processo.
soffice

5
Il consiglio che raccomanda "il doppio della quantità di RAM" risale ai vecchi tempi, quando i computer avevano poca RAM. Diversi documenti affermano che è applicabile principalmente ai computer con <2 GB di RAM. Inoltre, la dimensione dello scambio è principalmente correlata a ciò che si sta facendo con la macchina.
John WH Smith,

Vedi anche questo errore del server q & a - se stai eseguendo Java (e possibilmente altre app), vuoi assicurarti di avere uno scambio sufficiente per aumentare le loro allocazioni di memoria. Rispetto personalmente lo standard RHEL di RAM + 2 per la mia partizione di swap
warren

2
È un peccato che la maggior parte dei commenti qui siano stati rimossi. Aggiungendo di nuovo: vale la pena ricordare, per inciso, che se il tuo kernel lo supporta, potresti voler montare la tua partizione di swap discardsu un SSD. Inoltre (e questo è stato menzionato in una risposta di seguito), non dimenticare che puoi utilizzare un file invece di una partizione per una gestione potenzialmente più semplice (e nessun hit delle prestazioni su un SSD a causa, ad esempio, della frammentazione).
Jason C

1
Se hai un'applicazione ad alta intensità di memoria, come l'apprendimento SVM, e finisci il ram e inizi a scambiare, tutto diventerà troppo lento per recuperare e la tua unica mossa disponibile sarà staccare la spina (che è successo a me un paio di volte) . Probabilmente vuoi che il tuo processo venga ucciso da OOM se inizia a scambiare, in modo da poter almeno cambiare roba e ricominciare. Forse con le unità SSD non è poi così male. Verificherei anche le impostazioni di OOMK - mi è capitato su Ubuntu che a volte i processi venissero uccisi da OOM quando rimanevano ancora molti ram perché allocati in modo aggressivo
pqnet

Risposte:


36

Probabilmente avrai bisogno solo di una piccola quantità di swap. Quando disponi di RAM sufficiente per il tipico set di lavoro del tuo computer, cosa che sono abbastanza sicuro, devi solo scambiare due cose:

  1. È necessario lo scambio per ottenere informazioni a cui probabilmente non si accederà mai dalla RAM per liberare più spazio per la cache del disco. Molte applicazioni vengono eseguite all'avvio del sistema e non saranno più accessibili. Non vuoi che le pagine che hanno sporcato rimangano per sempre nella RAM. Quindi è necessario scambiare per tenerli.

  2. È necessario lo scambio per coprire le allocazioni che non saranno mai riempite. Questo spazio deve semplicemente essere disponibile, anche se non verrà utilizzato. Senza di esso, il sistema dovrà rifiutare di allocare memoria anche quando ha molta RAM fisica libera perché ha un archivio di backup insufficiente per consentire di utilizzare tutte le sue allocazioni contemporaneamente.

Nessuno di questi richiede una grande quantità di swap. 16 GB, ad esempio, dovrebbero essere più che sufficienti. Lo scopo non è quello di farti gestire gruppi di lavoro più grandi a costo della velocità. Lo scopo è quello di consentirti di utilizzare il tuo 64 GB in modo efficace e di non doverlo ostruire con la spazzatura o riservarlo per casi limite che non accadranno mai.

(Concordo con Bert sul fatto che 4 GB è abbastanza probabile che sia sufficiente.)


2
@wrwt Metti la tua partizione di swap alla fine del drive (o almeno dopo la tua partizione di dati), renderà il ridimensionamento più veloce e meno intensivo in scrittura se dovessi mai scegliere di regolarlo (più specificamente farà ridimensionare la partizione di dati per renderlo più semplice, poiché non è necessario spostare l'inizio). Non esiste alcun collegamento tra posizione e prestazioni su SSD, come talvolta accade su unità meccaniche.
Jason C

Sebbene questa risposta sia probabilmente sufficiente per la maggior parte degli hobbisti, allora è un cattivo consiglio per i server reali: la risposta dipende da come viene scritta l'applicazione, poiché l'esaurimento dello spazio di swap farà sì che il killer di memoria insufficiente si avvii e termini un process by random (sì, hai letto bene; "random")
Soren,

3
@Soren Questo è un superutente, non un serverfault. ;) È certamente vero che l'impostazione dello spazio di swap non è l'unica decisione che è necessario prendere per "server reali". È inoltre necessario prendere decisioni su cose come overcommit, potrebbe essere necessario sintonizzare il killer OOM e così via. (E le risposte diventano molto più complicate se ti aspetti che il tuo set di lavoro superi la RAM fisica. Ma quasi nessuno gestisce più le macchine in quel modo.)
David Schwartz

5
Linux sovraccaricherà la memoria anche senza lo swap abilitato. Funzionerà semplicemente OOMK quando viene effettivamente utilizzata troppa memoria. Quindi il secondo punto della risposta è sbagliato.
Ruslan,

1
@MaciejPiechotka O usa un file.
Jason C

29

RedHat consiglia 4 GB su una macchina con 64 GB .

Tuttavia, il dimensionamento degli swap è più un'arte che una scienza. Dipende da cosa viene utilizzata la macchina, da quanto spazio su disco e memoria hai e da altri fattori. Ricorda, puoi sempre aggiungere più swap in seguito.

L'uso della regola di memoria fisica 2X è obsoleto con la quantità di sistemi di memoria attualmente disponibili. Ma correre con zero swap non è raccomandato a meno che tu non sappia cosa stai facendo. La raccomandazione di 4 GB è un buon punto di partenza.


12
+1 per l'ultimo paragrafo. La raccomandazione 2x risale a quando la maggior parte dei computer non disponeva di RAM sufficiente per evitare lo scambio durante l'uso normale. Soggettivamente, dall'uso dei computer quindi, il limite di 2x sembra essere stato selezionato come un numero abbastanza grande da rendere il computer insolitamente lento prima di rimanere senza swap.
Dan Neely,

1
2X funzionava bene anche quando i sistemi avevano 4 GB / 8 GB di RAM e centinaia di gigabyte di spazio su disco. Certo, probabilmente era più del necessario, ma qual era il danno? Ma ora che i sistemi hanno 16 GB / 64 GB di RAM e SSD da 128 GB / 256 GB, il danno è evidente.
David Schwartz,

12

Su Linux, è necessario uno swap sufficiente affinché la memoria virtuale totale disponibile (RAM + SWAP) sia sufficiente per tutti i processi che si desidera eseguire contemporaneamente e il loro footprint virtuale massimo.

Se si dispone di uno swap inferiore o di uno swap totale, si verifica la seguente situazione: il sistema esaurisce la memoria nel tentativo di allocare una pagina. Tuttavia, questo è ancora un leggero errore, anche se non c'è scambio, perché il sistema ha molte pagine "vittima" che possono essere rimosse per fare spazio: vale a dire, le pagine di tutti i mapping di memoria supportati da file, come gli eseguibili e librerie condivise!

Poiché il tuo sistema richiede sempre più spazio per i dati (che non possono essere scambiati), evacuerà sempre di più il codice eseguibile (librerie condivise ed eseguibili), portando a un terribile arresto, poiché il set di lavoro viene ridotto in un set sempre più stretto di pagine.

Lo spazio di swap attenua questo problema fornendo uno spazio per lo scambio di pagine anonime (non mappate da file): le pagine utilizzate per le allocazioni di memoria, in modo che il codice eseguibile possa rimanere in memoria.

Tuttavia, se non esegui frequentemente attività ad alta intensità di memoria, potresti essere in grado di cavartela con lo swapless per la maggior parte del tempo e configurare manualmente un file di scambio (anziché una partizione dedicata) quando ne hai bisogno. Per creare un file di scambio al volo, diventa root e:

dd if=/dev/zero of=/path/to/swapfile size=$((1024 * 1024)) count=32768  # 32 Gb.
mkswap /path/to/swapfile
swapon /path/to/swapfile

Quando non ti serve più:

swapoff /path/to/swapfile
rm /path/to/swapfile

Gli appunti:

  1. Sicuramente non è necessario configurare almeno lo swap di una RAM. Questa regola empirica risale ai sistemi operativi in ​​cui era un requisito difficile a causa del modo in cui è stato progettato lo scambio.

  2. Ci sono modi per rendere difficile il fallimento di Linux quando non è disponibile memoria, in particolare manipolando i valori di queste voci sysctl:

    vm.overcommit_memory
    vm.overcommit_ratio
    

2
+1 per riferirsi effettivamente ai parametri di configurazione del kernel - La chiave è nella parte della domanda If I have no swap, I get an 'out of memory' error- che è false- la verità è che quando si esaurisce lo spazio di swap il killer della memoria esaurita si avvia e uccide un processo casuale per liberare spazio, quindi la quantità di spazio di swap necessaria dipende da come viene scritta l'applicazione.
Soren,

@Soren È probabile che la maggior parte della RAM sia piena di dati reali, quindi il killer di memoria insufficiente non farà molta differenza. Grazie per "la verità" comunque.
Wrwt

3

Ci sono più considerazioni. Se hai bisogno / vuoi che la sospensione funzioni, allora hai bisogno almeno della dimensione della tua RAM e poi di alcune. Tuttavia sembra improbabile che tu ne abbia bisogno dato che sembri costruire principalmente un cavallo da lavoro computazionale.

In questo caso, considerare l'utilizzo di un file di scambio anziché di una partizione. Non devi preoccuparti di ridimensionare molto, sbarazzartene o aggiungerlo in seguito non richiede alcun ripartizionamento. Non vi è alcuna penalità sulle prestazioni (evidente) utilizzando un file su una partizione. Se mai ne hai bisogno, dai un'occhiata alle dimensioni e questo ti darà anche buoni suggerimenti.


1
@Kaz Penso che tu stia parlando di qualcosa di diverso da Kaste. kaste sta dicendo che se vuoi essere in grado di sospendere / ibernare il tuo computer, spegnerlo e riprendere da dove ti eri interrotto in seguito, hai bisogno di spazio di scambio sufficiente per memorizzare tutta la tua RAM (altrimenti dove andrebbe?).
amalloy,

@amalloy Se hai memorizzato la tua RAM nel tuo spazio di swap, dove va lo swap (ricordando che lo swap viene trattato come memoria - se lo perde è lo stesso di perdere ram).
NPSF3000,

2

Il carico di lavoro che si desidera applicare alla macchina necessita di una certa quantità di memoria per essere eseguito (ricordarsi di aggiungere abbastanza all'equazione per gestire i carichi di picco) ed è necessario configurare il proprio computer per avere almeno quello.

I moderni sistemi operativi forniscono memoria virtuale come combinazione di memoria fisica e spazio di scambio, quindi se hai bisogno di più memoria di quella che la macchina ha a disposizione devi aggiungere abbastanza spazio di scambio per colmare il vuoto. Vale a dire se hai bisogno di un massimo di 80 GB e la macchina ha 64 GB hai bisogno di 16 GB di scambio.

In genere, i programmi di installazione del sistema operativo ti chiedono di creare un'area di scambio iniziale (poiché questa è la più semplice e consente l'installazione anche di piccoli computer), ed è stato trovato che una buona regola empirica per le tipiche operazioni Unix è avere la memoria virtuale dimensionata per essere tre volte la memoria fisica, quindi questo è generalmente suggerito. Tuttavia, sai di più sul modello di utilizzo in modo da poterlo modificare nel modo appropriato.

Non c'è niente di sbagliato nel lavorare senza spazio di scambio se la pressione della memoria è sempre inferiore. Linux utilizzerà in modo trasparente qualsiasi memoria non utilizzata come cache del disco.


2

Un'idea molto migliore di avere "molto swap" è (ri) organizzare il lavoro in modo che i set di lavoro si adattino alla memoria, quindi utilizzare il file system per archiviare e recuperare il lavoro svolto. Vale a dire, invece di forzare il sistema operativo a indovinare quali saranno i tuoi schemi di utilizzo della memoria, usa ciò che sai dei tuoi problemi per controllare i tuoi schemi di utilizzo della memoria.

Come esempio casuale che è immediatamente rilevante per me quest'estate ... Nell'implementazione del setaccio quadratico, è necessario un grande array (apparentemente) contiguo per eseguire il markup (con alcuni algoritmi complicati i cui dettagli in realtà non contano per questo esempio). L'array deve contenere ~ 100 voci Giga, quindi facilmente nell'intervallo di 1 TB. Potrei fingere di allocare ciò e lasciare che il sistema operativo esegua una quantità incredibile di scambio inefficiente per ottenere pagine dentro e fuori dalla RAM per supportare tutte le scritture sequenziali attraverso l'array. Invece di fare qualcosa che è andato storto, ho deciso di allocare un array molto più piccolo che si adatta esattamente alla memoria e quindi riutilizzare quel piccolo array per coprire in modo iterativo il resto del grande array a fette. Ho anche rimosso il sistema operativo, eliminato il set di servizi in esecuzione, sostituito la shell,

L'SSD può essere veloce, ma non è così veloce come organizzare il tuo calcolo per fare lo stesso insieme di operazioni senza mai fermarti allo scambio.


1

Come altri hanno già detto, una partizione di swap è una buona idea anche se si dispone di molta RAM. Non è una buona idea metterlo su un SSD; le frequenti scritture di una partizione di swap finiranno per consumare l'unità.

Se si dispone di una porta USB 3.0 di riserva, suggerirei di utilizzare un'unità flash per lo spazio di scambio. Ci sono molte unità flash ad alta velocità che sono veloci come il tuo SSD, ma molto più economiche - abbastanza economiche da sostituire se ha iniziato a guastarsi. Una rapida ricerca su Amazon mostra che ci sono molte discrete unità flash USB 3.0 da 16 GB per meno di $ 20 e anche alcune unità da 64 GB sotto $ 60.

Partiziona l'intera unità flash come spazio di swap, e avrai spazio di swap se ne hai bisogno, e tranquillità sapendo che la memoria che viene scritta ripetutamente è facilmente (ed economica) sostituibile.


3
+1 per non passare a SSD, -1 per passare a un componente che ha una durata molto breve se usato in questo modo.
Aviator45003,

1
@TC ha ragione, ArmanX: se stai cercando di evitare l'uso del flash (SSD), perché dovresti usare il flash su USB? È irrazionale.
Warren,

2
@TC: non utilizzare SSD per lo scambio a causa dell'usura del supporto è una leggenda urbana ingiustificata. Lo scambio non avviene "sempre", ma raramente. Inoltre, questo è qualcosa che è stato ampiamente studiato su Microsoft dopo il rilascio di Win7 con il risultato che i tipici modelli di accesso allo scambio sono abbastanza accettabili per SSD (che è Windows, non Ubuntu, ma è probabile che Linux non funzioni molto peggio). Hai centinaia (o migliaia) volte di più operazioni di scrittura che consumano il tuo SSD a causa di file di log stupidi che nessuno sta mai leggendo (di solito sincronizzando ogni riga).
Damon,

La logica è imperfetta: se la levetta è davvero veloce come SSD, perché è più economica?
Agent_L

È un equilibrio. Da un lato, è una buona idea avere un file di scambio. D'altra parte, se un file di scambio consuma un SSD (il che, hai ragione, probabilmente non avrà importanza), sarebbe meglio usare un sostituto economico - e un'unità flash per $ 20 è molto meglio di un SSD per oltre $ 100.
ArmanX,

1

Starai bene anche con 1GiB (e probabilmente meno) di swap. Il mio computer di lavoro in genere non utilizza più di 140-150 MiB. Un gigabyte è un eccesso di provisioning per questo.
A meno che non si eseguano attività di calcolo che richiedono insiemi di dati in centinaia di gigabyte e (questo è importante!) Si accede ai dati in modo più o meno di accesso una volta, non si vorrà mai avere uno scambio molto più grande di quello. Ma ancora una volta, la semplice mappatura della memoria di un file di dati funziona altrettanto bene per quell'applicazione.

Ma più scambio aiuta di più, giusto? Più di tutto è sempre meglio!

Considera la differenza che uno scambio di, diciamo, 16GiB farà (o pensa a 64GiB). Se non usi mai questi 16GiB, non potresti nemmeno averli messi da parte in primo luogo. Ma se li usi, cosa succede? Il disco, rispetto alla memoria principale, è estremamente lento. Anche con un SSD SATA-600, il trasferimento di 16GiB richiede tra 30 e 40 secondi e 2-4 volte più lungo in alcune altre configurazioni.
Ora qualcuno si opporrà inevitabilmente al fatto che si sta effettuando il paging in entrata e in uscita di una dozzina di pagine da 4 kB, non di 16 Gb in una volta sola. Sebbene ciò sia vero, il punto resta valido. Se hai solo bisogno di scambiare dentro e fuori un paio di pagine, non hai bisogno di 16GiB di scambio, ma se hai bisogno di 16GiB di scambio, anche tu li trasferirai (in un modo o nell'altro).

In teoria, il 99,9% di tutti gli utenti potrebbe persino utilizzare una macchina da 64GiB (o qualsiasi macchina da 8 + GiB) senza alcuno scambio, e molto probabilmente non si accorgerà mai della mancanza di qualcosa. Tuttavia, questo non è consigliabile.
Innanzitutto, non è ottimale perché il sistema operativo ha meno opzioni in ciò che può scartare quando esaurisce la memoria fisica. Ci sono due cose che può fare: scambiare qualcosa che non viene utilizzato o buttare via le pagine dalla cache del buffer. Se non hai swap, c'è solo una cosa che può fare. Eliminare le pagine dalla cache del buffer è innocuo, ma può influire notevolmente sulle prestazioni.
In secondo luogo, le mappature anonime private potrebbero semplicemente fallire se non c'è scambio. Questo di solito non accadrà, ma alla fine quando non c'è abbastanza memoria fisica disponibile per soddisfarli tutti, e non c'è scambio, il sistema operativo ha solo questa scelta, tranne ...
Terzo, il temuto killer OOM potrebbe dare il via Ciò significa che un processo più o meno casuale viene ucciso. No grazie. Non è qualcosa che vuoi che accada.

Detto questo, consigli come la necessità di uno scambio X volte la quantità di RAM installata provengono da persone che ripetono qualcosa che hanno sentito (e non hanno capito!) Da qualcuno che ha ripetuto qualcosa che hanno sentito (e non hanno capito!) Decenni fa.
La regola "usa 2 volte la tua RAM" è stata una regola empirica facile da ricordare negli anni '80 e '90, non è mai stata la "verità d'oro" (solo qualcosa che ha funzionato bene per la maggior parte degli utenti) e non si applica affatto al giorno d'oggi .

Dovresti avere una quantità ragionevole di swap che puoi facilmente permetterti (diciamo, un gigabyte), quindi il sistema operativo può scovare alcune cose vecchie e quindi il mondo non finisce immediatamente quando chiedi una volta un po 'più di memoria. Ma questo è tutto.

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.