Solución:
Hay casos en los que mirar la memoria inactiva es interesante, una alta proporción de memoria activa e inactiva puede indicar presión de memoria, por ejemplo, pero esa condición suele ir acompañada de paginación / intercambio que es más fácil de entender y observar. El archivo /proc/kpageflags
contiene un mapa de bits de 64 bits para cada página de memoria física, puede obtener un resumen con page-types
que puede venir con su kernel.
Tu comprensión de activo y inactivo es incorrecto sin embargo
- memoria activa son páginas a las que se ha accedido “recientemente”
- memoria inactiva son páginas a las que no se ha accedido “recientemente”
“recientemente” no es una medida absoluta de tiempo, sino que también depende de la actividad y la presión de la memoria (puede leer algunos de los detalles técnicos en el libro gratuito Comprensión del Administrador de memoria virtual de Linux, El Capítulo 10 es relevante aquí), o la documentación del kernel (pagemap.txt).
Cada lista se almacena como un LRU (más o menos). Las páginas de memoria inactiva son buenas candidatas para escribir en el archivo de intercambio, ya sea de forma preventiva (antes de que se requieran páginas de memoria libre) o cuando la memoria libre cae por debajo de un límite configurado y se necesitan (inminentemente) páginas libres.
Cualquiera de los dos indicadores se aplica a las páginas asignadas a los procesos en ejecución, con la excepción de la memoria persistente o compartida, toda la memoria se libera cuando un proceso sale; de lo contrario, se consideraría un error.
Esta marcación de página de bajo nivel no necesita conocer el PID (y una página de memoria puede tener más de un PID mapeado en cualquier caso), por lo que la información requerida para proporcionar los datos que solicita no está en un solo lugar.
Para hacer esto por proceso, necesita extraer los rangos de direcciones virtuales de /prod/PID/maps
, convertir a PFN (página física) con /proc/PID/pagemap
e indexar en /proc/kpageflags
. Todo esta descrito en pagemap.txt
, y toma alrededor de 60-80 líneas de C. A menos que esté solucionando problemas del sistema VM, los números no son muy interesantes. Una cosa que podría hacer es contar las páginas inactivas y respaldadas por intercambio por proceso, estos números deben indicar los procesos que tienen un tamaño RSS (residente) bajo en comparación con VSZ (tamaño total de VM). Otra cosa podría ser inferir una fuga de memoria, pero existen mejores herramientas para esa tarea.
No existe tal herramienta, ya que es completamente inútil para cualquier programa externo.
La única parte del sistema que necesita saber eso es el controlador de memoria del kernel, que lo usará para saber qué paginar (intercambiar) si se queda sin memoria disponible.
El único caso relacionado que podría causar alguna preocupación es si su intercambio está casi lleno. Si ese alguna vez llega a ser el caso, simplemente auméntelo.
Nunca he visto problemas reales que impliquen investigar sobre la memoria inactiva.