Quando lo swap viene riportato nella memoria fisica?


8

Quando lo swap viene riportato nella memoria fisica in Linux? È solo su richiesta, cioè. quando è necessario? O lo swap viene trasferito lentamente nella memoria fisica quando il computer non è in fase di caricamento elevato?

Risposte:


7

Su richiesta. In effetti, Linux trasferirà lentamente la memoria fisica allo scambio quando è inattivo (vedere: "scambio").


Grazie. Una breve risposta sintetica. Mi piace (anche se apprezzo lo sforzo di tutti gli altri nelle loro risposte)!
Ztyx,

Questa risposta è sbagliata La domanda è quando la memoria è paginata, non paginata. Questo è l'opposto. In caso di errore di pagina, il kernel ricaricherà la pagina dal disco / scambio. Quindi principalmente su richiesta. È possibile accedere a tutta la memoria virtuale di un processo per attivare errori di pagina. Di conseguenza, le pagine verrebbero copiate nuovamente nella RAM.
user228505

7

Durante il normale funzionamento i dati da swap vengono caricati in memoria su richiesta, come altri hanno risposto, ma c'è un altro caso in cui ciò accade: è quando lo spazio di swap è disabilitato, a condizione che vi sia memoria fisica sufficiente per caricare l'intero contenuto di swap.

Basta fare:

swapoff -a

... e tutti i tuoi dati di swap "torneranno" in memoria. L'effetto collaterale è che i buffer / cache del disco possono essere svuotati.

A volte può essere desiderabile farlo swapoff -a ; swapon -a, ad esempio dopo un processo di perdita della memoria difettoso, prima di un arresto anomalo, che ha spazzato via processi più importanti - per assicurarsi che qualsiasi processo in esecuzione nel sistema sia caricato in memoria e non attenda lo scambio in pochi minuti.


Oh, impari qualcosa di buono ogni giorno! A proposito, Swapoff -a´ fallirà non c'è abbastanza memoria fisica? Esiste un rischio nel chiamare swapoff?
Ztyx,

Fallirà se non c'è abbastanza memoria fisica. Questo è ancora un rischio swapoffche non fallirà, ma il sistema esaurirà la memoria subito dopo swapoffl'OOM e ucciderà il processo casuale (nel peggiore dei casi la shell sta per chiamare swapono il swaponcomando). In pratica è molto improbabile: molta memoria viene utilizzata dalle cache prima che swapoffvenga chiamata, quindi dovrebbe essere sufficiente RAM per l'esecuzione di entrambi i comandi.
Jacek Konieczny,

7

Come altri hanno sottolineato, le pagine verranno copiate nuovamente nella RAM solo quando necessario (su richiesta) invece di occupare la RAM che potrebbe essere meglio lasciare disponibile per cache / buffer.

Il fatto che le pagine vengano copiate nuovamente nella RAM, non spostate, è importante e può creare confusione se non si è consapevoli di ciò. La pagina non verrà deallocata da swap a meno che non sia più necessaria (ovvero la pagina sia completamente deallocata), venga modificata nella RAM (quindi la copia in swap non è più corretta) o lo swap sta per esaurirsi (e il -disk blocchi sono necessari per scambiare alcune altre pagine). In questo modo se in futuro la pagina deve essere nuovamente sostituita, non è necessaria la scrittura su disco poiché il kernel sa che esiste già una buona copia su disco - questo può ridurre notevolmente il "thrashing" quando la RAM disponibile diventa molto bassa ma lo spazio di swap non è anche congestionato.

Puoi vedere quante pagine sono attualmente presenti sia in RAM che in swap cat /proc/meminfo: la SwapCachedlinea è la quantità di dati presenti nelle pagine che sono attualmente sia nella RAM che sul disco. Se ritieni che lo swap corrente lo usi più del previsto, controlla il valore di SwapCached in quanto ciò potrebbe spiegare la discrepanza.


In precedenza sono state discusse questioni simili. Tuttavia, non questa domanda specifica. Vedi anche serverfault.com/questions/100448/… che si occupa di SwapCached.
Ztyx,

Non ricordo nemmeno di aver scritto quella risposta ... Probabilmente avrei potuto semplicemente collegarmi (o copiare + incollarlo) invece di digitare quanto sopra ...
David Spillett,

0

Questo è in genere legato all'hardware che stai utilizzando. Sulla maggior parte dell'hardware (incluso Intel) l' MMU controlla l'intero processo.

Quando un programma alloca memoria, la richiederà alla MMU e recupererà un indirizzo virtuale. A sua volta, la MMU registrerà quella pagina come "in uso" nella mappa dello spazio degli indirizzi globale.

Quando il programma accede effettivamente a quello spazio di memoria, la MMU cercherà la pagina nella mappa degli indirizzi. Se quella pagina è nella memoria "live", invierà un puntatore "live" al sistema operativo che gestirà la lettura / scrittura della memoria per conto del programma. Se la memoria non è attualmente allocata, attiverà un errore di pagina. Questa eccezione del processore viene quindi catturata dal sistema operativo che è quindi responsabile di capire dove si trovano i dati nel file di scambio, caricarli nella memoria fisica e restituire la pagina alla MMU in modo che il processo iniziale possa continuare.

Ciò significa che, a meno che non si acceda alla pagina di memoria, non tornerà mai più nella memoria "attiva" dopo essere stata scambiata. Ecco perché di solito esiste un'API del sistema operativo che consente ai programmi di specificare che un determinato blocco di memoria NON deve essere scambiato su disco e deve essere tenuto in memoria (non conosco Linux, ma in Windows è la funzione VirtualLock) .


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.