¿Cómo se mide la huella de memoria de un conjunto de procesos bifurcados?

8

Digamos que tengo un proceso que usa 200 MB de memoria, y se bifurca () s:

python -c "import os; data='x'*200000000; os.fork(); raw_input()"

Programas como 'top' mostrarán cada proceso con 200 MB, con muy poca memoria SHRd, por lo que parece que los procesos están usando 400 MB en total. Sin embargo, debido a que fork () implementa copy-on-write (COW) para las páginas de memoria del proceso, la realidad es que los procesos solo usan 200 MB en total.

¿Por qué la parte superior no muestra qué fracción de la memoria es VACA? ¿Hay alguna manera de hacerlo? ¿O hay otro comando que puedo usar en su lugar?

Nota: 'top' en OSX parece tener una columna RSHRD que hace lo que esperaba. Mi pregunta es para Linux.

Dustin Boswell
fuente

Respuestas:

5

Puede obtener ese tipo de información del /proc/<pid>/smapsarchivo para cada proceso en la forma de la Pssentrada (abreviatura de "Tamaño de participación proporcional").

En el ejemplo anterior con 200 MB "compartidos" entre dos procesos, cada proceso mostraría 100 MB en la entrada de PSS para ese mapeo, es decir, la memoria se distribuye uniformemente entre los procesos que la comparten (hasta que cualquiera de los procesos la copie y no la comparta).

Aquí hay un extracto de ejecutar algo como lo que publicaste:

$ top
...
30986 me        20   0  790m 769m 2200 S    0  4.8   0:00.48 python3.2
30987 me        20   0  790m 767m  224 S    0  4.8   0:00.00 python3.2
$ cat /proc/30986/smaps
...
0119a000-015b7000 rw-p 00000000 00:00 0                                  [heap]
Size:               4212 kB
Rss:                3924 kB
Pss:                1992 kB
...
7fa06b020000-7fa09ab11000 rw-p 00000000 00:00 0 
Size:             781252 kB
Rss:              781252 kB
Pss:              390626 kB
...
7fff8e45a000-7fff8e489000 rw-p 00000000 00:00 0                          [stack]
Size:                192 kB
Rss:                 160 kB
Pss:                  82 kB
...

(Hay una gran cantidad de cosas en esos archivos, incluidas las asignaciones para bibliotecas compartidas que potencialmente se comparten entre muchos procesos y, por lo tanto, cada proceso solo cuenta una pequeña parte en su entrada de PSS).

Aquí hay un buen artículo sobre esto: ELC: ¿Cuánta memoria están usando realmente las aplicaciones?

No conozco una herramienta común para mostrar esta información, y psdesafortunadamente no creo que tenga opciones para mostrarla. El artículo apunta a un repositorio con scripts de python llamados pagemappor Matt Mackall que puedes usar o adaptar.

Plug desvergonzado: encontrará algunas publicaciones en Unix y Linux sobre PSS y el smapsarchivo si está interesado en eso.

Estera
fuente