Comprensione dell'utilizzo della memoria virtuale> swap + fisico su Linux


9

Ho un processo che riporta in "top" che ha 6 GB di memoria residente e 70 GB di memoria virtuale allocata. La cosa strana è che questo particolare server ha solo 8 GB fisici e 35 GB di spazio di swap disponibili.

Dal manuale "top":

   o: VIRT  --  Virtual Image (kb)
      The total amount of virtual memory used by the  task.   It  includes
      all  code,  data  and  shared  libraries  plus  pages that have been
      swapped out. (Note: you can define the STATSIZE=1 environment  vari-
      able  and  the VIRT will be calculated from the /proc/#/state VmSize
      field.)

      VIRT = SWAP + RES.

Data questa spiegazione, mi aspetterei che l'allocazione della memoria virutale per un processo sia limitata al mio scambio + memoria fisica disponibile.

Secondo 'pmap', il codice, la libreria condivisa e le sezioni di memoria condivisa di questo processo sono tutte minime - non più di 300 M circa.

Ovviamente, la macchina e il processo continuano a funzionare correttamente (anche se lentamente), quindi cosa mi manca qui?

Risposte:


9

Potrebbe essere richiesta una memoria pari a zero che non si trova nella RAM fisica o nel file di paging.

Alcune risorse che potresti voler consultare:

La tua applicazione crea molte pagine di memoria vuote? In tal caso, l'applicazione potrebbe trarre grandi vantaggi da:

Ti consente di comprimere e decomprimere in pagine di memoria in tempo reale. A sua volta, sei in grado di mantenere tutto nella RAM piuttosto che scambiare su disco ( molto lento ).


Sì, l'applicazione sta facendo molte correlazioni nello spazio IPV4, quindi potrebbe potenzialmente avere molte pagine vuote a seconda della distribuzione del traffico. Dovremo fare attenzione a quello. Grazie!
Belly,

felice di aiutare, spero che qualche altro utente mi segnerà. Mi vengono in mente risposte killer ma ho una valutazione di 1.266 :-(. Non credo che gli utenti con errori del server come me hahhah
The Unix Janitor

1
Pochi motivi per cui le persone potrebbero non votare per te: 1. Formattazione della tua risposta --- usa il markup. 2. Il tuo nome utente sembra generico. 3. Soprattutto: il fatto che lo trovi abbastanza importante per commentarlo. Lascia un sapore aspro in bocca alle persone.
Belmin Fernandez,

@ user37899 Le valutazioni tendono a rientrare in 3 categorie: quanto è istruttiva la risposta, quanto è ben formattata e facile da leggere e quanto è popolare la domanda. Lavorerei sulla tua formattazione, ma devi anche avere un po 'di zen e rendermi conto che alcune risposte fantastiche siedono intorno al sito con un solo voto: la popolarità di una domanda è il fattore con il maggior effetto.
Jeff Ferland,

1
Ho fatto un po 'di formattazione. Spero che aiuti eh.
Belmin Fernandez,

2

Ecco una discussione di virt vs. memoria residente:

/programming/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used

La discussione si riferisce ai processi Java, ma è applicabile a tutto ciò che funziona sotto Linux. Il punto principale per quanto riguarda virt è che il totale include un sacco di cose che non possono mai essere usate. La Virt è qualcosa da considerare per i sistemi operativi a 32 bit (poiché i processi colpiranno i limiti dello spazio indirizzabile), ma per il resto non è molto utile. Come notato, la cosa a cui prestare attenzione è la memoria residente, che sarà limitata alla RAM fisica disponibile e allo swap.


in realtà chiese perché la memoria virtuale allocata fosse più grande della sua memoria fisica + spazio di swap ..
The Unix Janitor

Sì, e la discussione in StackOverflow parla di come sia possibile.
cjc,

1

Ciò è probabilmente dovuto al fatto che lo spazio degli indirizzi del processo ha le dimensioni indicate, ma non è realmente assegnato dal sistema operativo.

Da: http://lwn.net/Articles/428100/

Nel tentativo di raggiungere l'obiettivo di "sovraccarico abbastanza basso e nessuna latenza significativa", gli sviluppatori Go hanno formulato alcune ipotesi semplificanti, una delle quali è che la memoria gestita per un'applicazione in esecuzione proviene da un singolo, praticamente contiguo intervallo di indirizzi. Tali ipotesi possono incorrere nello stesso problema che il tuo editor ha riscontrato con vi - un altro codice può allocare pezzi nel mezzo dell'intervallo - quindi gli sviluppatori Go hanno adottato la stessa soluzione: semplicemente allocano tutta la memoria di cui pensano di aver bisogno (hanno pensato, ragionevolmente, che 16 GB dovrebbero essere sufficienti su un sistema a 64 bit) all'avvio.

Quindi questo è il modo in cui non viene eseguita la gestione della memoria a volte - avere uno spazio di indirizzi continuo semplifica il rilascio di mem inutilizzate.


0

La risposta è probabilmente MMAP: i dati si trovano sul disco, ma sono "esterni" allo scambio e non possono essere visti con il comando "libero" o "in alto".

Se il processo java non è troppo complicato, puoi provare a giocare con "lsof" per trovare dove si trova il file MMAP. Tuttavia, se questo processo Java è complicato, sarà difficile vederlo.


-1

Sono stato anche sorpreso dal fatto che Linux ti permetta di allocare più memoria virtuale rispetto alla memoria fisica + spazio di scambio, ma apparentemente aiuta le prestazioni in situazioni tipiche.

Fortunatamente, esiste un parametro di ottimizzazione del kernel che può essere utilizzato per cambiare la modalità di contabilità della memoria. Questo parametro è vm.overcommit_memory e indica quale algoritmo viene utilizzato per tenere traccia della memoria disponibile. L'impostazione predefinita (0) utilizza il metodo euristico e esegue il commit eccessivo del sistema di memoria virtuale. Se vuoi che i tuoi programmi ricevano errori di memoria insufficiente nell'allocazione invece di sottoporre i tuoi processi a omicidi casuali, dovresti impostare questo parametro su 2.

http://www.linuxjournal.com/article/10678


Questo è totalmente confuso. Il sovraccarico non è ciò che consente di allocare più memoria virtuale rispetto alla memoria fisica più lo spazio di scambio. Potresti farlo anche senza sovraccarico. (Ad esempio, su una macchina con 2 GB di RAM, senza scambio e senza sovraccarico, è ancora possibile mappare in memoria un file da 4 GB in sola lettura, utilizzando 4 GB di memoria virtuale.)
David Schwartz,
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.