¿Cómo se puede medir la memoria RSS total ocupada por un conjunto de procesos (bifurcados), sin contar dos veces las páginas compartidas y de copia en escritura?
¿Cómo se puede medir la memoria RSS total ocupada por un conjunto de procesos (bifurcados), sin contar dos veces las páginas compartidas y de copia en escritura?
Respuestas:
Terminé escribiendo mi propia utilidad para esto: https://gist.github.com/Eugeny/04ccfe8accf4bc74b0ca
Lo ejecuté contra init
(pid 1) para probar y el total reportado es más o menos igual al uso físico de RAM (según htop), así que supongo que es algo correcto.
Ejemplo de uso:
~ » pstree -ap 15897
zsh,15897
└─sudo,9783 make rundev
└─make,9784 rundev
└─sh,9785 -c cd ajenti-panel && ./ajenti-panel -v --autologin --plugins ../plugins --dev
└─python ./ajenti,9786
├─./ajenti-panel ,9834
├─./ajenti-panel ,9795
└─{python ./ajenti},9796
~ » sudo ./memuse.py 15897
PID Commandline Frames (+unique) VMEM
- 15897 (/usr/bin/zsh ): 1776 +1776 7104 KB
- 9783 (sudo make rundev ): 608 +408 2432 KB
- 9784 (make rundev ): 261 +98 1044 KB
- 9785 (/bin/sh -c cd ajenti-panel && ): 166 +48 664 KB
- 9786 (python ./ajenti-panel -v --aut): 9279 +8977 37116 KB
- 9795 (./ajenti-panel worker [restric): 7637 +1334 30548 KB
- 9834 (./ajenti-panel worker [session): 8972 +2639 35888 KB
----------------------------------------------------------------------------------------
TOTAL: 15280 61120 KB
No existe una forma claramente definida de determinar en ninguna herramienta que conozca qué procesos comparten qué mapas sin iterar a través de todas las asignaciones y comparar direcciones.
Sin embargo, Linux ofrece una estimación razonable conocida como el tamaño del conjunto proporcional . Esto se informa en / proc / [pid]> / maps.
Este valor es el tamaño del mapeo dividido por el número de procesos hermanos / padres con el mismo mapeo abierto.
Entonces, con un programa que tiene una asignación de 1MiB abierta, más un 1MiB compartido con otros 4 procesos, el tamaño del conjunto proporcional es 1MiB + (1Mib / 4) o 1.250 MiB. El RSS en este caso sería de 2MiB.
Hay un parche para htop flotante que usará el PSS para calcular una 'buena estimación' de la memoria real en uso.
/proc/*/map
archivos, a pesar de que nunca encontré una herramienta que pudiera hacer eso. El principal problema es que las estructuras de datos a seguir son mucho más complejas como parecen. Si no obtienes una buena respuesta aquí, quizás también puedas probar unix SE.