2012-05-01 10 views
9

Analizzo i dati da /proc/[pid]/statm per ottenere informazioni sull'utilizzo della memoria di un determinato processo. man proc indica che formato residente (misurato in "pagine") è lo stesso di VmRSS (KB ??) in /proc/[pid]/status. Dal momento che hanno valori diversi, vorrei capire la connessione tra questi valori. C'è qualcosa come un fattore che posso leggere da qualche parte in /proc (ho pensato a VmPTE ma è il suo sth. Else ...)? Quale dei due dovrei analizzare per ottenere la dimensione della memoria utilizzata per un determinato processo?Come corrispondono le dimensioni del set VmRSS e residente?

#ex 1782 = firefox 

~$ cat /proc/1782/statm 
    224621 46703 9317 11 0 98637 0 
#   \--- resident set size 

~$ cat /proc/1782/status | grep Vm 
    VmPeak:  935584 kB 
    VmSize:  898484 kB 
    VmLck:   0 kB 
    VmHWM:  257608 kB 
    VmRSS:  186812 kB 
    VmData:  394328 kB 
    VmStk:   220 kB 
    VmExe:   44 kB 
    VmLib:  61544 kB 
    VmPTE:  1224 kB 
    VmSwap:   0 kB 

risposta

13

La mia comprensione è che VM è la quantità di memoria virtuale e RSS è quanto è residente in memoria. Così,

memoria virtuale = parte nella memoria fisica + parte sul disco

La parte nella memoria fisica è RSS. Quindi, VSS dovrebbe essere maggiore di RSS. Se sono quasi uguali, significa che il processo è comodamente seduto nella memoria. Se VSS è molto più grande, significa che non c'è abbastanza memoria e parti di esso devono essere scambiate su disco (ad esempio, a causa di un processo concorrente, ecc.).

Sul mio sistema, posso fare un "uomo proc" ed elenca i seguenti:

  * VmPeak: Peak virtual memory size. 

      * VmSize: Virtual memory size. 

      * VmLck: Locked memory size (see mlock(3)). 

      * VmHWM: Peak resident set size ("high water mark"). 

      * VmRSS: Resident set size. 

      * VmData, VmStk, VmExe: Size of data, stack, and text segments. 

Se si desidera segnalare l'utilizzo della memoria di picco, allora probabilmente vuole la memoria virtuale, che si presenta come VmPeak .

Spero che questo aiuti!

+0

non so dove trovare il valore dal proc, ma penso che la mia pagesize è 4 KB. Sono stato confuso da VmPTE. Sembra essere piuttosto la "dimensione della parte [pid] della tabella della pagina", quindi la "dimensione di una voce del buffer" :) – lupz

+0

Sì, molti di questi valori dipendono dal sistema. In alcuni sistemi con cui ho lavorato, alcuni di questi valori danno sempre uno 0 perché il supporto non è stato compilato nel kernel. Quindi sì, non credere a quello che dicono le mie pagine man perché potrebbero non essere rilevanti per il tuo sistema. – Ray

+2

In realtà, memoria virtuale = parte in RAM + parte su disco + spazio di indirizzamento virtuale non mappato alla memoria fisica + file mappati in memoria + memoria condivisa. Quindi per misurare il consumo di memoria, VmSize è piuttosto inutile. Vedere la prima risposta a http://stackoverflow.com/questions/13308684/increase-of-virtual-memory-without-increse-of-vmsize – vcarel

23

Il valore RSS di /proc/<pid>/stat è il numero di pagine, mentre il valore VmRSS di /proc/<pid>/status è in kB.

Nel vostro caso, 46703 * 4kB (formato pagina) = 186812 kB.

+2

@lupz, si consideri la convalida di questa risposta che sembra corretta. come documentato nella manpage [proc (5)] (http://linux.die.net/man/5/proc). –

4

pagina man per proc stati seguendo statm contesto

/proc/[pid]/statm 
Provides information about memory usage, measured in pages. The columns are: 

    size  (1) total program size 
      (same as VmSize in /proc/[pid]/status) 
    resident (2) resident set size 
      (same as VmRSS in /proc/[pid]/status) 
    share  (3) shared pages (i.e., backed by a file) 
    text  (4) text (code) 
    lib  (5) library (unused in Linux 2.6) 
    data  (6) data + stack 
    dt   (7) dirty pages (unused in Linux 2.6) 

Ma ciò che non riesce a precisare è che size e resident sono espressi in numero di pagine.

~$ cat /proc/1782/statm 
    224621 46703 9317 11 0 98637 0 
#   \--- resident set size 

Così, 46703 è resident set size espressa in numero di pagine e 224621 è virtuale Dimensione memoria espressa in numero di pagine.

Ora per ottenerli in KB moltiplicarli con Dimensioni pagina. È possibile ottenere Dimensioni pagina con il comando getconf PAGESIZE o nel programma C/C++ chiamando sysconf(_SC_PAGE_SIZE) (definito in unistd.h). Questo ti darà la dimensione della pagina in byte. Dividilo con 1024 per ottenere le dimensioni della pagina in KB.

Esempio:

$getconf PAGESIZE 
4096 

4096/1024 = 4 KB

Così, dimensione dell'insieme residente in KB è 46703 x 4 = 186812 kB (VmRSS).
dimensioni del programma totale in KB 224621 è x 4 = 898484 kB (VmSize)