¿A qué escala o medida se adhiere la "presión de la memoria" de Mavericks y Yosemite?

El Monitor de actividad de Mavericks (y también de Yosemite) muestra un nuevo diagrama, la presión de la memoria . Lamentablemente, su texto de ayuda solo explica vagamente qué mide exactamente. ¿Cómo se calcula la presión de la memoria?

Monitor de actividad Mavericks - memoria

Los créditos de imagen van a esta respuesta de una pregunta de encuesta sobre la mejor característica nueva de Mavericks.

Respuestas (3)

La presión de la memoria no es un indicador simple del porcentaje de memoria libre y parece ser un gráfico de 0 a 100 %. El sysctlvalor de vm.memory_pressurese calcula en relación con un objetivo calculado que rastrea la relación entre las páginas de memoria libres e inactivas y las páginas conectadas y activas. Los contadores absolutos se visualizan mediante la vm_statherramienta de línea de comandos para inspeccionar la asignación detallada de la memoria virtual. Jonathan Levin tiene una excelente documentación en http://newosxbook.com/articles/MemoryPressure.html que cubre la memoria virtual de macOS e iOS y cómo calculan la presión de la memoria, así como las acciones que se toman cuando el índice de presión es alto.

Las memorias virtuales relevantes (vm) que alimentan el cálculo de vm.memory_pressureson:

  • vm.page_free_count- un recuento absoluto de páginas libres
  • vm.vm_page_free_target- un objetivo o meta calculado para una situación "sin presión"
  • vm.page_free_wanted- lo que el sistema vm quisiera liberar para aliviar el índice de presión calculado actual

Entonces, si está rastreando la presión de su memoria con el Monitor de actividad (o mi control de los valores de sysctl mediante programación o en el shell de la línea de comandos), haría bien en observar estos cuatro valores:

sysctl -a vm | egrep "page_free|pressure"

Hay un nuevo comando memory_pressureintroducido con Mavericks y cuando lo ejecuto para llevar el subsistema de memoria a un estado de advertencia, puede ver que la presión de la memoria aumenta en un rango amarillo.

resultados del monitor de actividad de <code>sudo memory_pression -l warn</code>

La herramienta asignó alrededor de 4 GB de memoria a la herramienta a medida que el gráfico de presión aumentaba constantemente hasta este estado donde aparentemente se representa el nivel de "advertencia": sudo memory_pressure -l warn. Como puede ver, el sistema antes de la presión usó 5,9 GB y después usó hasta 7,99 GB, lo que ni siquiera necesita sumar debido al intercambio y la compresión.

Después de ver cómo vm_stat 15mostró el resultado de advertencia en una paginación no medible, salí de la herramienta (Control-C) y luego volví a ejecutar la herramienta para hacer que la presión de la memoria sea crítica:sudo memory_pressure -l critical

No dejé que esto se ejecutara por más de unos minutos mientras comenzaba la paginación y una vez que la herramienta dijo que tenía 5 GB de RAM paginados en el disco, no quería llenar mi disco y salir de la herramienta.

resultados del monitor de actividad de <code>sudo memory_pression -l Critical</code>

Puede observar la rapidez con la que el sistema liberó RAM después de que finalizó la advertencia y también cómo pasó al territorio "rojo" para mostrar que el sistema de memoria virtual no pudo comprimir suficientes páginas para evitar el intercambio en el disco. Mi conjetura informada es que el rojo en la presión indica intercambio y una sobreasignación dramática y/o un momento en el que las páginas gratuitas están por debajo de la cantidad que el sistema prefiere y está purgando activamente las páginas inactivas y/o las páginas de intercambio que se espera que se usen para intercambiar. De manera similar, el sistema se recupera rápidamente una vez que se liberan las asignaciones y se elimina la presión del sistema de memoria virtual.

Gracias por la aclaración. Me gustaría saber si hay un comando (o un conjunto de comandos) que calcule los parámetros de memoria virtual, caché de archivos y memoria de la aplicación en la captura de pantalla anterior.
@MuhammadHassan La respuesta a continuación cubre un buen resumen de ingeniería inversa del algoritmo y señala dónde buscar en xnucódigo abierto para las partes internas. He sacado los 4 valores cubiertos que son más relevantes para la visualización de presión de la GUI.
El gráfico de presión de la memoria es, con mucho, la fuente de información más simple e indicativa sobre el estado de la memoria en mi humilde opinión. Mi suposición es que la fórmula detrás del gráfico es bastante compleja y requiere muchos recursos para calcular, pero tal vez sea posible encontrar una versión simplificada que sería 'lo suficientemente buena' en la mayoría de los casos, por ejemplo, para ejecutarse constantemente en segundo plano para monitorear una carga del servidor macos.

Para aclarar un poco y hacer que la suposición sea más precisa: la presión de la memoria es una métrica utilizada por el kernel (xnu) con un subproceso dedicado llamado memory_status (anteriormente conocido como Jetsam). Este subproceso es responsable de detectar cuándo la RAM disponible es baja, lo que en OS X puede forzar el intercambio, y en iOS elimina la aplicación que consume más memoria (ya que no hay intercambio). En Mavericks, los dos sistemas operativos están más juntos. Memorystatus emite una nota del kernel, que el tiempo de ejecución de Obj-C finalmente traduce a una appDidReceiveLowMemoryWarning. Se supone que las aplicaciones purgan la memoria no utilizada o superflua (por ejemplo, cachés). La libC de Darwin también purga la memoria automáticamente.

Hay una llamada de sistema específica (aunque no documentada), vm_pression_monitor (n.º 296, si no recuerdo mal), que permite a un cliente escuchar eventos de presión y ver cuántas páginas físicas se pueden recuperar.

Puede ver eventos de presión en Mavericks utilizando Process Explorer para OS X, descargable desde http://newosxbook.com/index.php?page=downloads . Eso le muestra el "indicador" de presión, así como los eventos de presión.

Ese sitio web también tiene un artículo detallado, newosxbook.com/articles/MemoryPressure.html , que detalla la presión y el manejo de la memoria en OS X e iOS.
Impresionante detalle sobre las similitudes y diferencias entre Mavericks y el kernel de iOS. Gracias por el enlace a Process Explorer.

La presión de la memoria se define mediante dos contadores que Mach mantiene internamente:

  • vm_page_free_count: ¿Cuántas páginas de RAM están actualmente libres?
  • vm_page_free_target: Cuántas páginas de RAM, como mínimo, deberían estar libres de manera óptima.

Puede verlos fácilmente usando sysctl:

morpheus@Zephyr (~/Documents) % sysctl -a vm | grep page_free
vm.vm_page_free_target: 2000
vm.page_free_wanted: 0
vm.page_free_count: 73243

si la cantidad de páginas gratuitas cae por debajo de la cantidad objetivo, tenemos una situación de presión.


De http://newosxbook.com/articles/MemoryPressure.html