¿Cómo medir la memoria sin páginas de copia en escritura?
8
¿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?
Pregunta muy interesante, +1: debería ser posible mediante un análisis más profundo de los /proc/*/maparchivos, 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.
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.
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.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:
fuente
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.
fuente