2012-05-01 15 views
9

Analizo datos de /proc/[pid]/statm para tener una idea sobre el uso de memoria de un proceso determinado. man proc indica que residente establece el tamaño (medido en 'páginas') es el mismo que VmRSS (KB ??) en /proc/[pid]/status. Como tienen valores diferentes, me gustaría entender la conexión entre estos valores. ¿Hay algo así como un factor que pueda leer en algún lugar en /proc (pensé en VmPTE pero es algo ...)? ¿Cuál de los dos debería analizar para obtener el tamaño de la memoria utilizada para un determinado proceso?¿Cómo coinciden VmRSS y el tamaño del conjunto 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 

Respuesta

13

Tengo entendido que VM es la cantidad de memoria virtual y RSS es la cantidad de memoria residente. Así,

memoria virtual = parte en la memoria física + parte en el disco

La parte en la memoria física es RSS. Entonces, VSS debería ser mayor que RSS. Si son casi iguales, significa que su proceso está cómodamente en la memoria. Si VSS es mucho más grande, eso significa que no hay suficiente memoria y partes de la misma deben intercambiarse al disco (es decir, debido a un proceso que compite, etc.).

En mi sistema, puedo hacer un "proc hombre" y se enumera lo siguiente:

  * 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. 

Si desea reportar el uso de memoria alta, entonces es probable que quieren la memoria virtual, que se parece a VmPeak .

Espero que esto ayude!

+0

no sé dónde obtener el valor de proc, pero creo que mi tamaño de página es de 4 KB. Estaba confundido por VmPTE. Parece ser más bien el 'tamaño de [pid] s parte de la tabla de páginas', luego el 'tamaño de una entrada de buffer' :) – lupz

+0

Sí, muchos de estos valores dependen del sistema. En algunos sistemas con los que he trabajado, algunos de esos valores siempre darán un 0 porque el soporte no se ha compilado en el kernel. Entonces, sí, no crea lo que dicen mis páginas man, ya que pueden no ser relevantes para su sistema. – Ray

+2

En realidad, memoria virtual = parte en RAM + parte en el disco + espacio de direcciones virtuales no asignado a la memoria física + memoria asignada archivos + memoria compartida. Entonces, para medir el consumo de memoria, VmSize es bastante inútil. Consulte la primera respuesta a http://stackoverflow.com/questions/13308684/increase-of-virtual-memory-without-increse-of-vmsize – vcarel

23

El valor de RSS de /proc/<pid>/stat es el número de páginas, mientras que el valor de VmRSS de /proc/<pid>/status está en kB.

En su caso, 46703 * 4kB (tamaño de página) = 186812 kB.

+2

@lupz, considere validar esta respuesta que parece correcta. como se documenta en la página de manual de [proc (5)] (http://linux.die.net/man/5/proc). –

4

página del manual para proc siguiente en estados statm contexto

/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) 

Pero lo que no puede afirmar es que size y resident se expresan en número de páginas.

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

Por lo tanto, es 46703 tamaño del conjunto residente expresada en número de páginas y 224621 es virtual Tamaño de la memoria expresada en número de páginas también.

Ahora, para obtenerlos en KB, multiplíquelos con Tamaño de página. Puede obtener Tamaño de página con el comando getconf PAGESIZE o en el programa C/C++ llamando al sysconf(_SC_PAGE_SIZE) (definido en unistd.h). Esto le dará el tamaño de página en bytes. Divídalo con 1024 para obtener el tamaño de página en KB.

Ejemplo:

$getconf PAGESIZE 
4096 

4096/1024 = 4 KB

Por lo tanto, residente tamaño del conjunto en KB es 46703 x 4 = 186812 kB (VmRSS).
tamaño total del programa en KB es 224621 x 4 = 898484 KB (VmSize)

Cuestiones relacionadas