
Digamos que tengo un proceso que usa 200 MB de memoria y se bifurca:
python -c "import os; data='x'*200000000; os.fork(); raw_input()"
Programas como 'top' mostrarán cada proceso usando 200 MB, con muy poca memoria SHRd, por lo que parece como si los procesos estuvieran usando 400 MB en total. Sin embargo, debido a que fork() implementa copia en escritura (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 COW? ¿Hay alguna manera de que lo haga? ¿O hay otro comando que pueda usar en su lugar?
Nota: 'arriba' en OSX parece tener una columna RSHRD que hace lo que yo esperaría. Mi pregunta es para Linux.
Respuesta1
Puede obtener ese tipo de información del /proc/<pid>/smaps
archivo para cada proceso en el formulario de Pss
entrada (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 PSS para esa asignación, es decir, la memoria se distribuye uniformemente entre los procesos que la comparten (hasta que cualquiera de los procesos la copie y la deje de compartir).
Aquí hay un extracto de cómo 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 unalotede cosas en esos archivos, incluidas asignaciones para bibliotecas compartidas que potencialmente se comparten entre muchos procesos y, por lo tanto, cada proceso obtiene solo una pequeña parte contabilizada en su entrada PSS para ellos).
Aquí hay un buen artículo sobre esto: ELC:¿Cuánta memoria utilizan realmente las aplicaciones?
No conozco una herramienta común similar para mostrar esta información y, ps
lamentablemente, tampoco creo que tenga opciones para mostrarla. El artículo apunta a un repositorio con scripts de Python llamadopagemap
de Matt Mackall que podrías usar o adaptar.
Enchufe desvergonzado: encontrarás algunas publicaciones enUnix y Linuxsobre PSS y el smaps
archivo si estás interesado en eso.