Come viene segnalato l'utilizzo della memoria in Linux?


17

Usando ps, posso vedere la dimensione, il vsize (lo stesso di VIRT di top?) E l'rss (lo stesso di RES di top?). (Un altro che vedo in cima è SHR.)

Qualcuno potrebbe riassumere per me cosa significano questi diversi campi?


Preferirei vedere un bel riassunto in questa pagina piuttosto che un link che potrebbe scomparire in modo che questa pagina possa vivere come riferimento.
Jim Hunziker,

Risposte:


34

In breve:

  • Dimensione virtuale: è la quantità di spazio degli indirizzi gestita da un processo. Lo spazio di indirizzi virtuali contiene tutto ciò a cui il processo può accedere tramite puntatori (riferimenti di indirizzi di memoria). Ad esempio, se il programma accede al framebuffer della scheda video, tale memoria viene mappata allo spazio virtuale di processo e riceve un indirizzo memorizzato in un puntatore. Anche i file mappati in memoria e i mapping anonimi vengono calcolati nella dimensione dello spazio degli indirizzi virtuali. Praticamente tutto è nella dimensione virtuale. Se si somma la dimensione di tutti gli intervalli di indirizzi elencati in /proc/<pid>/maps, dovrebbe restituire all'incirca lo stesso valore della dimensione virtuale.

  • Dimensione residente: è la quantità di memoria che appartiene specificamente a quel processo che è attualmente residente in memoria. Ciò significa che la quantità di memoria che non è in scambio. Si noti che alcune parti del processo possono essere nella memoria di scambio anche quando il processo è in esecuzione. Il sistema operativo estrarrà queste aree dallo scambio quando il processo tenta di accedervi. Ciò dovrebbe includere l'heap, le pile di tutti i thread e altri mapping privati. Se si guarda /proc/<pid>/maps, i [stack], [heap]e le altre mappature anonimi (senza quei percorsi di file) sono o scambiati o contabilizzati nella dimensione residente.

  • Dimensione condivisa: è la quantità di memoria che può appartenere a più processi. Ad esempio, se hai quattro istanze della stessa applicazione caricate in memoria, avrai quattro istanze dell'heap e almeno quattro stack, una per ogni processo (questa è la memoria residente), ma avrai solo un'istanza di il codice binario del programma e delle sue librerie. Questo è lo spazio condiviso. Non solo include il codice binario del programma e le sue librerie, ma anche i file di localizzazione, i dati del programma di sola lettura, i segmenti di memoria condivisa SysV e POSIX, i semafori, ecc ... Se guardi dentro /proc/<pid>/maps, la maggior parte dei mapping associati alla libreria e ai file di programma sono condivisa.

Nota che VIRT contiene l'unione di RSS e SHR e sarà sempre maggiore di ognuna di esse. Ci possono essere regioni considerate sia RSS che SHR.


2
Per inciso, nelle recenti versioni di Linux è possibile vedere una suddivisione molto dettagliata dell'utilizzo della memoria in / proc / <pid> / smaps
bdonlan

1
La dimensione condivisa è la memoria che può essere condivisa. Se un'applicazione è l'unico utente della libreria, la libreria verrà mantenuta in memoria per singolo processo. In questo modo anche la memoria condivisa può essere memoria "di proprietà del processo".
Hubert Kario,

6

A Juliano rispondi:

Nota che RSS + SHR <= VIRT, sempre.

Questo è solo falso. SHR contiene tutta la memoria virtuale che potrebbe essere condivisa con altri processi e RSS contiene tutta la memoria fisicamente nella RAM utilizzata dal processo.

Pertanto, tutta la memoria condivisa attualmente nella RAM viene conteggiata sia in SHR che in RSS, quindi SHR + RSS non ha alcun significato poiché può contenere conteggi duplicati.

Per costruire un processo con RSS + SHR> VIRT, basta mmap un file di grandi dimensioni (1 GB), quindi leggerlo completamente: il file mmaped verrà caricato in RAM e VIRT, SHR e RSS saranno leggermente più grandi di 1 GB, quindi SHR + RSS> VIRT.


Sì, era più una dichiarazione su VIRT rispetto alle altre due. Quello che avevo in mente era più sull'unione di RSS e SHR che sulla loro somma, cioè VIRT contiene sia RSS che SHR. Scarsa rappresentazione matematica.
Juliano,
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.