perché è stato utilizzato un po 'del mio spazio di swap, quando ho ancora RAM inutilizzata?

Più di una curiosità che di un problema; e, ammetto, qualcosa di imbarazzante questione fondamentale:

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

La mia comprensione ingenuo di alto livello era che lo spazio di scambio non entra in gioco finché la RAM non è esaurita.

Sono andato oltre e ho fatto l'ipotesi che questa situazione debba essere il fare del kernel Linux, perché un process utente che richiede la memory, lo fa solo logicamente e non ha idea di se la memory sia supportta fisicamente dalla RAM o dallo spazio di swap.

Quale port alla domanda, perché il kernel utilizzerebbe prevalentemente lo spazio di swap? È questa parte di qualche algorithm di sintonizzazione delle performance? Sta scambiandosi a parti di memory di memory che ritiene less accessibile (forse un programma LRU)? Se è così, non avrebbe senso lasciare tutto in RAM e solo quando si avvicina all'esaurimento, allora e solo allora scambia le porzioni di LRU dalla RAM allo spazio di swap?

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

La parte inutilizzata della RAM è in realtà utilizzata come cache HDD. Se ne pensi, leggerai di frequente parti del disco più spesso che accedi ad alcune parti della RAM. Che ha senso mettere questa RAM sul disco, mentre si utilizza la RAM per memorizzare i dati HDD.

Ha senso scambiare le cose in anticipo poiché quando hai veramente bisogno della memory, non dovrai aspettare che il kernel sia fatto con l'accesso al disco.

Ad esempio, diciamo che si desidera aprire un'image di grandi size. Quando l'image viene caricata, richiede 300MB di RAM. Se il kernel utilizza tutta la RAM ansible, caricare l'image richiede che il kernel trasferisca 200MB dalla RAM al disco. Se in precedenza pro-active ha svuotato la RAM, risparmiate alcuni millisecondi.

2 motivi:

  1. (@dtrosset) Linux sostituirà bit inutilizzati di programmi per dare più cache e buffer.
  2. Potresti aver usato più memory in passato e aver scambiato alcune cose, e non è stato scambiato perché non è stato utilizzato, anche se ciò che lo ha costretto è andato via.

Oltre alle altre risposte, è ansible configurare Linux per richiedere il backup di qualsiasi memory assegnata, anche se i programmi non lo utilizzano.

La sovrapposizione della memory e la paura del killer OOM non sono però necessarie parte dell'esperienza Linux. Impostare semplicemente il parametro sysctl vm / overcommit_memory a 2 distriggers il comportmento di sovrapposizione e mantiene sempre il killer OOM. La maggior parte dei sisthemes moderni dovrebbero avere spazio su disco sufficiente per fornire un ampio file di scambio per la maggior parte delle situazioni. Piuttosto che cercare di mantenere i processi di animale da uccidere quando la memory overcommitted si esaurisce, potrebbe essere più semplice solo per evitare la situazione del tutto. [ Respite dal killer OOM ]

Se un programma assegna memory, il kernel può semplicemente contrassegnare più pagine di swap come impegnate. Questa indicazione è memorizzata nel gestore di memory del kernel, lo spazio del disco effettivo non è ancora toccato. Fino a quando questa memory non viene utilizzata, nulla deve effettivamente essere scambiato dentro e fuori. Se non vengono mai utilizzati, l'utilizzo di swap fluttua senza influenzare le performance.

Poiché i processi vengono presentati con il proprio spazio di indirizzi o "vista" (questo è il modo in cui funziona lo swap in primo luogo), il kernel ha un sacco di margini di manovra in come gestisce. Utilizzando un esempio di fork anche dall'articolo collegato in precedenza, dato che è molto più probabile che abbia pagine di memory condivise di quanto non sia quello di allocare nuovamente una grande quantità di memory inutilizzata, la memory può essere assegnata a copia su scrittura, aumentando il count dell'uso di swap. Quando è effettivamente scritto (che potrebbe non accadere), allora che "swap commesso" può essere sostituito con qualsiasi RAM inutilizzata (quindi aumentando l'uso della RAM e l'uso di scambio decrescente). Immagina un process con 500 MB assegnato che forche su una macchina con tutte o quasi tutte le RAM in uso. Se ci sono 500MB disponibili in swap (e lo spazio su disco è poco costoso, quanto è l'1% degli attuali drive TB?: P), nessuna memory deve essere copiata (ancora e forse mai), ma il kernel può garantire tali allocazioni "successo" e continuare a utilizzare le pagine di memory condivise per il più a lungo ansible.

Così si evita la possibilità del killer OOM e è molto più semplice progettare il maggior numero di software con l'ipotesi che le allocazioni di memory (comprese le allocazioni "implicite" attraverso qualcosa di simile alla fork) siano successe o falliscono immediatamente, con la realizzazione pratica che se la memory deve essere scambiati allora potrebbe influenzare le performance. Quell'impatto è quasi sempre leggero, ma nel peggiore dei casi port a scambiare la scossa (ancora a volte preferibile ad un crash completo del kernel o al killer OOM).

Anche se non so i dettagli esatti di come funziona il gestore di memory di Linux, questa risposta è la mia comprensione generalizzata e quello che ricordo di aver letto nel corso degli anni. Ho cercato di riformattare questa risposta, quindi è necessaria una comprensione minimale del design del sistema operativo (è notevolmente complessa e non qualcosa che mi interessa molto), ma sembra un po 'scomodo; per favore fathemes sapere se si vede come potrebbe essere migliorata. Sulla mano di presa, potrebbe non essere una questione di imbarazzo.