perché viene utilizzato parte del mio spazio di swap, quando ho ancora RAM inutilizzata?


9

Più di una curiosità che di un problema; e, lo ammetto, qualcosa di una domanda imbarazzantemente di base:

Ho notato che in molte occasioni, sulla mia macchina Linux avrò ~ 500 MB di spazio di swap in uso, anche se ho ~ 600 MB di RAM inutilizzata.

La mia ingenua comprensione di alto livello era che lo spazio di swap non inizia fino a quando la RAM non si esaurisce.

Sono andato oltre e ho ipotizzato che questa situazione dovesse essere il funzionamento del kernel Linux, poiché un processo utente che richiede memoria, lo fa solo logicamente e non ha idea del fatto che tale memoria sia fisicamente supportata dalla RAM o dallo spazio di swap.

Il che porta alla domanda: perché il kernel dovrebbe usare preventivamente lo spazio di swap? Fa parte di un algoritmo di ottimizzazione delle prestazioni? Sta sostituendo parti della memoria del disco che ritiene meno probabile accedervi (uno schema LRU, forse)? Se è così, non avrebbe senso lasciare tutto nella RAM, e solo quando si avvicina l'esaurimento, quindi e solo allora scambiare le porzioni LRU dalla RAM nello spazio di scambio?

Dovrei chiarire, il mio server Linux ha 2 GB di RAM e 2 GB di spazio di swap.


1
perché i 4 voti per chiudere questa domanda?

2
@Aaron: Non è che tu abbia una brutta domanda. L'hai appena definito in termini di gestione del sistema in modo che si adatti meglio con utenti esperti o amministratori di server. Che ti chieda come una curiosità sembra più un POV per utenti esperti.

Risposte:


11

La parte inutilizzata della RAM viene infatti utilizzata come cache HDD. Se ci pensate, in realtà leggete più spesso parti del vostro disco che accedete ad alcune parti della RAM. Il che ha senso mettere questa RAM sul disco, mentre si usa la RAM per memorizzare nella cache i dati dell'HDD.


7

Ha senso scambiare le cose in anticipo poiché quando hai davvero bisogno della memoria, non dovrai aspettare fino a quando il kernel avrà terminato l'accesso al disco.

Ad esempio, supponiamo che tu voglia aprire un'immagine di grandi dimensioni. Quando l'immagine viene caricata, sono necessari 300 MB di RAM. Se il kernel utilizza tutta la RAM possibile, il caricamento dell'immagine richiede che il kernel trasferisca 200 MB dalla RAM al disco. Se svuotava preventivamente la RAM in anticipo, si risparmia qualche millisecondo.


7

2 motivi:

  1. (@dtrosset) Linux scambia bit di programmi inutilizzati per fornire più cache e buffer.
  2. Potresti aver usato più memoria in passato e aver scambiato alcune cose, e non è stato scambiato perché non è stato usato, anche se qualsiasi cosa lo abbia forzato ora è andato.

1

Oltre alle altre risposte, è possibile configurare Linux per richiedere il backup di qualsiasi memoria allocata, anche se i programmi non la utilizzano.

Tuttavia, il sovraccarico della memoria e il timore del killer OOM non sono parti necessarie dell'esperienza Linux. Semplicemente impostando il parametro sysctl vm / overcommit_memory su 2 si disattiva il comportamento di overcommit e si tiene a bada il killer OOM per sempre. La maggior parte dei sistemi moderni dovrebbe avere spazio su disco sufficiente per fornire un ampio file di scambio per la maggior parte delle situazioni. Piuttosto che cercare di evitare che i processi degli animali domestici vengano uccisi quando la memoria sovraccarica si esaurisce, potrebbe essere più semplice evitare completamente la situazione. [ Respiro dal killer OOM ]

Se un programma alloca memoria, il kernel può semplicemente contrassegnare più pagine di scambio come impegnate. Questa indicazione è memorizzata nel gestore della memoria del kernel, lo spazio su disco effettivo non è stato ancora toccato. Fino a quando quella memoria non viene utilizzata, nulla deve essere scambiato dentro e fuori. Se non vengono mai utilizzati, l'utilizzo degli swap fluttuerà senza influire sulle prestazioni.

Poiché i processi sono presentati con il loro spazio di indirizzi o "view" (questo è il modo in cui lo swap funziona in primo luogo), il kernel ha molta libertà nel modo in cui lo gestisce. Utilizzando un esempio fork anche dall'articolo collegato sopra, poiché è molto più probabile che abbia pagine di memoria condivise rispetto ad allocare di recente una grande quantità di memoria inutilizzata, la memoria può essere allocata copia su scrittura, aumentando il conteggio degli usi di swap. Quando viene effettivamente scritto (che potrebbe non accadere), è possibile sostituire "commit swap" con qualsiasi RAM inutilizzata (aumentando quindi l'utilizzo della RAM e diminuendo l'uso dello swap). Immagina un processo con 500 MB allocati che eseguono il fork su una macchina con tutta o quasi tutta la RAM in uso. Se ci sono 500 MB disponibili in swap (e lo spazio su disco è economico, quanto è grande l'1% delle unità TB di oggi?: P), non è necessario copiare memoria (ancora,

In tal modo si evita la possibilità del killer OOM, ed è molto più semplice progettare la maggior parte dei software partendo dal presupposto che le allocazioni di memoria (incluse allocazioni "implicite" attraverso qualcosa come fork) o abbiano successo o falliscano immediatamente, con la realizzazione pratica che se la memoria deve essere scambiato quindi potrebbe influire sulle prestazioni. Tale impatto è quasi sempre lieve, ma nel peggiore dei casi porta al blocco dello swap (a volte preferibile comunque a un crash del kernel o un killer OOM).

Sebbene non conosca i dettagli esatti di come funziona il gestore della memoria Linux, questa risposta è la mia comprensione generalizzata e ciò che ricordo di aver letto negli anni. Ho provato a modificare nuovamente questa risposta, quindi è necessaria una comprensione minima della progettazione del sistema operativo (è considerevolmente complessa e non qualcosa che mi interessa terribilmente), ma sembra vagare un po '; per favore fatemi sapere se vedete come potrebbe essere migliorato. D'altra parte, potrebbe non essere una domanda così imbarazzante.

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.